From fcbd3d72fb353150013e21868e01e59ccd5b6ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=83=81=EC=9A=B0=28Roy=29?= Date: Mon, 30 Jan 2023 10:47:43 +0900 Subject: [PATCH 01/98] Speficy RUN location for installing mkdocs dependencies. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 나상우(Roy) --- docs/features/techdocs/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/techdocs/getting-started.md b/docs/features/techdocs/getting-started.md index c2070e7840..e91a3e5c11 100644 --- a/docs/features/techdocs/getting-started.md +++ b/docs/features/techdocs/getting-started.md @@ -262,7 +262,7 @@ You will have to install the `mkdocs` and `mkdocs-techdocs-core` package from pip, as well as `graphviz` and `plantuml` from your OS package manager (e.g. apt). -You can do so by including the following lines in the last step of your +You can do so by including the following lines right above `USER node` of your `Dockerfile`: ```Dockerfile From db77ab2869023c5e78403616ab7b8b9d6661913a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=83=81=EC=9A=B0=28Roy=29?= Date: Mon, 30 Jan 2023 10:58:18 +0900 Subject: [PATCH 02/98] Update version of mkdocs-techdocs-core to most recent version. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 나상우(Roy) --- docs/features/techdocs/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/techdocs/getting-started.md b/docs/features/techdocs/getting-started.md index e91a3e5c11..578a631798 100644 --- a/docs/features/techdocs/getting-started.md +++ b/docs/features/techdocs/getting-started.md @@ -267,7 +267,7 @@ You can do so by including the following lines right above `USER node` of your ```Dockerfile RUN apt-get update && apt-get install -y python3 python3-pip -RUN pip3 install mkdocs-techdocs-core==1.0.1 +RUN pip3 install mkdocs-techdocs-core==1.1.7 ``` Please be aware that the version requirement could change, you need to check our From d34b3267f9628b1ec7678083e40b0e885c714d4b Mon Sep 17 00:00:00 2001 From: ivgo Date: Mon, 30 Jan 2023 16:13:35 +0100 Subject: [PATCH 03/98] Entity Validation UI Signed-off-by: ivgo --- .changeset/silly-socks-lie.md | 5 + plugins/entity-validation/.eslintrc.js | 1 + plugins/entity-validation/README.md | 51 ++++++ plugins/entity-validation/api-report.md | 30 ++++ plugins/entity-validation/dev/index.tsx | 27 +++ plugins/entity-validation/package.json | 63 +++++++ .../EntityTextArea/EntityTextArea.tsx | 97 +++++++++++ .../src/components/EntityTextArea/index.ts | 16 ++ .../EntityValidationOutput/EntityResult.tsx | 107 ++++++++++++ .../EntityValidationOutput.tsx | 162 ++++++++++++++++++ .../EntityValidationOutput/index.ts | 17 ++ .../EntityValidationPage.tsx | 117 +++++++++++++ .../components/EntityValidationPage/index.ts | 16 ++ plugins/entity-validation/src/index.ts | 16 ++ plugins/entity-validation/src/plugin.test.ts | 22 +++ plugins/entity-validation/src/plugin.ts | 42 +++++ plugins/entity-validation/src/routes.ts | 20 +++ plugins/entity-validation/src/setupTests.ts | 17 ++ plugins/entity-validation/src/types.ts | 30 ++++ plugins/entity-validation/src/utils/index.ts | 16 ++ plugins/entity-validation/src/utils/utils.ts | 58 +++++++ yarn.lock | 38 ++++ 22 files changed, 968 insertions(+) create mode 100644 .changeset/silly-socks-lie.md create mode 100644 plugins/entity-validation/.eslintrc.js create mode 100644 plugins/entity-validation/README.md create mode 100644 plugins/entity-validation/api-report.md create mode 100644 plugins/entity-validation/dev/index.tsx create mode 100644 plugins/entity-validation/package.json create mode 100644 plugins/entity-validation/src/components/EntityTextArea/EntityTextArea.tsx create mode 100644 plugins/entity-validation/src/components/EntityTextArea/index.ts create mode 100644 plugins/entity-validation/src/components/EntityValidationOutput/EntityResult.tsx create mode 100644 plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx create mode 100644 plugins/entity-validation/src/components/EntityValidationOutput/index.ts create mode 100644 plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx create mode 100644 plugins/entity-validation/src/components/EntityValidationPage/index.ts create mode 100644 plugins/entity-validation/src/index.ts create mode 100644 plugins/entity-validation/src/plugin.test.ts create mode 100644 plugins/entity-validation/src/plugin.ts create mode 100644 plugins/entity-validation/src/routes.ts create mode 100644 plugins/entity-validation/src/setupTests.ts create mode 100644 plugins/entity-validation/src/types.ts create mode 100644 plugins/entity-validation/src/utils/index.ts create mode 100644 plugins/entity-validation/src/utils/utils.ts diff --git a/.changeset/silly-socks-lie.md b/.changeset/silly-socks-lie.md new file mode 100644 index 0000000000..ae7e1c0b2a --- /dev/null +++ b/.changeset/silly-socks-lie.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-entity-validation': minor +--- + +First implementation for the entity validation UI. For more information refer to its `README.md`. diff --git a/plugins/entity-validation/.eslintrc.js b/plugins/entity-validation/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/entity-validation/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/entity-validation/README.md b/plugins/entity-validation/README.md new file mode 100644 index 0000000000..0e80ebd29b --- /dev/null +++ b/plugins/entity-validation/README.md @@ -0,0 +1,51 @@ +# entity-validation + +This plugin creates a new page in Backstage where the user can validate the entities. + +## Getting started + +First of all, install the package in the `app` package by running the following command: + +```bash +yarn add --cwd packages/app @backstage/plugin-entity-validation +``` + +Add the new route to the app by adding the following line: + +```typescript +// In packages/app/src/App.tsx +import { EntityValidationPage } from '@backstage/plugin-entity-validation'; + +const routes = ( + + {/* ...other routes */} + } /> + +); +``` + +To add the new page to your sidebar, you must include these lines in your `Root.tsx` file: + +```typescript + // In packages/app/src/components/Root/Root.tsx + import BuildIcon from '@material-ui/icons/Build'; + + ... + + export const Root = ({ children }: PropsWithChildren<{}>) => ( + + + {/* ...other elements */} + }> + {/* Global nav, not org-specific */} + {/* ...other sidebars */} + + {/* End global nav */} + + + {/* ...other elements */} + + {children} + + ); +``` diff --git a/plugins/entity-validation/api-report.md b/plugins/entity-validation/api-report.md new file mode 100644 index 0000000000..1a3b92a7c1 --- /dev/null +++ b/plugins/entity-validation/api-report.md @@ -0,0 +1,30 @@ +## API Report File for "@backstage/plugin-entity-validation" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { RouteRef } from '@backstage/core-plugin-api'; + +// @public (undocumented) +export const EntityValidationPage: ({ + defaultPreviewCatalog, + locationPlaceholder, +}: { + defaultPreviewCatalog?: string | undefined; + locationPlaceholder?: string | undefined; +}) => JSX.Element; + +// @public (undocumented) +export const entityValidationPlugin: BackstagePlugin< + { + root: RouteRef; + }, + {}, + {} +>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/entity-validation/dev/index.tsx b/plugins/entity-validation/dev/index.tsx new file mode 100644 index 0000000000..1e1dfa760c --- /dev/null +++ b/plugins/entity-validation/dev/index.tsx @@ -0,0 +1,27 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { createDevApp } from '@backstage/dev-utils'; +import { entityValidationPlugin, EntityValidationPage } from '../src/plugin'; + +createDevApp() + .registerPlugin(entityValidationPlugin) + .addPage({ + element: , + title: 'Root Page', + path: '/entity-validation', + }) + .render(); diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json new file mode 100644 index 0000000000..fa0c132e67 --- /dev/null +++ b/plugins/entity-validation/package.json @@ -0,0 +1,63 @@ +{ + "name": "@backstage/plugin-entity-validation", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/catalog-client": "workspace:^", + "@backstage/catalog-model": "workspace:^", + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", + "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/theme": "workspace:^", + "@codemirror/language": "^6.0.0", + "@codemirror/legacy-modes": "^6.1.0", + "@codemirror/view": "^6.0.0", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.57", + "@react-hookz/web": "^20.0.0", + "@uiw/react-codemirror": "^4.9.3", + "lodash": "^4.17.21", + "react-use": "^17.2.4", + "yaml": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/dev-utils": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "@types/node": "*", + "cross-fetch": "^3.1.5", + "msw": "^0.49.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/entity-validation/src/components/EntityTextArea/EntityTextArea.tsx b/plugins/entity-validation/src/components/EntityTextArea/EntityTextArea.tsx new file mode 100644 index 0000000000..c39f8d5ed7 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityTextArea/EntityTextArea.tsx @@ -0,0 +1,97 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useMemo, useState } from 'react'; +import { Box, makeStyles } from '@material-ui/core'; +import CodeMirror from '@uiw/react-codemirror'; +import { showPanel } from '@codemirror/view'; +import { StreamLanguage } from '@codemirror/language'; +import { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml'; +import { useKeyboardEvent } from '@react-hookz/web'; + +const useStyles = makeStyles(theme => ({ + container: { + position: 'relative', + width: '100%', + height: '100%', + minHeight: '400px', + }, + codeMirror: { + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0, + }, + infoPanel: { + color: theme.palette.info.main, + lineHeight: 2, + margin: theme.spacing(0, 1), + }, +})); + +type TemplateTextAreaProps = { + catalogYaml: string; + onChange: (value: string) => void; + onValidate: () => void; +}; + +export const EntityTextArea = ({ + catalogYaml, + onChange, + onValidate, +}: TemplateTextAreaProps) => { + const classes = useStyles(); + const [close, setClose] = useState(false); + + const panelExtension = useMemo(() => { + if (close) { + return showPanel.of(null); + } + + const dom = document.createElement('div'); + dom.classList.add(classes.infoPanel); + dom.textContent = + 'To validate your catalog-info.yaml click on the "Validate" button or use "Ctrl + S" or "Ctrl + Enter"'; + dom.onclick = () => setClose(true); + return showPanel.of(() => ({ dom, top: true })); + }, [classes, close]); + + // Triggers a validation when Ctrl+S or Ctrl+Enter instead of default behavior + useKeyboardEvent( + e => (e.key === 's' || e.key === 'Enter') && (e.ctrlKey || e.metaKey), + e => { + e.preventDefault(); + onValidate(); + }, + ); + + return ( + + { + // Prevent new line if Ctrl + Enter was clicked + if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) e.preventDefault(); + }} + /> + + ); +}; diff --git a/plugins/entity-validation/src/components/EntityTextArea/index.ts b/plugins/entity-validation/src/components/EntityTextArea/index.ts new file mode 100644 index 0000000000..d2a5e41d0f --- /dev/null +++ b/plugins/entity-validation/src/components/EntityTextArea/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './EntityTextArea'; diff --git a/plugins/entity-validation/src/components/EntityValidationOutput/EntityResult.tsx b/plugins/entity-validation/src/components/EntityValidationOutput/EntityResult.tsx new file mode 100644 index 0000000000..85d47fa2c2 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityValidationOutput/EntityResult.tsx @@ -0,0 +1,107 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useState } from 'react'; +import { ValidateEntityResponse } from '@backstage/catalog-client'; +import { useApp } from '@backstage/core-plugin-api'; +import { + Collapse, + IconButton, + ListItem, + ListItemIcon, + ListItemSecondaryAction, + ListItemText, + makeStyles, + Paper, +} from '@material-ui/core'; +import { humanizeEntityRef } from '@backstage/plugin-catalog-react'; +import WorkIcon from '@material-ui/icons/Work'; +import ExpandLessIcon from '@material-ui/icons/ExpandLess'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import { MarkdownContent } from '@backstage/core-components'; +import { ValidationOutputOk } from '../../types'; + +const useStyles = makeStyles(theme => ({ + validationOk: { + color: theme.palette.success.main, + }, + validationNotOk: { + color: theme.palette.error.main, + }, + errorContainer: { + color: theme.palette.error.main, + background: theme.palette.background.paper, + padding: theme.spacing(2), + }, +})); + +type EntityResultProps = { + isFirstError?: boolean; + item: ValidationOutputOk; +}; + +export const EntityResult = ({ + isFirstError = false, + item, +}: EntityResultProps) => { + const classes = useStyles(); + const app = useApp(); + const [expanded, setExpanded] = useState(isFirstError); + + const Icon = + app.getSystemIcon(`kind:${item.entity.kind.toLocaleLowerCase('en-US')}`) ?? + WorkIcon; + + const fetchErrorMessages = (response: ValidateEntityResponse) => { + if (!response.valid) { + return response.errors.map(err => err.message).join('\n\n'); + } + return ''; + }; + + return ( + <> + + + + + setExpanded(!expanded)} + /> + {!item.response.valid && ( + + setExpanded(!expanded)}> + {expanded ? : } + + + )} + + {!item.response.valid && ( + + + + + + )} + + ); +}; diff --git a/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx b/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx new file mode 100644 index 0000000000..f58fc90559 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx @@ -0,0 +1,162 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { identityApiRef, useApi } from '@backstage/core-plugin-api'; +import { CatalogProcessorResult } from '@backstage/plugin-catalog-node'; +import { + catalogApiRef, + humanizeEntityRef, +} from '@backstage/plugin-catalog-react'; +import { List, makeStyles, Typography } from '@material-ui/core'; +import useAsync from 'react-use/lib/useAsync'; +import { InfoCard, Progress } from '@backstage/core-components'; +import Alert from '@material-ui/lab/Alert'; +import { + ValidationOutput, + ValidationOutputError, + ValidationOutputOk, +} from '../../types'; +import { EntityResult } from './EntityResult'; + +const useStyles = makeStyles(theme => ({ + validationOk: { + color: theme.palette.success.main, + }, + validationNotOk: { + color: theme.palette.error.main, + }, +})); + +function sortResults(items: Array) { + return items.sort((a, b) => + humanizeEntityRef(a.entity).localeCompare(humanizeEntityRef(b.entity)), + ); +} + +type EntityValidationOutputProps = { + processorResults?: CatalogProcessorResult[]; + locationUrl: string; +}; + +export const EntityValidationOutput = ({ + processorResults, + locationUrl, +}: EntityValidationOutputProps) => { + const classes = useStyles(); + const catalogApi = useApi(catalogApiRef); + const identityApi = useApi(identityApiRef); + + const { value = [], loading } = useAsync(async (): Promise< + ValidationOutput[] | undefined + > => { + if (!processorResults) { + return undefined; + } + + const location = locationUrl + ? `url:${locationUrl}` + : 'url:http://localhost'; + + return await Promise.all( + processorResults.map(async item => { + if (item.type === 'entity') { + const { token } = await identityApi.getCredentials(); + + const validateResult = await catalogApi.validateEntity( + item.entity, + location, + { + token, + }, + ); + return { + type: 'valid', + entity: item.entity, + response: validateResult, + }; + } else if (item.type === 'error') { + return { + type: 'error', + processingError: `Malformed entity YAML, ${item.error}`, + }; + } + return { + type: 'error', + processingError: `Internal error, failed to parse entity`, + }; + }), + ); + }, [processorResults]); + + if (loading) { + return ; + } + + const errors = value.filter( + v => v.type === 'error', + ) as ValidationOutputError[]; + + const results = sortResults( + value.filter(v => v.type === 'valid') as ValidationOutputOk[], + ); + // If there are any errors, only the first one will be expanded + const firstErrorIndex = results.findIndex(r => !r.response.valid); + + if (errors.length !== 0) { + return ( + <> + {errors.map(err => ( + {err.processingError} + ))} + + ); + } + + return ( + + {results.length === 0 ? ( +
+ + No entity definitions found or validated yet + +
+ ) : ( + <> + + {results.map((item, key) => ( + + ))} + +
+ {results.every(r => r.response.valid) ? ( + + All the entities are valid! + + ) : ( + + One or more entities have validation errors + + )} +
+ + )} +
+ ); +}; diff --git a/plugins/entity-validation/src/components/EntityValidationOutput/index.ts b/plugins/entity-validation/src/components/EntityValidationOutput/index.ts new file mode 100644 index 0000000000..8d327581c6 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityValidationOutput/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './EntityValidationOutput'; +export * from './EntityResult'; diff --git a/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx new file mode 100644 index 0000000000..d39b234342 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx @@ -0,0 +1,117 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useState } from 'react'; +import { Button, Content, Header, Page } from '@backstage/core-components'; +import { EntityTextArea } from '../EntityTextArea'; +import { Grid, TextField } from '@material-ui/core'; +import { CatalogProcessorResult } from '@backstage/plugin-catalog-node'; +import { parseEntityYaml } from '../../utils'; +import { EntityValidationOutput } from '../EntityValidationOutput'; + +const EXAMPLE_CATALOG_INFO_YAML = `# Put your catalog-info.yaml below and validate it +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: test + description: Component description + links: [] + tags: [] + annotations: {} +spec: + type: service + lifecycle: experimental + owner: owner +`; + +export const EntityValidationPage = ({ + defaultPreviewCatalog = EXAMPLE_CATALOG_INFO_YAML, + locationPlaceholder = 'https://github.com/backstage/backstage/blob/master/catalog-info.yaml', +}: { + defaultPreviewCatalog?: string; + locationPlaceholder?: string; +}) => { + const [catalogYaml, setCatalogYaml] = useState(defaultPreviewCatalog); + const [yamlFiles, setYamlFiles] = useState(); + const [locationUrl, setLocationUrl] = useState(''); + + const parseYaml = () => { + const parsedFiles = [ + ...parseEntityYaml(Buffer.from(catalogYaml), { + type: 'url', + target: locationUrl ? locationUrl : 'http://localhost', + }), + ]; + setYamlFiles(parsedFiles); + }; + + return ( + +
+ + + + setLocationUrl(e.target.value)} + /> + + + + + + + + + + + + setCatalogYaml(value)} + catalogYaml={catalogYaml} + /> + + + + + + + + + + + + ); +}; diff --git a/plugins/entity-validation/src/components/EntityValidationPage/index.ts b/plugins/entity-validation/src/components/EntityValidationPage/index.ts new file mode 100644 index 0000000000..24149a9387 --- /dev/null +++ b/plugins/entity-validation/src/components/EntityValidationPage/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './EntityValidationPage'; diff --git a/plugins/entity-validation/src/index.ts b/plugins/entity-validation/src/index.ts new file mode 100644 index 0000000000..33ae575dfe --- /dev/null +++ b/plugins/entity-validation/src/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { entityValidationPlugin, EntityValidationPage } from './plugin'; diff --git a/plugins/entity-validation/src/plugin.test.ts b/plugins/entity-validation/src/plugin.test.ts new file mode 100644 index 0000000000..eae69e8d3a --- /dev/null +++ b/plugins/entity-validation/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { entityValidationPlugin } from './plugin'; + +describe('entity-validation', () => { + it('should export plugin', () => { + expect(entityValidationPlugin).toBeDefined(); + }); +}); diff --git a/plugins/entity-validation/src/plugin.ts b/plugins/entity-validation/src/plugin.ts new file mode 100644 index 0000000000..9a3014da28 --- /dev/null +++ b/plugins/entity-validation/src/plugin.ts @@ -0,0 +1,42 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createComponentExtension, + createPlugin, +} from '@backstage/core-plugin-api'; + +import { rootRouteRef } from './routes'; + +/** @public */ +export const entityValidationPlugin = createPlugin({ + id: 'entity-validation', + routes: { + root: rootRouteRef, + }, +}); + +/** @public */ +export const EntityValidationPage = entityValidationPlugin.provide( + createComponentExtension({ + name: 'EntityValidationPage', + component: { + lazy: () => + import('./components/EntityValidationPage').then( + m => m.EntityValidationPage, + ), + }, + }), +); diff --git a/plugins/entity-validation/src/routes.ts b/plugins/entity-validation/src/routes.ts new file mode 100644 index 0000000000..8cdc138782 --- /dev/null +++ b/plugins/entity-validation/src/routes.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createRouteRef } from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'entity-validation', +}); diff --git a/plugins/entity-validation/src/setupTests.ts b/plugins/entity-validation/src/setupTests.ts new file mode 100644 index 0000000000..73dd8dce47 --- /dev/null +++ b/plugins/entity-validation/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; +import 'cross-fetch/polyfill'; diff --git a/plugins/entity-validation/src/types.ts b/plugins/entity-validation/src/types.ts new file mode 100644 index 0000000000..69caf79e33 --- /dev/null +++ b/plugins/entity-validation/src/types.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Entity } from '@backstage/catalog-model'; +import { ValidateEntityResponse } from '@backstage/catalog-client'; + +export type ValidationOutputError = { + type: 'error'; + processingError: string; +}; + +export type ValidationOutputOk = { + type: 'valid'; + entity: Entity; + response: ValidateEntityResponse; +}; + +export type ValidationOutput = ValidationOutputOk | ValidationOutputError; diff --git a/plugins/entity-validation/src/utils/index.ts b/plugins/entity-validation/src/utils/index.ts new file mode 100644 index 0000000000..8d45a67a36 --- /dev/null +++ b/plugins/entity-validation/src/utils/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './utils'; diff --git a/plugins/entity-validation/src/utils/utils.ts b/plugins/entity-validation/src/utils/utils.ts new file mode 100644 index 0000000000..dde50d2f9c --- /dev/null +++ b/plugins/entity-validation/src/utils/utils.ts @@ -0,0 +1,58 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Entity, stringifyLocationRef } from '@backstage/catalog-model'; +import lodash from 'lodash'; +import yaml from 'yaml'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; +import { + CatalogProcessorResult, + processingResult, +} from '@backstage/plugin-catalog-node'; + +// Copy from: https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/src/modules/util/parse.ts +export function* parseEntityYaml( + data: Buffer, + location: LocationSpec, +): Iterable { + let documents: yaml.Document.Parsed[]; + try { + documents = yaml.parseAllDocuments(data.toString('utf8')).filter(d => d); + } catch (e) { + const loc = stringifyLocationRef(location); + const message = `Failed to parse YAML at ${loc}, ${e}`; + yield processingResult.generalError(location, message); + return; + } + + for (const document of documents) { + if (document.errors?.length) { + const loc = stringifyLocationRef(location); + const message = `YAML error at ${loc}, ${document.errors[0]}`; + yield processingResult.generalError(location, message); + } else { + const json = document.toJSON(); + if (lodash.isPlainObject(json)) { + yield processingResult.entity(location, json as Entity); + } else if (json === null) { + // Ignore null values, these happen if there is an empty document in the + // YAML file, for example if --- is added to the end of the file. + } else { + const message = `Expected object at root, got ${typeof json}`; + yield processingResult.generalError(location, message); + } + } + } +} diff --git a/yarn.lock b/yarn.lock index f68a2d20d0..a3e9612ca6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5759,6 +5759,44 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-entity-validation@workspace:plugins/entity-validation": + version: 0.0.0-use.local + resolution: "@backstage/plugin-entity-validation@workspace:plugins/entity-validation" + dependencies: + "@backstage/catalog-client": "workspace:^" + "@backstage/catalog-model": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/dev-utils": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" + "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/theme": "workspace:^" + "@codemirror/language": ^6.0.0 + "@codemirror/legacy-modes": ^6.1.0 + "@codemirror/view": ^6.0.0 + "@material-ui/core": ^4.12.2 + "@material-ui/icons": ^4.9.1 + "@material-ui/lab": ^4.0.0-alpha.57 + "@react-hookz/web": ^20.0.0 + "@testing-library/jest-dom": ^5.10.1 + "@testing-library/react": ^12.1.3 + "@testing-library/user-event": ^14.0.0 + "@types/node": "*" + "@uiw/react-codemirror": ^4.9.3 + cross-fetch: ^3.1.5 + lodash: ^4.17.21 + msw: ^0.49.0 + react-use: ^17.2.4 + yaml: ^2.0.0 + peerDependencies: + react: ^16.13.1 || ^17.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-events-backend-module-aws-sqs@workspace:plugins/events-backend-module-aws-sqs": version: 0.0.0-use.local resolution: "@backstage/plugin-events-backend-module-aws-sqs@workspace:plugins/events-backend-module-aws-sqs" From f92679c3c0eb85ae878ce5638c70dc40519a5a55 Mon Sep 17 00:00:00 2001 From: ivgo Date: Thu, 2 Feb 2023 14:08:50 +0100 Subject: [PATCH 04/98] Add screenshot to README.md & missing repository information in package.json Signed-off-by: ivgo --- plugins/entity-validation/README.md | 2 ++ .../docs/entity-validation.png | Bin 0 -> 93063 bytes plugins/entity-validation/package.json | 5 +++++ 3 files changed, 7 insertions(+) create mode 100644 plugins/entity-validation/docs/entity-validation.png diff --git a/plugins/entity-validation/README.md b/plugins/entity-validation/README.md index 0e80ebd29b..1f864d0857 100644 --- a/plugins/entity-validation/README.md +++ b/plugins/entity-validation/README.md @@ -2,6 +2,8 @@ This plugin creates a new page in Backstage where the user can validate the entities. +![Entity Validation](./docs/entity-validation.png) + ## Getting started First of all, install the package in the `app` package by running the following command: diff --git a/plugins/entity-validation/docs/entity-validation.png b/plugins/entity-validation/docs/entity-validation.png new file mode 100644 index 0000000000000000000000000000000000000000..00cb5fafe06667d93ce2e7f1f60165eb76815926 GIT binary patch literal 93063 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

_*Tp2!C!Fp2u6iZ!o6_lV}-5G1HrNHpz4?HEh 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 Date: Sat, 4 Feb 2023 08:05:02 -0500 Subject: [PATCH 05/98] improve Vault plugin error messaging This seeks to address issue #16176 by improving the error messaging surfaced to the UI with the Vault plugin encounters non-successful HTTP responses from the Vault API. Signed-off-by: Mike Ball --- plugins/vault/src/api.test.ts | 22 +++++- plugins/vault/src/api.ts | 6 +- .../EntityVaultTable.test.tsx | 69 ++++++++++--------- .../EntityVaultTable/EntityVaultTable.tsx | 7 +- 4 files changed, 64 insertions(+), 40 deletions(-) diff --git a/plugins/vault/src/api.test.ts b/plugins/vault/src/api.test.ts index 4ce6f95c41..471cadc87e 100644 --- a/plugins/vault/src/api.test.ts +++ b/plugins/vault/src/api.test.ts @@ -50,8 +50,10 @@ describe('api', () => { const { path } = req.params; if (path === 'test/success') { return res(ctx.json(mockSecretsResult)); - } else if (path === 'test/error') { + } else if (path === 'test/empty') { return res(ctx.json({ items: [] })); + } else if (path === 'test/not-found') { + return res(ctx.status(404)); } return res(ctx.status(400)); }), @@ -72,7 +74,7 @@ describe('api', () => { it('should return empty secret list', async () => { setupHandlers(); const api = new VaultClient({ discoveryApi }); - expect(await api.listSecrets('test/error')).toEqual([]); + expect(await api.listSecrets('test/empty')).toEqual([]); }); it('should return all the secrets if no path defined', async () => { @@ -80,4 +82,20 @@ describe('api', () => { const api = new VaultClient({ discoveryApi }); expect(await api.listSecrets('')).toEqual(mockSecretsResult.items); }); + + it('should throw an error if the Vault API responds with an HTTP 404', async () => { + setupHandlers(); + const api = new VaultClient({ discoveryApi }); + await expect(api.listSecrets('test/not-found')).rejects.toThrow( + "No secrets found in path 'v1/secrets/test%2Fnot-found'", + ); + }); + + it('should throw an error if the Vault API responds with a non-successful HTTP status code', async () => { + setupHandlers(); + const api = new VaultClient({ discoveryApi }); + await expect(api.listSecrets('test/error')).rejects.toThrow( + 'Request failed with 400 Error', + ); + }); }); diff --git a/plugins/vault/src/api.ts b/plugins/vault/src/api.ts index bdd881e08c..84843c9176 100644 --- a/plugins/vault/src/api.ts +++ b/plugins/vault/src/api.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { DiscoveryApi, createApiRef } from '@backstage/core-plugin-api'; -import { NotFoundError } from '@backstage/errors'; +import { NotFoundError, ResponseError } from '@backstage/errors'; /** * @public @@ -75,9 +75,7 @@ export class VaultClient implements VaultApi { } else if (response.status === 404) { throw new NotFoundError(`No secrets found in path '${path}'`); } - throw new Error( - `Unexpected error while fetching secrets from path '${path}'`, - ); + throw await ResponseError.fromResponse(response); } async listSecrets(secretPath: string): Promise { diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx index 82a90f23e1..27cc0ed91e 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx @@ -33,40 +33,28 @@ describe('EntityVaultTable', () => { let apis: TestApiRegistry; const mockBaseUrl = 'https://api-vault.com/api/vault'; const discoveryApi = UrlPatternDiscovery.compile(mockBaseUrl); - - const entityOk: ComponentEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'test', - description: 'This is the description', - annotations: { - 'vault.io/secrets-path': 'test/success', + const entity = (secretPath: string) => { + return { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'test', + description: 'This is the description', + annotations: { + 'vault.io/secrets-path': secretPath, + }, }, - }, - spec: { - lifecycle: 'production', - owner: 'owner', - type: 'service', - }, + spec: { + lifecycle: 'production', + owner: 'owner', + type: 'service', + }, + } as ComponentEntity; }; - const entityNotOk: ComponentEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'test', - description: 'This is the description', - annotations: { - 'vault.io/secrets-path': 'test/error', - }, - }, - spec: { - lifecycle: 'production', - owner: 'owner', - type: 'service', - }, - }; + const entityOk = entity('test/success'); + const entityEmpty = entity('test/empty'); + const entityNotOk = entity('test/error'); const mockSecretsResult: { items: VaultSecret[] } = { items: [ @@ -91,7 +79,7 @@ describe('EntityVaultTable', () => { const { path } = req.params; if (path === 'test/success') { return res(ctx.json(mockSecretsResult)); - } else if (path === 'test/error') { + } else if (path === 'test/empty') { return res(ctx.json([])); } return res(ctx.status(400)); @@ -122,10 +110,25 @@ describe('EntityVaultTable', () => { setupHandlers(); const rendered = await renderInTestApp( - + , ); expect(rendered.getByText(/No secrets found/)).toBeInTheDocument(); }); + + it('should surface an appropriate error when the Vault API responds unsuccessfully', async () => { + setupHandlers(); + const rendered = await renderInTestApp( + + + , + ); + + expect( + rendered.getByText( + /Unexpected error while fetching secrets from path \'test\/error\'\: Request failed with 400 Error/, + ), + ).toBeInTheDocument(); + }); }); diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx index efc345b07f..9191d54b0b 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx @@ -81,7 +81,12 @@ export const EntityVaultTable = ({ entity }: { entity: Entity }) => { }); if (error) { - return {error.message}; + return ( + + Unexpected error while fetching secrets from path '{secretPath}':{' '} + {error.message} + + ); } return ( From fd7a77b9c46a7f04f2c9f523a083f297dbac8985 Mon Sep 17 00:00:00 2001 From: Mike Ball Date: Sat, 4 Feb 2023 08:08:59 -0500 Subject: [PATCH 06/98] add changeset regarding Vault error improvements Signed-off-by: Mike Ball --- .changeset/mean-squids-kneel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/mean-squids-kneel.md diff --git a/.changeset/mean-squids-kneel.md b/.changeset/mean-squids-kneel.md new file mode 100644 index 0000000000..41a1bd4086 --- /dev/null +++ b/.changeset/mean-squids-kneel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault': patch +--- + +Surface additional context and details to the Backstage UI when the Vault plugin encounters non-successful HTTP responses from the Vault API. From bff35c4d98c80cfb77f65d53c9cfb5b9db280fc1 Mon Sep 17 00:00:00 2001 From: Mike Ball Date: Sun, 5 Feb 2023 08:00:07 -0500 Subject: [PATCH 07/98] fix github-actions plugin dev environment This ensures the mockGithubActionsApi used by the plugin in dev returns the necessary mock data to meaningfully render the plugin. Signed-off-by: Mike Ball --- plugins/github-actions/dev/index.tsx | 8 +- .../downloadJobLogsForWorkflowRun.ts | 315 ++++++++++++++++++ .../src/__fixtures__/list-workflow-runs.json | 223 +++++++++++++ 3 files changed, 544 insertions(+), 2 deletions(-) create mode 100644 plugins/github-actions/src/__fixtures__/downloadJobLogsForWorkflowRun.ts create mode 100644 plugins/github-actions/src/__fixtures__/list-workflow-runs.json diff --git a/plugins/github-actions/dev/index.tsx b/plugins/github-actions/dev/index.tsx index ee761b3504..93e6ee4f74 100644 --- a/plugins/github-actions/dev/index.tsx +++ b/plugins/github-actions/dev/index.tsx @@ -22,6 +22,8 @@ import { Entity } from '@backstage/catalog-model'; import { GithubActionsApi, githubActionsApiRef } from '../src'; import getWorkflowRunResponse from '../src/__fixtures__/get-workflow-run.json'; import listJobsForWorkflowRunResponse from '../src/__fixtures__/list-jobs-for-workflow-run.json'; +import listWorkflowRuns from '../src/__fixtures__/list-workflow-runs.json'; +import { downloadJobLogsForWorkflowRun } from '../src/__fixtures__/downloadJobLogsForWorkflowRun'; const mockEntity: Entity = { apiVersion: 'backstage.io/v1alpha1', @@ -41,7 +43,9 @@ const mockEntity: Entity = { }; const mockGithubActionsApi: GithubActionsApi = { - async downloadJobLogsForWorkflowRun() {}, + async downloadJobLogsForWorkflowRun() { + return downloadJobLogsForWorkflowRun; + }, async getWorkflow() { return {} as any; }, @@ -52,7 +56,7 @@ const mockGithubActionsApi: GithubActionsApi = { return listJobsForWorkflowRunResponse as any; }, async listWorkflowRuns() { - return {} as any; + return listWorkflowRuns as any; }, async reRunWorkflow() { return {} as any; diff --git a/plugins/github-actions/src/__fixtures__/downloadJobLogsForWorkflowRun.ts b/plugins/github-actions/src/__fixtures__/downloadJobLogsForWorkflowRun.ts new file mode 100644 index 0000000000..7b882d0719 --- /dev/null +++ b/plugins/github-actions/src/__fixtures__/downloadJobLogsForWorkflowRun.ts @@ -0,0 +1,315 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const downloadJobLogsForWorkflowRun = ` +2022-12-09T17:25:25.6542422Z Requested labels: ubuntu-latest +2022-12-09T17:25:25.6542470Z Job defined at: octo-org/octo-template/dynamic/pages/pages-build-deployment@refs/heads/main +2022-12-09T17:25:25.6542493Z Waiting for a runner to pick up this job... +2022-12-09T17:25:25.9157301Z Job is waiting for a hosted runner to come online. +2022-12-09T17:25:29.3998345Z Job is about to start running on the hosted runner: Hosted Agent (hosted) +2022-12-09T17:25:31.7099053Z Current runner version: '2.299.1' +2022-12-09T17:25:31.7123983Z ##[group]Operating System +2022-12-09T17:25:31.7124496Z Ubuntu +2022-12-09T17:25:31.7124859Z 22.04.1 +2022-12-09T17:25:31.7125085Z LTS +2022-12-09T17:25:31.7125353Z ##[endgroup] +2022-12-09T17:25:31.7125657Z ##[group]Runner Image +2022-12-09T17:25:31.7125963Z Image: ubuntu-22.04 +2022-12-09T17:25:31.7126295Z Version: 20221204.2 +2022-12-09T17:25:31.7127048Z Included Software: https://github.com/actions/runner-images/blob/ubuntu22/20221204.2/images/linux/Ubuntu2204-Readme.md +2022-12-09T17:25:31.7127614Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu22%2F20221204.2 +2022-12-09T17:25:31.7128026Z ##[endgroup] +2022-12-09T17:25:31.7128400Z ##[group]Runner Image Provisioner +2022-12-09T17:25:31.7128722Z 2.0.91.1 +2022-12-09T17:25:31.7128945Z ##[endgroup] +2022-12-09T17:25:31.7129586Z ##[group]GITHUB_TOKEN Permissions +2022-12-09T17:25:31.7130130Z Contents: read +2022-12-09T17:25:31.7130387Z Metadata: read +2022-12-09T17:25:31.7130849Z Pages: write +2022-12-09T17:25:31.7131169Z ##[endgroup] +2022-12-09T17:25:31.7134756Z Secret source: Actions +2022-12-09T17:25:31.7135232Z Prepare workflow directory +2022-12-09T17:25:31.7951647Z Prepare all required actions +2022-12-09T17:25:31.8134091Z Getting action download info +2022-12-09T17:25:32.1190857Z Download action repository 'actions/checkout@v3' (SHA:93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8) +2022-12-09T17:25:32.4403240Z Download action repository 'actions/jekyll-build-pages@v1' (SHA:9b882383c88a22eef81e9c1a5a232c2ff9a6672b) +2022-12-09T17:25:32.7457755Z Download action repository 'actions/upload-pages-artifact@v1' (SHA:c8641e80048cf33d329c39df3bcc53196178335a) +2022-12-09T17:25:33.0262452Z Getting action download info +2022-12-09T17:25:33.1786870Z Download action repository 'actions/upload-artifact@main' (SHA:83fd05a356d7e2593de66fc9913b3002723633cb) +2022-12-09T17:25:33.4537715Z ##[group]Pull down action image 'ghcr.io/actions/jekyll-build-pages:v1.0.4' +2022-12-09T17:25:33.4611360Z ##[command]/usr/bin/docker pull ghcr.io/actions/jekyll-build-pages:v1.0.4 +2022-12-09T17:25:34.0231935Z v1.0.4: Pulling from actions/jekyll-build-pages +2022-12-09T17:25:34.0232298Z eff15d958d66: Pulling fs layer +2022-12-09T17:25:34.0232609Z 923e91ae3a1b: Pulling fs layer +2022-12-09T17:25:34.0232986Z 2aa5d3a4a151: Pulling fs layer +2022-12-09T17:25:34.0233248Z bc64adf2d0b2: Pulling fs layer +2022-12-09T17:25:34.0233543Z bfc5cca7d80e: Pulling fs layer +2022-12-09T17:25:34.0233827Z 61b6e3e25463: Pulling fs layer +2022-12-09T17:25:34.0234080Z 7c62fb63f605: Pulling fs layer +2022-12-09T17:25:34.0234380Z 0f68cc81f8f6: Pulling fs layer +2022-12-09T17:25:34.0234663Z 09f325326117: Pulling fs layer +2022-12-09T17:25:34.0234894Z a73a0a50c4db: Pulling fs layer +2022-12-09T17:25:34.0235171Z bc64adf2d0b2: Waiting +2022-12-09T17:25:34.0235470Z bfc5cca7d80e: Waiting +2022-12-09T17:25:34.0235840Z 61b6e3e25463: Waiting +2022-12-09T17:25:34.0236104Z 7c62fb63f605: Waiting +2022-12-09T17:25:34.0236314Z 0f68cc81f8f6: Waiting +2022-12-09T17:25:34.0236586Z 09f325326117: Waiting +2022-12-09T17:25:34.0236855Z a73a0a50c4db: Waiting +2022-12-09T17:25:34.1800756Z 2aa5d3a4a151: Verifying Checksum +2022-12-09T17:25:34.1801065Z 2aa5d3a4a151: Download complete +2022-12-09T17:25:34.4333121Z eff15d958d66: Verifying Checksum +2022-12-09T17:25:34.4335284Z eff15d958d66: Download complete +2022-12-09T17:25:34.5215161Z bc64adf2d0b2: Verifying Checksum +2022-12-09T17:25:34.5231169Z bc64adf2d0b2: Download complete +2022-12-09T17:25:34.5266358Z 923e91ae3a1b: Verifying Checksum +2022-12-09T17:25:34.5266637Z 923e91ae3a1b: Download complete +2022-12-09T17:25:34.6185999Z bfc5cca7d80e: Verifying Checksum +2022-12-09T17:25:34.6186341Z bfc5cca7d80e: Download complete +2022-12-09T17:25:34.6627434Z 7c62fb63f605: Verifying Checksum +2022-12-09T17:25:34.6629228Z 7c62fb63f605: Download complete +2022-12-09T17:25:34.8423112Z 09f325326117: Verifying Checksum +2022-12-09T17:25:34.8424383Z 09f325326117: Download complete +2022-12-09T17:25:35.0142784Z a73a0a50c4db: Verifying Checksum +2022-12-09T17:25:35.0143743Z a73a0a50c4db: Download complete +2022-12-09T17:25:35.2282893Z 0f68cc81f8f6: Verifying Checksum +2022-12-09T17:25:35.2283672Z 0f68cc81f8f6: Download complete +2022-12-09T17:25:35.8547685Z 61b6e3e25463: Verifying Checksum +2022-12-09T17:25:35.8547985Z 61b6e3e25463: Download complete +2022-12-09T17:25:36.3689873Z eff15d958d66: Pull complete +2022-12-09T17:25:38.9751393Z 923e91ae3a1b: Pull complete +2022-12-09T17:25:39.0574850Z 2aa5d3a4a151: Pull complete +2022-12-09T17:25:39.6785807Z bc64adf2d0b2: Pull complete +2022-12-09T17:25:39.7560781Z bfc5cca7d80e: Pull complete +2022-12-09T17:25:45.3145640Z 61b6e3e25463: Pull complete +2022-12-09T17:25:45.3626474Z 7c62fb63f605: Pull complete +2022-12-09T17:25:48.5182928Z 0f68cc81f8f6: Pull complete +2022-12-09T17:25:48.5924407Z 09f325326117: Pull complete +2022-12-09T17:25:48.6361139Z a73a0a50c4db: Pull complete +2022-12-09T17:25:48.6390662Z Digest: sha256:e56d7e4c5ac45aa2934b1d535f4c66769a442ef6538c7948f8b4e3b2950fd7b4 +2022-12-09T17:25:48.6435854Z Status: Downloaded newer image for ghcr.io/actions/jekyll-build-pages:v1.0.4 +2022-12-09T17:25:48.6436263Z ghcr.io/actions/jekyll-build-pages:v1.0.4 +2022-12-09T17:25:48.6444026Z ##[endgroup] +2022-12-09T17:25:48.6814585Z ##[group]Run actions/checkout@v3 +2022-12-09T17:25:48.6814842Z with: +2022-12-09T17:25:48.6815018Z ref: main +2022-12-09T17:25:48.6815204Z submodules: recursive +2022-12-09T17:25:48.6815442Z repository: octo-org/octo-template +2022-12-09T17:25:48.6815884Z token: *** +2022-12-09T17:25:48.6816068Z ssh-strict: true +2022-12-09T17:25:48.6816284Z persist-credentials: true +2022-12-09T17:25:48.6816500Z clean: true +2022-12-09T17:25:48.6816685Z fetch-depth: 1 +2022-12-09T17:25:48.6816872Z lfs: false +2022-12-09T17:25:48.6817076Z set-safe-directory: true +2022-12-09T17:25:48.6817275Z ##[endgroup] +2022-12-09T17:25:48.9194010Z Syncing repository: octo-org/octo-template +2022-12-09T17:25:48.9195798Z ##[group]Getting Git version info +2022-12-09T17:25:48.9196263Z Working directory is '/home/runner/work/octo-template/octo-template' +2022-12-09T17:25:48.9196777Z [command]/usr/bin/git version +2022-12-09T17:25:48.9267188Z git version 2.38.1 +2022-12-09T17:25:48.9293570Z ##[endgroup] +2022-12-09T17:25:48.9315385Z Temporarily overriding HOME='/home/runner/work/_temp/54730a3a-82b6-4069-a509-366e53e131cc' before making global git config changes +2022-12-09T17:25:48.9315845Z Adding repository directory to the temporary git global config as a safe directory +2022-12-09T17:25:48.9316365Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/octo-template/octo-template +2022-12-09T17:25:48.9362562Z Deleting the contents of '/home/runner/work/octo-template/octo-template' +2022-12-09T17:25:48.9366563Z ##[group]Initializing the repository +2022-12-09T17:25:48.9370913Z [command]/usr/bin/git init /home/runner/work/octo-template/octo-template +2022-12-09T17:25:48.9428579Z hint: Using 'master' as the name for the initial branch. This default branch name +2022-12-09T17:25:48.9429400Z hint: is subject to change. To configure the initial branch name to use in all +2022-12-09T17:25:48.9429828Z hint: of your new repositories, which will suppress this warning, call: +2022-12-09T17:25:48.9430089Z hint: +2022-12-09T17:25:48.9430525Z hint: git config --global init.defaultBranch +2022-12-09T17:25:48.9430769Z hint: +2022-12-09T17:25:48.9431094Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +2022-12-09T17:25:48.9431510Z hint: 'development'. The just-created branch can be renamed via this command: +2022-12-09T17:25:48.9431770Z hint: +2022-12-09T17:25:48.9431994Z hint: git branch -m +2022-12-09T17:25:48.9442316Z Initialized empty Git repository in /home/runner/work/octo-template/octo-template/.git/ +2022-12-09T17:25:48.9454154Z [command]/usr/bin/git remote add origin https://github.com/octo-org/octo-template +2022-12-09T17:25:48.9490442Z ##[endgroup] +2022-12-09T17:25:48.9491112Z ##[group]Disabling automatic garbage collection +2022-12-09T17:25:48.9494676Z [command]/usr/bin/git config --local gc.auto 0 +2022-12-09T17:25:48.9524540Z ##[endgroup] +2022-12-09T17:25:48.9525308Z ##[group]Setting up auth +2022-12-09T17:25:48.9532488Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +2022-12-09T17:25:48.9563906Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || : +2022-12-09T17:25:48.9857748Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +2022-12-09T17:25:48.9892225Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || : +2022-12-09T17:25:49.0110192Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +2022-12-09T17:25:49.0146631Z ##[endgroup] +2022-12-09T17:25:49.0147330Z ##[group]Fetching the repository +2022-12-09T17:25:49.0156010Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +refs/heads/main*:refs/remotes/origin/main* +refs/tags/main*:refs/tags/main* +2022-12-09T17:25:49.2837218Z remote: Enumerating objects: 3, done. +2022-12-09T17:25:49.2837524Z remote: Counting objects: 33% (1/3) +2022-12-09T17:25:49.2837809Z remote: Counting objects: 66% (2/3) +2022-12-09T17:25:49.2838044Z remote: Counting objects: 100% (3/3) +2022-12-09T17:25:49.2839733Z remote: Counting objects: 100% (3/3), done. +2022-12-09T17:25:49.2840661Z remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 +2022-12-09T17:25:49.2896737Z From https://github.com/octo-org/octo-template +2022-12-09T17:25:49.2897109Z * [new branch] main -> origin/main +2022-12-09T17:25:49.2924446Z ##[endgroup] +2022-12-09T17:25:49.2925129Z ##[group]Determining the checkout info +2022-12-09T17:25:49.2931526Z [command]/usr/bin/git branch --list --remote origin/main +2022-12-09T17:25:49.2958361Z origin/main +2022-12-09T17:25:49.2963283Z ##[endgroup] +2022-12-09T17:25:49.2964130Z ##[group]Checking out the ref +2022-12-09T17:25:49.2970560Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +2022-12-09T17:25:49.3010381Z Switched to a new branch 'main' +2022-12-09T17:25:49.3014811Z branch 'main' set up to track 'origin/main'. +2022-12-09T17:25:49.3019861Z ##[endgroup] +2022-12-09T17:25:49.3022847Z ##[group]Setting up auth for fetching submodules +2022-12-09T17:25:49.3031486Z [command]/usr/bin/git config --global http.https://github.com/.extraheader AUTHORIZATION: basic *** +2022-12-09T17:25:49.3101009Z [command]/usr/bin/git config --global --unset-all url.https://github.com/.insteadOf +2022-12-09T17:25:49.3132496Z [command]/usr/bin/git config --global --add url.https://github.com/.insteadOf git@github.com: +2022-12-09T17:25:49.3159145Z ##[endgroup] +2022-12-09T17:25:49.3159671Z ##[group]Fetching submodules +2022-12-09T17:25:49.3163060Z [command]/usr/bin/git submodule sync --recursive +2022-12-09T17:25:49.3374628Z [command]/usr/bin/git -c protocol.version=2 submodule update --init --force --depth=1 --recursive +2022-12-09T17:25:49.3595435Z [command]/usr/bin/git submodule foreach --recursive git config --local gc.auto 0 +2022-12-09T17:25:49.3838526Z ##[endgroup] +2022-12-09T17:25:49.3839209Z ##[group]Persisting credentials for submodules +2022-12-09T17:25:49.3844491Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'url\.https\:\/\/github\.com\/\.insteadOf' && git config --local --unset-all 'url.https://github.com/.insteadOf' || : +2022-12-09T17:25:49.4113780Z [command]/usr/bin/git submodule foreach --recursive git config --local 'http.https://github.com/.extraheader' 'AUTHORIZATION: basic ***' && git config --local --show-origin --name-only --get-regexp remote.origin.url +2022-12-09T17:25:49.4324497Z [command]/usr/bin/git submodule foreach --recursive git config --local --add 'url.https://github.com/.insteadOf' 'git@github.com:' +2022-12-09T17:25:49.4536981Z ##[endgroup] +2022-12-09T17:25:49.4565161Z [command]/usr/bin/git log -1 --format='%H' +2022-12-09T17:25:49.4592051Z 'c85af0e5e5798047462143a13c1b455ee1275a64' +2022-12-09T17:25:49.4851246Z ##[group]Run actions/jekyll-build-pages@v1 +2022-12-09T17:25:49.4851491Z with: +2022-12-09T17:25:49.4851672Z source: . +2022-12-09T17:25:49.4851856Z destination: ./_site +2022-12-09T17:25:49.4852055Z future: false +2022-12-09T17:25:49.4852300Z build_revision: c85af0e5e5798047462143a13c1b455ee1275a64 +2022-12-09T17:25:49.4852525Z verbose: true +2022-12-09T17:25:49.4852887Z token: *** +2022-12-09T17:25:49.4853073Z ##[endgroup] +2022-12-09T17:25:49.5094807Z ##[command]/usr/bin/docker run --name ghcrioactionsjekyllbuildpagesv104_e36266 --label 290506 --workdir /github/workspace --rm -e "INPUT_SOURCE" -e "INPUT_DESTINATION" -e "INPUT_FUTURE" -e "INPUT_BUILD_REVISION" -e "INPUT_VERBOSE" -e "INPUT_TOKEN" -e "HOME" -e "GITHUB_JOB" -e "GITHUB_REF" -e "GITHUB_SHA" -e "GITHUB_REPOSITORY" -e "GITHUB_REPOSITORY_OWNER" -e "GITHUB_RUN_ID" -e "GITHUB_RUN_NUMBER" -e "GITHUB_RETENTION_DAYS" -e "GITHUB_RUN_ATTEMPT" -e "GITHUB_ACTOR" -e "GITHUB_TRIGGERING_ACTOR" -e "GITHUB_WORKFLOW" -e "GITHUB_HEAD_REF" -e "GITHUB_BASE_REF" -e "GITHUB_EVENT_NAME" -e "GITHUB_SERVER_URL" -e "GITHUB_API_URL" -e "GITHUB_GRAPHQL_URL" -e "GITHUB_REF_NAME" -e "GITHUB_REF_PROTECTED" -e "GITHUB_REF_TYPE" -e "GITHUB_WORKSPACE" -e "GITHUB_ACTION" -e "GITHUB_EVENT_PATH" -e "GITHUB_ACTION_REPOSITORY" -e "GITHUB_ACTION_REF" -e "GITHUB_PATH" -e "GITHUB_ENV" -e "GITHUB_STEP_SUMMARY" -e "GITHUB_STATE" -e "GITHUB_OUTPUT" -e "RUNNER_OS" -e "RUNNER_ARCH" -e "RUNNER_NAME" -e "RUNNER_TOOL_CACHE" -e "RUNNER_TEMP" -e "RUNNER_WORKSPACE" -e "ACTIONS_RUNTIME_URL" -e "ACTIONS_RUNTIME_TOKEN" -e "ACTIONS_CACHE_URL" -e "ACTIONS_ID_TOKEN_REQUEST_URL" -e "ACTIONS_ID_TOKEN_REQUEST_TOKEN" -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" -v "/home/runner/work/octo-template/octo-template":"/github/workspace" ghcr.io/actions/jekyll-build-pages:v1.0.4 +2022-12-09T17:25:50.5151506Z [33mConfiguration file: none[0m +2022-12-09T17:25:50.5313330Z Logging at level: debug +2022-12-09T17:25:50.5313941Z GitHub Pages: github-pages v227 +2022-12-09T17:25:50.5314484Z GitHub Pages: jekyll v3.9.2 +2022-12-09T17:25:50.5315560Z Theme: jekyll-theme-primer +2022-12-09T17:25:50.5316125Z Theme source: /usr/local/bundle/gems/jekyll-theme-primer-0.6.0 +2022-12-09T17:25:50.5316710Z Requiring: jekyll-github-metadata +2022-12-09T17:25:50.6063961Z To use retry middleware with Faraday v2.0+, install faraday-retry gem +2022-12-09T17:25:52.4164334Z Requiring: jekyll-seo-tag +2022-12-09T17:25:52.4165089Z Requiring: jekyll-coffeescript +2022-12-09T17:25:52.4166139Z Requiring: jekyll-commonmark-ghpages +2022-12-09T17:25:52.4166490Z Requiring: jekyll-gist +2022-12-09T17:25:52.4167025Z Requiring: jekyll-github-metadata +2022-12-09T17:25:52.4167363Z Requiring: jekyll-paginate +2022-12-09T17:25:52.4167663Z Requiring: jekyll-relative-links +2022-12-09T17:25:52.4167989Z Requiring: jekyll-optional-front-matter +2022-12-09T17:25:52.4168298Z Requiring: jekyll-readme-index +2022-12-09T17:25:52.4168589Z Requiring: jekyll-default-layout +2022-12-09T17:25:52.4168888Z Requiring: jekyll-titles-from-headings +2022-12-09T17:25:52.4169143Z GitHub Metadata: Initializing... +2022-12-09T17:25:52.4169392Z Source: /github/workspace/. +2022-12-09T17:25:52.4169651Z Destination: /github/workspace/./_site +2022-12-09T17:25:52.4169981Z Incremental build: disabled. Enable with --incremental +2022-12-09T17:25:52.4170230Z Generating... +2022-12-09T17:25:52.4183638Z Generating: JekyllOptionalFrontMatter::Generator finished in 0.000150897 seconds. +2022-12-09T17:25:52.4184136Z Generating: JekyllReadmeIndex::Generator finished in 0.00169567 seconds. +2022-12-09T17:25:52.4185038Z Generating: Jekyll::Paginate::Pagination finished in 4.8e-06 seconds. +2022-12-09T17:25:52.4185483Z Generating: JekyllRelativeLinks::Generator finished in 2.97e-05 seconds. +2022-12-09T17:25:52.4185914Z Generating: JekyllDefaultLayout::Generator finished in 7.7999e-05 seconds. +2022-12-09T17:25:52.4186258Z Requiring: kramdown-parser-gfm +2022-12-09T17:25:52.4186586Z Generating: JekyllTitlesFromHeadings::Generator finished in 0.008350253 seconds. +2022-12-09T17:25:52.4186888Z Rendering: assets/css/style.scss +2022-12-09T17:25:52.4187176Z Pre-Render Hooks: assets/css/style.scss +2022-12-09T17:25:52.4187437Z Rendering Markup: assets/css/style.scss +2022-12-09T17:25:52.4187672Z Rendering: README.md +2022-12-09T17:25:52.4187920Z Pre-Render Hooks: README.md +2022-12-09T17:25:52.4188141Z Rendering Markup: README.md +2022-12-09T17:25:52.4188360Z Rendering Layout: README.md +2022-12-09T17:25:52.4188568Z Layout source: theme +2022-12-09T17:25:52.4188886Z GitHub Metadata: Generating for octo-org/octo-template +2022-12-09T17:25:52.4189408Z GitHub Metadata: Calling @client.repository("octo-org/octo-template", {:accept=>"application/vnd.github.drax-preview+json"}) +2022-12-09T17:25:52.4189903Z GitHub Metadata: Calling @client.pages("octo-org/octo-template", {}) +2022-12-09T17:25:52.4190223Z Writing: /github/workspace/_site/assets/css/style.css +2022-12-09T17:25:52.4190520Z Writing: /github/workspace/_site/index.html +2022-12-09T17:25:52.4190772Z done in 1.524 seconds. +2022-12-09T17:25:52.4191074Z Auto-regeneration: disabled. Use --watch to enable. +2022-12-09T17:25:52.5460546Z ##[group]Run actions/upload-pages-artifact@v1 +2022-12-09T17:25:52.5460787Z with: +2022-12-09T17:25:52.5460968Z path: ./_site +2022-12-09T17:25:52.5461168Z name: github-pages +2022-12-09T17:25:52.5461361Z retention-days: 1 +2022-12-09T17:25:52.5461560Z ##[endgroup] +2022-12-09T17:25:52.5745795Z ##[group]Run chmod -c -R +rX . | while read line; do +2022-12-09T17:25:52.5746128Z [36;1mchmod -c -R +rX . | while read line; do[0m +2022-12-09T17:25:52.5746462Z [36;1m echo "::warning title=Invalid file permissions automatically fixed::$line"[0m +2022-12-09T17:25:52.5746740Z [36;1mdone[0m +2022-12-09T17:25:52.5746920Z [36;1mtar \[0m +2022-12-09T17:25:52.5747146Z [36;1m --dereference --hard-dereference \[0m +2022-12-09T17:25:52.5747410Z [36;1m --directory "$INPUT_PATH" \[0m +2022-12-09T17:25:52.5747668Z [36;1m -cvf "$RUNNER_TEMP/artifact.tar" \[0m +2022-12-09T17:25:52.5747896Z [36;1m --exclude=.git \[0m +2022-12-09T17:25:52.5748110Z [36;1m --exclude=.github \[0m +2022-12-09T17:25:52.5748352Z [36;1m .[0m +2022-12-09T17:25:52.5805770Z shell: /usr/bin/sh -e {0} +2022-12-09T17:25:52.5805980Z env: +2022-12-09T17:25:52.5806170Z INPUT_PATH: ./_site +2022-12-09T17:25:52.5806374Z ##[endgroup] +2022-12-09T17:25:52.5967973Z chmod: changing permissions of './_site': Operation not permitted +2022-12-09T17:25:52.5986749Z chmod: changing permissions of './_site/index.html': Operation not permitted +2022-12-09T17:25:52.5987217Z chmod: changing permissions of './_site/README.md': Operation not permitted +2022-12-09T17:25:52.5987625Z chmod: changing permissions of './_site/assets': Operation not permitted +2022-12-09T17:25:52.5988025Z chmod: changing permissions of './_site/assets/css': Operation not permitted +2022-12-09T17:25:52.5988455Z chmod: changing permissions of './_site/assets/css/style.css': Operation not permitted +2022-12-09T17:25:52.6003872Z ./ +2022-12-09T17:25:52.6004035Z ./index.html +2022-12-09T17:25:52.6004213Z ./README.md +2022-12-09T17:25:52.6004387Z ./assets/ +2022-12-09T17:25:52.6004556Z ./assets/css/ +2022-12-09T17:25:52.6004743Z ./assets/css/style.css +2022-12-09T17:25:52.6089697Z ##[group]Run actions/upload-artifact@main +2022-12-09T17:25:52.6089918Z with: +2022-12-09T17:25:52.6090104Z name: github-pages +2022-12-09T17:25:52.6090342Z path: /home/runner/work/_temp/artifact.tar +2022-12-09T17:25:52.6090677Z retention-days: 1 +2022-12-09T17:25:52.6090884Z if-no-files-found: warn +2022-12-09T17:25:52.6091085Z ##[endgroup] +2022-12-09T17:25:52.6745114Z With the provided path, there will be 1 file uploaded +2022-12-09T17:25:52.6748618Z Starting artifact upload +2022-12-09T17:25:52.6749367Z For more detailed logs during the artifact upload process, enable step-debugging: https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging#enabling-step-debug-logging +2022-12-09T17:25:52.6750012Z Artifact name is valid! +2022-12-09T17:25:52.7711407Z Container for artifact "github-pages" successfully created. Starting upload of file(s) +2022-12-09T17:25:52.8679144Z Total size of all the files uploaded is 12638 bytes +2022-12-09T17:25:52.8680162Z File upload process has finished. Finalizing the artifact upload +2022-12-09T17:25:52.8976033Z Artifact has been finalized. All files have been successfully uploaded! +2022-12-09T17:25:52.8976512Z +2022-12-09T17:25:52.8976816Z The raw size of all the files that were specified for upload is 92160 bytes +2022-12-09T17:25:52.8977329Z The size of all the files that were uploaded is 12638 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage +2022-12-09T17:25:52.8977612Z +2022-12-09T17:25:52.8978179Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads +2022-12-09T17:25:52.8978524Z +2022-12-09T17:25:52.8980509Z Artifact github-pages has been successfully uploaded! +2022-12-09T17:25:52.9084311Z Post job cleanup. +2022-12-09T17:25:53.0358449Z [command]/usr/bin/git version +2022-12-09T17:25:53.0407485Z git version 2.38.1 +2022-12-09T17:25:53.0465462Z Temporarily overriding HOME='/home/runner/work/_temp/52bccf8b-8b44-45e0-a383-0833ced20023' before making global git config changes +2022-12-09T17:25:53.0470560Z Adding repository directory to the temporary git global config as a safe directory +2022-12-09T17:25:53.0478850Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/octo-template/octo-template +2022-12-09T17:25:53.0517249Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +2022-12-09T17:25:53.0550835Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || : +2022-12-09T17:25:53.0769173Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +2022-12-09T17:25:53.0792441Z http.https://github.com/.extraheader +2022-12-09T17:25:53.0803756Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +2022-12-09T17:25:53.0838329Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || : +2022-12-09T17:25:53.1274888Z Cleaning up orphan processes +`; diff --git a/plugins/github-actions/src/__fixtures__/list-workflow-runs.json b/plugins/github-actions/src/__fixtures__/list-workflow-runs.json new file mode 100644 index 0000000000..4d1e1223ce --- /dev/null +++ b/plugins/github-actions/src/__fixtures__/list-workflow-runs.json @@ -0,0 +1,223 @@ +{ + "total_count": 1, + "workflow_runs": [ + { + "id": 30433642, + "name": "Build", + "node_id": "MDEyOldvcmtmbG93IFJ1bjI2OTI4OQ==", + "check_suite_id": 42, + "check_suite_node_id": "MDEwOkNoZWNrU3VpdGU0Mg==", + "head_branch": "master", + "head_sha": "acb5820ced9479c074f688cc328bf03f341a511d", + "run_number": 562, + "event": "push", + "status": "queued", + "conclusion": null, + "workflow_id": 159038, + "url": "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642", + "html_url": "https://github.com/octo-org/octo-repo/actions/runs/30433642", + "pull_requests": [], + "created_at": "2020-01-22T19:33:08Z", + "updated_at": "2020-01-22T19:33:08Z", + "actor": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "run_attempt": 1, + "run_started_at": "2020-01-22T19:33:08Z", + "triggering_actor": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "jobs_url": "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/jobs", + "logs_url": "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/logs", + "check_suite_url": "https://api.github.com/repos/octo-org/octo-repo/check-suites/414944374", + "artifacts_url": "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/artifacts", + "cancel_url": "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/cancel", + "rerun_url": "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/rerun", + "workflow_url": "https://api.github.com/repos/octo-org/octo-repo/actions/workflows/159038", + "head_commit": { + "id": "acb5820ced9479c074f688cc328bf03f341a511d", + "tree_id": "d23f6eedb1e1b9610bbc754ddb5197bfe7271223", + "message": "Create linter.yaml", + "timestamp": "2020-01-22T19:33:05Z", + "author": { + "name": "Octo Cat", + "email": "octocat@github.com" + }, + "committer": { + "name": "GitHub", + "email": "noreply@github.com" + } + }, + "repository": { + "id": 1296269, + "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", + "name": "Hello-World", + "full_name": "octocat/Hello-World", + "owner": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/octocat/Hello-World", + "description": "This your first repo!", + "fork": false, + "url": "https://api.github.com/repos/octocat/Hello-World", + "archive_url": "https://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}", + "assignees_url": "https://api.github.com/repos/octocat/Hello-World/assignees{/user}", + "blobs_url": "https://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/octocat/Hello-World/branches{/branch}", + "collaborators_url": "https://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/octocat/Hello-World/comments{/number}", + "commits_url": "https://api.github.com/repos/octocat/Hello-World/commits{/sha}", + "compare_url": "https://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/octocat/Hello-World/contents/{+path}", + "contributors_url": "https://api.github.com/repos/octocat/Hello-World/contributors", + "deployments_url": "https://api.github.com/repos/octocat/Hello-World/deployments", + "downloads_url": "https://api.github.com/repos/octocat/Hello-World/downloads", + "events_url": "https://api.github.com/repos/octocat/Hello-World/events", + "forks_url": "https://api.github.com/repos/octocat/Hello-World/forks", + "git_commits_url": "https://api.github.com/repos/octocat/Hello-World/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/octocat/Hello-World/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/octocat/Hello-World/git/tags{/sha}", + "git_url": "git:github.com/octocat/Hello-World.git", + "issue_comment_url": "https://api.github.com/repos/octocat/Hello-World/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/octocat/Hello-World/issues/events{/number}", + "issues_url": "https://api.github.com/repos/octocat/Hello-World/issues{/number}", + "keys_url": "https://api.github.com/repos/octocat/Hello-World/keys{/key_id}", + "labels_url": "https://api.github.com/repos/octocat/Hello-World/labels{/name}", + "languages_url": "https://api.github.com/repos/octocat/Hello-World/languages", + "merges_url": "https://api.github.com/repos/octocat/Hello-World/merges", + "milestones_url": "https://api.github.com/repos/octocat/Hello-World/milestones{/number}", + "notifications_url": "https://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}", + "pulls_url": "https://api.github.com/repos/octocat/Hello-World/pulls{/number}", + "releases_url": "https://api.github.com/repos/octocat/Hello-World/releases{/id}", + "ssh_url": "git@github.com:octocat/Hello-World.git", + "stargazers_url": "https://api.github.com/repos/octocat/Hello-World/stargazers", + "statuses_url": "https://api.github.com/repos/octocat/Hello-World/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/octocat/Hello-World/subscribers", + "subscription_url": "https://api.github.com/repos/octocat/Hello-World/subscription", + "tags_url": "https://api.github.com/repos/octocat/Hello-World/tags", + "teams_url": "https://api.github.com/repos/octocat/Hello-World/teams", + "trees_url": "https://api.github.com/repos/octocat/Hello-World/git/trees{/sha}", + "hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks" + }, + "head_repository": { + "id": 217723378, + "node_id": "MDEwOlJlcG9zaXRvcnkyMTc3MjMzNzg=", + "name": "octo-repo", + "full_name": "octo-org/octo-repo", + "private": true, + "owner": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/octo-org/octo-repo", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/octo-org/octo-repo", + "forks_url": "https://api.github.com/repos/octo-org/octo-repo/forks", + "keys_url": "https://api.github.com/repos/octo-org/octo-repo/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/octo-org/octo-repo/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/octo-org/octo-repo/teams", + "hooks_url": "https://api.github.com/repos/octo-org/octo-repo/hooks", + "issue_events_url": "https://api.github.com/repos/octo-org/octo-repo/issues/events{/number}", + "events_url": "https://api.github.com/repos/octo-org/octo-repo/events", + "assignees_url": "https://api.github.com/repos/octo-org/octo-repo/assignees{/user}", + "branches_url": "https://api.github.com/repos/octo-org/octo-repo/branches{/branch}", + "tags_url": "https://api.github.com/repos/octo-org/octo-repo/tags", + "blobs_url": "https://api.github.com/repos/octo-org/octo-repo/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/octo-org/octo-repo/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/octo-org/octo-repo/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/octo-org/octo-repo/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/octo-org/octo-repo/statuses/{sha}", + "languages_url": "https://api.github.com/repos/octo-org/octo-repo/languages", + "stargazers_url": "https://api.github.com/repos/octo-org/octo-repo/stargazers", + "contributors_url": "https://api.github.com/repos/octo-org/octo-repo/contributors", + "subscribers_url": "https://api.github.com/repos/octo-org/octo-repo/subscribers", + "subscription_url": "https://api.github.com/repos/octo-org/octo-repo/subscription", + "commits_url": "https://api.github.com/repos/octo-org/octo-repo/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/octo-org/octo-repo/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/octo-org/octo-repo/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/octo-org/octo-repo/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/octo-org/octo-repo/contents/{+path}", + "compare_url": "https://api.github.com/repos/octo-org/octo-repo/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/octo-org/octo-repo/merges", + "archive_url": "https://api.github.com/repos/octo-org/octo-repo/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/octo-org/octo-repo/downloads", + "issues_url": "https://api.github.com/repos/octo-org/octo-repo/issues{/number}", + "pulls_url": "https://api.github.com/repos/octo-org/octo-repo/pulls{/number}", + "milestones_url": "https://api.github.com/repos/octo-org/octo-repo/milestones{/number}", + "notifications_url": "https://api.github.com/repos/octo-org/octo-repo/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/octo-org/octo-repo/labels{/name}", + "releases_url": "https://api.github.com/repos/octo-org/octo-repo/releases{/id}", + "deployments_url": "https://api.github.com/repos/octo-org/octo-repo/deployments" + } + } + ] +} From 9ccf4bebd7872b64916f2540afd4d5d19b0ddd91 Mon Sep 17 00:00:00 2001 From: Mike Ball Date: Sun, 5 Feb 2023 08:02:39 -0500 Subject: [PATCH 08/98] remove errant and unnecessary 'await's Signed-off-by: Mike Ball --- .../src/components/Cards/RecentWorkflowRunsCard.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.test.tsx b/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.test.tsx index 5e0a5f3e15..f55cad8424 100644 --- a/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.test.tsx +++ b/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.test.tsx @@ -94,7 +94,7 @@ describe('', () => { ); it('renders a table with a row for each workflow', async () => { - const subject = await renderSubject(); + const subject = renderSubject(); workflowRuns.forEach(run => { expect(subject.getByText(run.message)).toBeInTheDocument(); @@ -102,7 +102,7 @@ describe('', () => { }); it('renders a workflow row correctly', async () => { - const subject = await renderSubject(); + const subject = renderSubject(); const [run] = workflowRuns; expect(subject.getByText(run.message).closest('a')).toHaveAttribute( 'href', From b623d1c8980a623cf04bd9ee44131536049bbd7a Mon Sep 17 00:00:00 2001 From: Mike Ball Date: Sun, 5 Feb 2023 08:28:35 -0500 Subject: [PATCH 09/98] add changeset documenting github-actions plugin fix Signed-off-by: Mike Ball --- .changeset/neat-elephants-breathe.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/neat-elephants-breathe.md diff --git a/.changeset/neat-elephants-breathe.md b/.changeset/neat-elephants-breathe.md new file mode 100644 index 0000000000..d1f88556e1 --- /dev/null +++ b/.changeset/neat-elephants-breathe.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-github-actions': patch +--- + +`yarn start` now starts a functional dev environment using a mock GitHub API to properly render the `` component. From 9f52a76778074d1d9405ac804c9aca9f5c0c5d53 Mon Sep 17 00:00:00 2001 From: ivgo Date: Fri, 3 Feb 2023 16:01:53 +0100 Subject: [PATCH 10/98] Remove node package, update api-report & props Signed-off-by: ivgo --- plugins/entity-validation/api-report.md | 9 +-- plugins/entity-validation/package.json | 2 +- .../EntityValidationOutput.tsx | 2 +- .../EntityValidationPage.tsx | 21 +++--- .../entity-validation/src/processingResult.ts | 73 +++++++++++++++++++ plugins/entity-validation/src/types.ts | 54 +++++++++++++- .../src/{utils => }/utils.ts | 6 +- plugins/entity-validation/src/utils/index.ts | 16 ---- yarn.lock | 2 +- 9 files changed, 146 insertions(+), 39 deletions(-) create mode 100644 plugins/entity-validation/src/processingResult.ts rename plugins/entity-validation/src/{utils => }/utils.ts (95%) delete mode 100644 plugins/entity-validation/src/utils/index.ts diff --git a/plugins/entity-validation/api-report.md b/plugins/entity-validation/api-report.md index 1a3b92a7c1..2fccbf9471 100644 --- a/plugins/entity-validation/api-report.md +++ b/plugins/entity-validation/api-report.md @@ -9,12 +9,9 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) -export const EntityValidationPage: ({ - defaultPreviewCatalog, - locationPlaceholder, -}: { - defaultPreviewCatalog?: string | undefined; - locationPlaceholder?: string | undefined; +export const EntityValidationPage: (props: { + defaultYaml?: string | undefined; + defaultLocation?: string | undefined; }) => JSX.Element; // @public (undocumented) diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index a6ea724473..3ff4f0ad5c 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -31,8 +31,8 @@ "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", - "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/theme": "workspace:^", "@codemirror/language": "^6.0.0", diff --git a/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx b/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx index f58fc90559..bc7e22ef54 100644 --- a/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx +++ b/plugins/entity-validation/src/components/EntityValidationOutput/EntityValidationOutput.tsx @@ -15,7 +15,6 @@ */ import React from 'react'; import { identityApiRef, useApi } from '@backstage/core-plugin-api'; -import { CatalogProcessorResult } from '@backstage/plugin-catalog-node'; import { catalogApiRef, humanizeEntityRef, @@ -25,6 +24,7 @@ import useAsync from 'react-use/lib/useAsync'; import { InfoCard, Progress } from '@backstage/core-components'; import Alert from '@material-ui/lab/Alert'; import { + CatalogProcessorResult, ValidationOutput, ValidationOutputError, ValidationOutputOk, diff --git a/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx index d39b234342..dc86af8763 100644 --- a/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx +++ b/plugins/entity-validation/src/components/EntityValidationPage/EntityValidationPage.tsx @@ -17,7 +17,7 @@ import React, { useState } from 'react'; import { Button, Content, Header, Page } from '@backstage/core-components'; import { EntityTextArea } from '../EntityTextArea'; import { Grid, TextField } from '@material-ui/core'; -import { CatalogProcessorResult } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorResult } from '../../types'; import { parseEntityYaml } from '../../utils'; import { EntityValidationOutput } from '../EntityValidationOutput'; @@ -36,14 +36,16 @@ spec: owner: owner `; -export const EntityValidationPage = ({ - defaultPreviewCatalog = EXAMPLE_CATALOG_INFO_YAML, - locationPlaceholder = 'https://github.com/backstage/backstage/blob/master/catalog-info.yaml', -}: { - defaultPreviewCatalog?: string; - locationPlaceholder?: string; +export const EntityValidationPage = (props: { + defaultYaml?: string; + defaultLocation?: string; }) => { - const [catalogYaml, setCatalogYaml] = useState(defaultPreviewCatalog); + const { + defaultYaml = EXAMPLE_CATALOG_INFO_YAML, + defaultLocation = 'https://github.com/backstage/backstage/blob/master/catalog-info.yaml', + } = props; + + const [catalogYaml, setCatalogYaml] = useState(defaultYaml); const [yamlFiles, setYamlFiles] = useState(); const [locationUrl, setLocationUrl] = useState(''); @@ -72,7 +74,8 @@ export const EntityValidationPage = ({ margin="normal" variant="outlined" required - placeholder={locationPlaceholder} + value={defaultLocation} + placeholder={defaultLocation} helperText="Location where you catalog-info.yaml file is, or will be, located" onChange={e => setLocationUrl(e.target.value)} /> diff --git a/plugins/entity-validation/src/processingResult.ts b/plugins/entity-validation/src/processingResult.ts new file mode 100644 index 0000000000..de9d8adbbd --- /dev/null +++ b/plugins/entity-validation/src/processingResult.ts @@ -0,0 +1,73 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// File copied from https://github.com/backstage/backstage/blob/master/plugins/catalog-node/src/api/processingResult.ts +import { InputError, NotFoundError } from '@backstage/errors'; +import { Entity } from '@backstage/catalog-model'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; +import { CatalogProcessorResult, EntityRelationSpec } from './types'; + +/** + * Factory functions for the standard processing result types. + * + * @public + */ +export const processingResult = Object.freeze({ + notFoundError( + atLocation: LocationSpec, + message: string, + ): CatalogProcessorResult { + return { + type: 'error', + location: atLocation, + error: new NotFoundError(message), + }; + }, + + inputError( + atLocation: LocationSpec, + message: string, + ): CatalogProcessorResult { + return { + type: 'error', + location: atLocation, + error: new InputError(message), + }; + }, + + generalError( + atLocation: LocationSpec, + message: string, + ): CatalogProcessorResult { + return { type: 'error', location: atLocation, error: new Error(message) }; + }, + + location(newLocation: LocationSpec): CatalogProcessorResult { + return { type: 'location', location: newLocation }; + }, + + entity(atLocation: LocationSpec, newEntity: Entity): CatalogProcessorResult { + return { type: 'entity', location: atLocation, entity: newEntity }; + }, + + relation(spec: EntityRelationSpec): CatalogProcessorResult { + return { type: 'relation', relation: spec }; + }, + + refresh(key: string): CatalogProcessorResult { + return { type: 'refresh', key }; + }, +} as const); diff --git a/plugins/entity-validation/src/types.ts b/plugins/entity-validation/src/types.ts index 69caf79e33..7ecc27bb25 100644 --- a/plugins/entity-validation/src/types.ts +++ b/plugins/entity-validation/src/types.ts @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import { CompoundEntityRef, Entity } from '@backstage/catalog-model'; import { ValidateEntityResponse } from '@backstage/catalog-client'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; export type ValidationOutputError = { type: 'error'; @@ -28,3 +29,54 @@ export type ValidationOutputOk = { }; export type ValidationOutput = ValidationOutputOk | ValidationOutputError; + +export type EntityRelationSpec = { + /** + * The source entity of this relation. + */ + source: CompoundEntityRef; + + /** + * The type of the relation. + */ + type: string; + + /** + * The target entity of this relation. + */ + target: CompoundEntityRef; +}; + +type CatalogProcessorLocationResult = { + type: 'location'; + location: LocationSpec; +}; + +type CatalogProcessorEntityResult = { + type: 'entity'; + entity: Entity; + location: LocationSpec; +}; + +type CatalogProcessorRelationResult = { + type: 'relation'; + relation: EntityRelationSpec; +}; + +type CatalogProcessorErrorResult = { + type: 'error'; + error: Error; + location: LocationSpec; +}; + +type CatalogProcessorRefreshKeysResult = { + type: 'refresh'; + key: string; +}; + +export type CatalogProcessorResult = + | CatalogProcessorLocationResult + | CatalogProcessorEntityResult + | CatalogProcessorRelationResult + | CatalogProcessorErrorResult + | CatalogProcessorRefreshKeysResult; diff --git a/plugins/entity-validation/src/utils/utils.ts b/plugins/entity-validation/src/utils.ts similarity index 95% rename from plugins/entity-validation/src/utils/utils.ts rename to plugins/entity-validation/src/utils.ts index dde50d2f9c..d81de6f6c9 100644 --- a/plugins/entity-validation/src/utils/utils.ts +++ b/plugins/entity-validation/src/utils.ts @@ -17,10 +17,8 @@ import { Entity, stringifyLocationRef } from '@backstage/catalog-model'; import lodash from 'lodash'; import yaml from 'yaml'; import { LocationSpec } from '@backstage/plugin-catalog-common'; -import { - CatalogProcessorResult, - processingResult, -} from '@backstage/plugin-catalog-node'; +import { CatalogProcessorResult } from './types'; +import { processingResult } from './processingResult'; // Copy from: https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/src/modules/util/parse.ts export function* parseEntityYaml( diff --git a/plugins/entity-validation/src/utils/index.ts b/plugins/entity-validation/src/utils/index.ts deleted file mode 100644 index 8d45a67a36..0000000000 --- a/plugins/entity-validation/src/utils/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export * from './utils'; diff --git a/yarn.lock b/yarn.lock index a3e9612ca6..7e53aaf8bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5770,8 +5770,8 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" + "@backstage/errors": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" - "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" From 4660b639475ff6d7806d7f5e69b0e3917d8d70a0 Mon Sep 17 00:00:00 2001 From: David Weber Date: Wed, 1 Feb 2023 19:44:09 +0100 Subject: [PATCH 11/98] feat: add TechDocs addon LightBox Signed-off-by: David Weber --- .changeset/silver-badgers-heal.md | 35 +++++++++ docs/features/techdocs/addons.md | 1 + packages/app/src/App.tsx | 2 + .../app/src/components/catalog/EntityPage.tsx | 2 + .../api-report.md | 3 + .../package.json | 1 + .../src/LigthBox/LightBox.test.tsx | 50 +++++++++++++ .../src/LigthBox/LightBox.tsx | 71 +++++++++++++++++++ .../src/LigthBox/index.ts | 16 +++++ .../src/LigthBox/lightbox.css | 7 ++ .../src/index.ts | 1 + .../src/plugin.ts | 47 ++++++++++++ .../TechDocsReaderPage/TechDocsReaderPage.tsx | 1 + yarn.lock | 8 +++ 14 files changed, 245 insertions(+) create mode 100644 .changeset/silver-badgers-heal.md create mode 100644 plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.test.tsx create mode 100644 plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx create mode 100644 plugins/techdocs-module-addons-contrib/src/LigthBox/index.ts create mode 100644 plugins/techdocs-module-addons-contrib/src/LigthBox/lightbox.css diff --git a/.changeset/silver-badgers-heal.md b/.changeset/silver-badgers-heal.md new file mode 100644 index 0000000000..b1f239c3dc --- /dev/null +++ b/.changeset/silver-badgers-heal.md @@ -0,0 +1,35 @@ +--- +'@backstage/plugin-techdocs-module-addons-contrib': patch +'@backstage/plugin-techdocs': patch +--- + +Create a TechDocs `` addon that allows users to open images in a light-box on documentation pages, they can navigate between images if there are several on one page. + +Here's an example on how to use it in a Backstage app: + +```diff +import { + DefaultTechDocsHome, + TechDocsIndexPage, + TechDocsReaderPage, +} from '@backstage/plugin-techdocs'; +import { TechDocsAddons } from '@backstage/plugin-techdocs-react/alpha'; ++import { LightBox } from '@backstage/plugin-techdocs-module-addons-contrib'; + +const AppRoutes = () => { + + // other plugin routes + }> + + + } + > + ++ + + + ; +}; +``` diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index fe1058b2ca..60999f599c 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -125,6 +125,7 @@ discover available Addons, we've compiled a list of them here: | [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.expandablenavigation) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to expand or collapse the entire TechDocs main navigation, and keeps the user's preferred state between documentation sites. | | [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.reportissue) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | | [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.textsize) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to customize text size on documentation pages, they can select how much they want to increase or decrease the font size via slider or buttons. The default value for font size is 100% and this setting is kept in the browser's local storage whenever it is changed. | +| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.lightbox) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to open images in a light-box on documentation pages, they can navigate between images if there are several on one page. The image size of the light-box image is the same as the image size on the document page. | Got an Addon to contribute? Feel free to add a row above! diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 8984a69259..f789328104 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -78,6 +78,7 @@ import { ExpandableNavigation, ReportIssue, TextSize, + LightBox, } from '@backstage/plugin-techdocs-module-addons-contrib'; import { SettingsLayout, @@ -203,6 +204,7 @@ const routes = ( + + ); diff --git a/plugins/techdocs-module-addons-contrib/api-report.md b/plugins/techdocs-module-addons-contrib/api-report.md index 68fad9121d..c242bb02f2 100644 --- a/plugins/techdocs-module-addons-contrib/api-report.md +++ b/plugins/techdocs-module-addons-contrib/api-report.md @@ -10,6 +10,9 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; // @public export const ExpandableNavigation: () => JSX.Element | null; +// @public +export const LightBox: () => JSX.Element | null; + // @public export const ReportIssue: (props: ReportIssueProps) => JSX.Element | null; diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 1b92e15c16..cd72b1a548 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -44,6 +44,7 @@ "@material-ui/lab": "4.0.0-alpha.57", "@react-hookz/web": "^20.0.0", "git-url-parse": "^13.0.0", + "photoswipe": "^5.3.5", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.test.tsx b/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.test.tsx new file mode 100644 index 0000000000..b63aed8777 --- /dev/null +++ b/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.test.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TechDocsAddonTester } from '@backstage/plugin-techdocs-addons-test-utils'; + +import React from 'react'; + +import { LightBox } from '../plugin'; + +describe('LightBox', () => { + it('renders without exploding', async () => { + const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom(TEST_CONTENT) + .renderWithEffects(); + + expect(getByText('TEST_CONTENT')).toBeInTheDocument(); + }); + + it('Add onclick event to images', async () => { + const { getByTestId } = await TechDocsAddonTester.buildAddonsInTechDocs([ + , + ]) + .withDom( + dog, + ) + .renderWithEffects(); + + expect(getByTestId('fixture').onclick).not.toBeUndefined(); + expect(getByTestId('fixture').onclick).toEqual(expect.any(Function)); + }); +}); diff --git a/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx b/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx new file mode 100644 index 0000000000..b74c2f9659 --- /dev/null +++ b/plugins/techdocs-module-addons-contrib/src/LigthBox/LightBox.tsx @@ -0,0 +1,71 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useEffect } from 'react'; +import { useShadowRootElements } from '@backstage/plugin-techdocs-react'; +// @ts-ignore +import PhotoSwipeLightbox, { DataSource } from 'photoswipe/lightbox'; +import PhotoSwipe from 'photoswipe'; +import 'photoswipe/style.css'; +import './lightbox.css'; + +export const LightBoxAddon = () => { + const images = useShadowRootElements(['img']); + + useEffect(() => { + let dataSourceImages: DataSource | null = null; + + let lightbox = new PhotoSwipeLightbox({ + pswpModule: PhotoSwipe, + wheelToZoom: true, + arrowPrevSVG: + '', + arrowNextSVG: + '', + closeSVG: + '', + zoomSVG: + '', + }); + + images.forEach((image, index) => { + image.onclick = () => { + if (dataSourceImages === null) { + dataSourceImages = images.map(dataSourceImage => { + return { + element: dataSourceImage, + src: dataSourceImage.src, + msrc: dataSourceImage.src, + alt: dataSourceImage.alt, + width: dataSourceImage.clientWidth, + height: dataSourceImage.clientHeight, + }; + }); + } + lightbox.loadAndOpen(index, dataSourceImages); + return false; + }; + }); + lightbox.init(); + + return () => { + lightbox.destroy(); + lightbox = null; + }; + }, [images]); + + return null; +}; diff --git a/plugins/techdocs-module-addons-contrib/src/LigthBox/index.ts b/plugins/techdocs-module-addons-contrib/src/LigthBox/index.ts new file mode 100644 index 0000000000..144359abb7 --- /dev/null +++ b/plugins/techdocs-module-addons-contrib/src/LigthBox/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './LightBox'; diff --git a/plugins/techdocs-module-addons-contrib/src/LigthBox/lightbox.css b/plugins/techdocs-module-addons-contrib/src/LigthBox/lightbox.css new file mode 100644 index 0000000000..63170792f1 --- /dev/null +++ b/plugins/techdocs-module-addons-contrib/src/LigthBox/lightbox.css @@ -0,0 +1,7 @@ +.pswp { + --pswp-bg: #f8f8f8; +} +.pswp__counter { + color: rgba(0, 0, 0, 0.87); + text-shadow: none; +} diff --git a/plugins/techdocs-module-addons-contrib/src/index.ts b/plugins/techdocs-module-addons-contrib/src/index.ts index 528afe5c0d..bad7701486 100644 --- a/plugins/techdocs-module-addons-contrib/src/index.ts +++ b/plugins/techdocs-module-addons-contrib/src/index.ts @@ -25,6 +25,7 @@ export { ExpandableNavigation, ReportIssue, TextSize, + LightBox, } from './plugin'; export type { ReportIssueProps, diff --git a/plugins/techdocs-module-addons-contrib/src/plugin.ts b/plugins/techdocs-module-addons-contrib/src/plugin.ts index 6136f176d0..c4023a72af 100644 --- a/plugins/techdocs-module-addons-contrib/src/plugin.ts +++ b/plugins/techdocs-module-addons-contrib/src/plugin.ts @@ -22,6 +22,7 @@ import { import { ExpandableNavigationAddon } from './ExpandableNavigation'; import { ReportIssueAddon, ReportIssueProps } from './ReportIssue'; import { TextSizeAddon } from './TextSize'; +import { LightBoxAddon } from './LigthBox'; /** * The TechDocs addons contrib plugin @@ -203,3 +204,49 @@ export const TextSize = techdocsModuleAddonsContribPlugin.provide( component: TextSizeAddon, }), ); + +/** + * This TechDocs addon allows users to open images in a lightbox on documentation pages, they can navigate between images if there are several on one page. + * + * @remarks + * The image size of the lightbox image is the same as the image size on the document page. + * + * @example + * Here's a simple example: + * ``` + * import { + * DefaultTechDocsHome, + * TechDocsIndexPage, + * TechDocsReaderPage, + * } from '@backstage/plugin-techdocs'; + * import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; + * import { LightBox } from '@backstage/plugin-techdocs-module-addons-contrib'; + * + * + * const AppRoutes = () => { + * + * // other plugin routes + * }> + * + * + * } + * > + * + * + * + * + * ; + * }; + * ``` + * + * @public + */ +export const LightBox = techdocsModuleAddonsContribPlugin.provide( + createTechDocsAddonExtension({ + name: 'LightBox', + location: TechDocsAddonLocations.Content, + component: LightBoxAddon, + }), +); diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx index ffe95e0b7e..ea7e4ed77b 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx @@ -102,6 +102,7 @@ CONFIGURATION 4: and provided content in + diff --git a/yarn.lock b/yarn.lock index f042b70bf5..4a15b8cf09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8225,6 +8225,7 @@ __metadata: cross-fetch: ^3.1.5 git-url-parse: ^13.0.0 msw: ^0.49.0 + photoswipe: ^5.3.5 react-use: ^17.2.4 peerDependencies: react: ^16.13.1 || ^17.0.0 @@ -31430,6 +31431,13 @@ __metadata: languageName: node linkType: hard +"photoswipe@npm:^5.3.5": + version: 5.3.5 + resolution: "photoswipe@npm:5.3.5" + checksum: bd3eafebffc114210b8e5403746b48a9bfe436cca05a65f8d5efd6eacea785a51f0f124d7326c8f651d754d76124c9768a920383843c4a619da582a86e535b27 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" From f3af36dc31eb36890eb6e8cfb9ae4faa622d1e0b Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 11:31:42 +0000 Subject: [PATCH 12/98] add failing test to createAsyncValidators Signed-off-by: Paul Cowan --- .../Stepper/createAsyncValidators.test.ts | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts index 6ad14e3cc4..ff7060222d 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts @@ -154,4 +154,83 @@ describe('createAsyncValidators', () => { }), }); }); + + it('should run validation on complex nested schemas', async () => { + const schema: JsonObject = { + title: 'Select component', + properties: { + actionType: { + title: 'action type', + type: 'string', + description: 'Select the action type', + enum: ['newThing', 'existingThing'], + enumNames: ['New thing', 'Existing thing'], + default: 'newThing', + }, + }, + required: ['actionType'], + dependencies: { + actionType: { + oneOf: [ + { + properties: { + actionType: { + enum: ['newThing'], + }, + general: { + title: 'General', + type: 'object', + properties: { + name: { + title: 'Name', + type: 'string', + 'ui:field': 'NameField', + }, + }, + }, + }, + }, + { + properties: { + actionType: { + enum: ['existingThing'], + }, + thingId: { + title: 'Thing id', + type: 'string', + description: 'Enter thing id', + }, + }, + }, + ], + }, + }, + }; + + const NameField: NextCustomFieldValidator = ( + value, + { addError }, + ) => { + if (!value) { + addError('something is broken here!'); + } + }; + + const validators = { + NameField: NameField as NextCustomFieldValidator, + }; + + const validate = createAsyncValidators(schema, validators, { + apiHolder: { get: jest.fn() }, + }); + + await validate({ + actionType: 'newThing', + general: { + name: undefined, + }, + }); + + expect(validators.NameField).toHaveBeenCalled(); + }); }); From 5555e1731349e55060b87d688f7ba6fa23077e88 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 14:34:09 +0000 Subject: [PATCH 13/98] refactor createAsyncValidators to be recursive Signed-off-by: Paul Cowan --- .changeset/shy-buses-mix.md | 5 +++ .../scaffolder/customScaffolderExtensions.tsx | 4 +-- .../src/next/components/Stepper/Stepper.tsx | 7 ++-- .../Stepper/createAsyncValidators.test.ts | 16 ++++++--- .../Stepper/createAsyncValidators.ts | 35 +++++++++++++----- .../src/next/components/Stepper/guards.ts | 36 +++++++++++++++++++ 6 files changed, 82 insertions(+), 21 deletions(-) create mode 100644 .changeset/shy-buses-mix.md create mode 100644 plugins/scaffolder-react/src/next/components/Stepper/guards.ts diff --git a/.changeset/shy-buses-mix.md b/.changeset/shy-buses-mix.md new file mode 100644 index 0000000000..868da1cc93 --- /dev/null +++ b/.changeset/shy-buses-mix.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +refactor createAsyncValidators to be recursive diff --git a/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx b/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx index c521bcf86c..fc37ff9e96 100644 --- a/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx +++ b/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx @@ -68,7 +68,7 @@ export const LowerCaseValuePickerFieldExtension = scaffolderPlugin.provide( const MockDelayComponent = ( props: NextFieldExtensionComponentProps<{ test?: string }>, ) => { - const { onChange, formData, rawErrors } = props; + const { onChange, formData, rawErrors = [] } = props; return ( onChange({ test: value })} margin="normal" - error={rawErrors?.length > 0 && !formData} + error={rawErrors.length > 0 && !formData} /> ); }; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index c97d31c487..bd298fcbae 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -35,6 +35,7 @@ import { useFormDataFromQuery } from '../../hooks'; import { FormProps } from '../../types'; import { LayoutOptions } from '../../../layouts'; import { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps'; +import { isInvalid } from './guards'; const useStyles = makeStyles(theme => ({ backButton: { @@ -136,11 +137,7 @@ export const Stepper = (stepperProps: StepperProps) => { const returnedValidation = await validation(formData); - const hasErrors = Object.values(returnedValidation).some( - i => i.__errors?.length, - ); - - if (hasErrors) { + if (isInvalid(returnedValidation)) { setErrors(returnedValidation); } else { setErrors(undefined); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts index ff7060222d..15fa944b0f 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts @@ -224,13 +224,19 @@ describe('createAsyncValidators', () => { apiHolder: { get: jest.fn() }, }); - await validate({ - actionType: 'newThing', + await expect( + validate({ + actionType: 'newThing', + general: { + name: undefined, + }, + }), + ).resolves.toEqual({ general: { - name: undefined, + name: expect.objectContaining({ + __errors: ['something is broken here!'], + }), }, }); - - expect(validators.NameField).toHaveBeenCalled(); }); }); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index 79466ee602..299a2451ce 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -15,12 +15,21 @@ */ import { FieldValidation } from '@rjsf/utils'; -import { JsonObject } from '@backstage/types'; +import type { JsonObject, JsonValue } from '@backstage/types'; import { ApiHolder } from '@backstage/core-plugin-api'; import { Draft07 as JSONSchema } from 'json-schema-library'; import { createFieldValidation } from '../../lib'; import { NextCustomFieldValidator } from '../../extensions'; +function isObject(value: JsonValue | undefined): value is JsonObject { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} + +type FormValidation = Record< + string, + FieldValidation | Record +>; + export const createAsyncValidators = ( rootSchema: JsonObject, validators: Record>, @@ -28,14 +37,17 @@ export const createAsyncValidators = ( apiHolder: ApiHolder; }, ) => { - async function validate(formData: JsonObject, pathPrefix: string = '#') { + async function validate( + formData: JsonObject, + pathPrefix: string = '#', + current: JsonObject = formData, + ): Promise> { const parsedSchema = new JSONSchema(rootSchema); - const formValidation: Record = {}; - for (const [key, value] of Object.entries(formData)) { - const definitionInSchema = parsedSchema.getSchema( - `${pathPrefix}/${key}`, - formData, - ); + const formValidation: FormValidation = {}; + + for (const [key, value] of Object.entries(current)) { + const path = `${pathPrefix}/${key}`; + const definitionInSchema = parsedSchema.getSchema(path, formData); if (definitionInSchema && 'ui:field' in definitionInSchema) { const validator = validators[definitionInSchema['ui:field']]; @@ -48,10 +60,15 @@ export const createAsyncValidators = ( } formValidation[key] = fieldValidation; } + } else if (isObject(value)) { + formValidation[key] = (await validate(formData, path, value)) as Record< + string, + FieldValidation + >; } } - return formValidation; + return formValidation as Record; } return async (formData: JsonObject) => { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/guards.ts b/plugins/scaffolder-react/src/next/components/Stepper/guards.ts new file mode 100644 index 0000000000..8dfedabd77 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Stepper/guards.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import type { FieldValidation } from '@rjsf/utils'; + +function isFieldValidation(error: any): error is FieldValidation { + return !!error && '__errors' in error; +} + +export function isInvalid(errors?: Record): boolean { + if (!errors) { + return false; + } + + for (const error of Object.values(errors)) { + if (isFieldValidation(error)) { + return (error.__errors ?? []).length > 0; + } + + return isInvalid(error); + } + + return false; +} From ba437049cc004ec0c6f29ba79c7e99be2cdf41d4 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 14:42:25 +0000 Subject: [PATCH 14/98] rename isInvalid to hasErrors Signed-off-by: Paul Cowan --- .../scaffolder-react/src/next/components/Stepper/Stepper.tsx | 4 ++-- .../scaffolder-react/src/next/components/Stepper/guards.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index bd298fcbae..e6e3295aaf 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -35,7 +35,7 @@ import { useFormDataFromQuery } from '../../hooks'; import { FormProps } from '../../types'; import { LayoutOptions } from '../../../layouts'; import { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps'; -import { isInvalid } from './guards'; +import { hasErrors } from './guards'; const useStyles = makeStyles(theme => ({ backButton: { @@ -137,7 +137,7 @@ export const Stepper = (stepperProps: StepperProps) => { const returnedValidation = await validation(formData); - if (isInvalid(returnedValidation)) { + if (hasErrors(returnedValidation)) { setErrors(returnedValidation); } else { setErrors(undefined); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/guards.ts b/plugins/scaffolder-react/src/next/components/Stepper/guards.ts index 8dfedabd77..c7afeb5664 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/guards.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/guards.ts @@ -19,7 +19,7 @@ function isFieldValidation(error: any): error is FieldValidation { return !!error && '__errors' in error; } -export function isInvalid(errors?: Record): boolean { +export function hasErrors(errors?: Record): boolean { if (!errors) { return false; } @@ -29,7 +29,7 @@ export function isInvalid(errors?: Record): boolean { return (error.__errors ?? []).length > 0; } - return isInvalid(error); + return hasErrors(error); } return false; From 65cffff8d0e4861e2e78fa09e803fb74bfeefb7f Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 14:56:39 +0000 Subject: [PATCH 15/98] refactor types Signed-off-by: Paul Cowan --- .../src/next/components/Stepper/Stepper.tsx | 9 +++++---- .../src/next/components/Stepper/createAsyncValidators.ts | 9 ++++++--- .../src/next/components/Stepper/guards.ts | 3 ++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index e6e3295aaf..eb30329cc6 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -27,7 +27,10 @@ import { ErrorSchema, FieldValidation } from '@rjsf/utils'; import React, { useCallback, useMemo, useState, type ReactNode } from 'react'; import { NextFieldExtensionOptions } from '../../extensions'; import { TemplateParameterSchema } from '../../../types'; -import { createAsyncValidators } from './createAsyncValidators'; +import { + createAsyncValidators, + type FormValidation, +} from './createAsyncValidators'; import { ReviewState, type ReviewStateProps } from '../ReviewState'; import { useTemplateSchema } from '../../hooks/useTemplateSchema'; import validator from '@rjsf/validator-ajv8'; @@ -93,9 +96,7 @@ export const Stepper = (stepperProps: StepperProps) => { const [activeStep, setActiveStep] = useState(0); const [formState, setFormState] = useFormDataFromQuery(props.initialState); - const [errors, setErrors] = useState< - undefined | Record - >(); + const [errors, setErrors] = useState(); const styles = useStyles(); const extensions = useMemo(() => { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index 299a2451ce..92774084b2 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -25,7 +25,10 @@ function isObject(value: JsonValue | undefined): value is JsonObject { return typeof value === 'object' && value !== null && !Array.isArray(value); } -type FormValidation = Record< +/** + * @internal + */ +export type FormValidation = Record< string, FieldValidation | Record >; @@ -41,7 +44,7 @@ export const createAsyncValidators = ( formData: JsonObject, pathPrefix: string = '#', current: JsonObject = formData, - ): Promise> { + ): Promise { const parsedSchema = new JSONSchema(rootSchema); const formValidation: FormValidation = {}; @@ -68,7 +71,7 @@ export const createAsyncValidators = ( } } - return formValidation as Record; + return formValidation; } return async (formData: JsonObject) => { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/guards.ts b/plugins/scaffolder-react/src/next/components/Stepper/guards.ts index c7afeb5664..647dc89af7 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/guards.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/guards.ts @@ -14,12 +14,13 @@ * limitations under the License. */ import type { FieldValidation } from '@rjsf/utils'; +import { FormValidation } from './createAsyncValidators'; function isFieldValidation(error: any): error is FieldValidation { return !!error && '__errors' in error; } -export function hasErrors(errors?: Record): boolean { +export function hasErrors(errors?: FormValidation): boolean { if (!errors) { return false; } From 18fd02197927f627c61ee715f53fae3cc127225b Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 14:57:25 +0000 Subject: [PATCH 16/98] refactor types Signed-off-by: Paul Cowan --- .../scaffolder-react/src/next/components/Stepper/Stepper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index eb30329cc6..a1ad289a1a 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -23,7 +23,7 @@ import { makeStyles, } from '@material-ui/core'; import { type IChangeEvent, withTheme } from '@rjsf/core-v5'; -import { ErrorSchema, FieldValidation } from '@rjsf/utils'; +import { ErrorSchema } from '@rjsf/utils'; import React, { useCallback, useMemo, useState, type ReactNode } from 'react'; import { NextFieldExtensionOptions } from '../../extensions'; import { TemplateParameterSchema } from '../../../types'; From 1b3a9bc042e39b45d8fb11361e4c5434c87c60a4 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 15:54:32 +0000 Subject: [PATCH 17/98] fix changeset Signed-off-by: Paul Cowan --- .changeset/shy-buses-mix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/shy-buses-mix.md b/.changeset/shy-buses-mix.md index 868da1cc93..c92b119664 100644 --- a/.changeset/shy-buses-mix.md +++ b/.changeset/shy-buses-mix.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-react': minor --- -refactor createAsyncValidators to be recursive +refactor `createAsyncValidators` to be recursive From 79dac4ac1e9ba684ee4a61388bc950b9f4820ab9 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 16:44:37 +0000 Subject: [PATCH 18/98] rename guards to utils Signed-off-by: Paul Cowan --- .changeset/shy-buses-mix.md | 2 +- .../scaffolder/customScaffolderExtensions.tsx | 4 ++-- .../src/next/components/Stepper/Stepper.tsx | 2 +- .../next/components/Stepper/createAsyncValidators.ts | 12 ++++-------- .../next/components/Stepper/{guards.ts => utils.ts} | 0 5 files changed, 8 insertions(+), 12 deletions(-) rename plugins/scaffolder-react/src/next/components/Stepper/{guards.ts => utils.ts} (100%) diff --git a/.changeset/shy-buses-mix.md b/.changeset/shy-buses-mix.md index c92b119664..b7db90d03c 100644 --- a/.changeset/shy-buses-mix.md +++ b/.changeset/shy-buses-mix.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-react': minor --- -refactor `createAsyncValidators` to be recursive +refactor `createAsyncValidators` to be recursive to ensure validators are called in nested schemas. diff --git a/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx b/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx index fc37ff9e96..c521bcf86c 100644 --- a/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx +++ b/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx @@ -68,7 +68,7 @@ export const LowerCaseValuePickerFieldExtension = scaffolderPlugin.provide( const MockDelayComponent = ( props: NextFieldExtensionComponentProps<{ test?: string }>, ) => { - const { onChange, formData, rawErrors = [] } = props; + const { onChange, formData, rawErrors } = props; return ( onChange({ test: value })} margin="normal" - error={rawErrors.length > 0 && !formData} + error={rawErrors?.length > 0 && !formData} /> ); }; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index a1ad289a1a..9242ef0086 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -38,7 +38,7 @@ import { useFormDataFromQuery } from '../../hooks'; import { FormProps } from '../../types'; import { LayoutOptions } from '../../../layouts'; import { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps'; -import { hasErrors } from './guards'; +import { hasErrors } from './utils'; const useStyles = makeStyles(theme => ({ backButton: { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index 92774084b2..eec1f368c6 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -28,10 +28,9 @@ function isObject(value: JsonValue | undefined): value is JsonObject { /** * @internal */ -export type FormValidation = Record< - string, - FieldValidation | Record ->; +export type FormValidation = { + [name: string]: FieldValidation | FormValidation; +}; export const createAsyncValidators = ( rootSchema: JsonObject, @@ -64,10 +63,7 @@ export const createAsyncValidators = ( formValidation[key] = fieldValidation; } } else if (isObject(value)) { - formValidation[key] = (await validate(formData, path, value)) as Record< - string, - FieldValidation - >; + formValidation[key] = await validate(formData, path, value); } } diff --git a/plugins/scaffolder-react/src/next/components/Stepper/guards.ts b/plugins/scaffolder-react/src/next/components/Stepper/utils.ts similarity index 100% rename from plugins/scaffolder-react/src/next/components/Stepper/guards.ts rename to plugins/scaffolder-react/src/next/components/Stepper/utils.ts From ba1f98a0385a08709d3e8b5e159a3fb06b04bc98 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Mon, 6 Feb 2023 20:37:22 +0000 Subject: [PATCH 19/98] move isObject into utils Signed-off-by: Paul Cowan --- .../src/next/components/Stepper/createAsyncValidators.ts | 7 ++----- .../scaffolder-react/src/next/components/Stepper/utils.ts | 5 +++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index eec1f368c6..86b7619b34 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -15,15 +15,12 @@ */ import { FieldValidation } from '@rjsf/utils'; -import type { JsonObject, JsonValue } from '@backstage/types'; +import type { JsonObject } from '@backstage/types'; import { ApiHolder } from '@backstage/core-plugin-api'; import { Draft07 as JSONSchema } from 'json-schema-library'; import { createFieldValidation } from '../../lib'; import { NextCustomFieldValidator } from '../../extensions'; - -function isObject(value: JsonValue | undefined): value is JsonObject { - return typeof value === 'object' && value !== null && !Array.isArray(value); -} +import { isObject } from './utils'; /** * @internal diff --git a/plugins/scaffolder-react/src/next/components/Stepper/utils.ts b/plugins/scaffolder-react/src/next/components/Stepper/utils.ts index 647dc89af7..e4da5882e5 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/utils.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/utils.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import type { JsonObject, JsonValue } from '@backstage/types'; import type { FieldValidation } from '@rjsf/utils'; import { FormValidation } from './createAsyncValidators'; @@ -35,3 +36,7 @@ export function hasErrors(errors?: FormValidation): boolean { return false; } + +export function isObject(value: JsonValue | undefined): value is JsonObject { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} From ccbf91051b7133e17a6a583f07199e6c30958014 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Tue, 7 Feb 2023 07:35:52 +0000 Subject: [PATCH 20/98] bump @rjsf v5 dependencies to 5.1.0 Signed-off-by: Paul Cowan --- .changeset/new-pumpkins-sleep.md | 6 +++ .../scaffolder/customScaffolderExtensions.tsx | 2 +- plugins/scaffolder-react/package.json | 8 ++-- plugins/scaffolder/package.json | 2 +- yarn.lock | 46 +++++++++---------- 5 files changed, 35 insertions(+), 29 deletions(-) create mode 100644 .changeset/new-pumpkins-sleep.md diff --git a/.changeset/new-pumpkins-sleep.md b/.changeset/new-pumpkins-sleep.md new file mode 100644 index 0000000000..cc5b89806d --- /dev/null +++ b/.changeset/new-pumpkins-sleep.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-scaffolder-react': patch +--- + +bump `@rjsf` `v5` dependencies to 5.1.0 diff --git a/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx b/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx index c521bcf86c..8a2e7fba53 100644 --- a/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx +++ b/packages/app/src/components/scaffolder/customScaffolderExtensions.tsx @@ -68,7 +68,7 @@ export const LowerCaseValuePickerFieldExtension = scaffolderPlugin.provide( const MockDelayComponent = ( props: NextFieldExtensionComponentProps<{ test?: string }>, ) => { - const { onChange, formData, rawErrors } = props; + const { onChange, formData, rawErrors = [] } = props; return ( =17 - checksum: befd0b39aab7462f23ed926ca17314a049f338e81cdda8233e35c45febb34e3d1ff550ca8db7e64570342be281e3556a4cb045b52af86a0a551041d5ee22472b + checksum: ff38046bb25de86b57e404c5d1ccea84b0485e916caf33a3cb25b030a38ed930a9b89a411671a7c29b047da38e0c682e20b43b13e61d77df770299385ba3c67a languageName: node linkType: hard @@ -12654,16 +12654,16 @@ __metadata: languageName: node linkType: hard -"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.0.1": - version: 5.0.1 - resolution: "@rjsf/material-ui@npm:5.0.1" +"@rjsf/material-ui-v5@npm:@rjsf/material-ui@5.1.0": + version: 5.1.0 + resolution: "@rjsf/material-ui@npm:5.1.0" peerDependencies: "@material-ui/core": ^4.12.3 "@material-ui/icons": ^4.11.2 "@rjsf/core": ^5.0.0 "@rjsf/utils": ^5.0.0 react: ^16.14.0 || >=17 - checksum: 041f21caef8fd8e594c3b517eea15344c97017d03de5e608b1aead3e94cca474dc874930b64f59b506c1e578889664718d07e1e580fcffc78611dad3d33099fc + checksum: f8e2c486f33a60703cae5bb42ae82bc431b3d743c239868ca71907e7b4127a39d1688200820c0c8acdf3ecd3f5eaddef4ba47264695feead28e9b439d9be7ce8 languageName: node linkType: hard @@ -12679,9 +12679,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/utils@npm:5.0.1": - version: 5.0.1 - resolution: "@rjsf/utils@npm:5.0.1" +"@rjsf/utils@npm:5.1.0": + version: 5.1.0 + resolution: "@rjsf/utils@npm:5.1.0" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -12690,21 +12690,21 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 7bf76106eced48cfdf3072a26306ff00d0792774dfe501b061db110e9dd2e17bead77bc9b335c85adf27926ab860c39ee4f676007f8f07e74a438f3a31004692 + checksum: 76d7caf144f98b1547067bfdc2b1baecf452c63bd9d6f2cae6c162a99154bb4d2f5033f6abc0e26ab767dca9ea743f1f5a9d796696e90dd5ed1fdca5ee3c5280 languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.0.1": - version: 5.0.1 - resolution: "@rjsf/validator-ajv8@npm:5.0.1" +"@rjsf/validator-ajv8@npm:5.1.0": + version: 5.1.0 + resolution: "@rjsf/validator-ajv8@npm:5.1.0" dependencies: - ajv: ^8.11.0 + ajv: ^8.12.0 ajv-formats: ^2.1.1 lodash: ^4.17.15 lodash-es: ^4.17.15 peerDependencies: "@rjsf/utils": ^5.0.0 - checksum: 7d36dac876fd3536dda26af5726e847af02a9880fac9feb2683809e8c1f3743e4f5ff8399e961a79f5383e28fdb5a1e9695d89ebf7dffaa22dd76948be830c54 + checksum: 3430a0aea8235deedd306b535ea3a62a9bcdd4dcf0bf1d022fe036041dceb5ca7c147b17ae50a0d25bb7c953729e987d96c68f5220f8fde4b56a89cf3f106a49 languageName: node linkType: hard @@ -16313,7 +16313,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.8.0": +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.12.0, ajv@npm:^8.8.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: From 71a5ec0f06a849a4ba120dc4f9b771960118ab24 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 Feb 2023 16:36:29 +0100 Subject: [PATCH 21/98] backend-plugin-api: inlined LogMeta type Signed-off-by: Patrik Oldsberg --- .changeset/selfish-frogs-punch.md | 5 ++++ .changeset/wild-donkeys-rescue.md | 6 ++++ packages/backend-app-api/api-report.md | 13 ++++----- .../src/logging/WinstonLogger.ts | 13 ++++----- packages/backend-plugin-api/api-report.md | 15 ++++------ .../src/services/definitions/LoggerService.ts | 15 ++++------ .../src/services/definitions/index.ts | 2 +- .../next/services/MockRootLoggerService.ts | 29 +++++++++++++------ 8 files changed, 54 insertions(+), 44 deletions(-) create mode 100644 .changeset/selfish-frogs-punch.md create mode 100644 .changeset/wild-donkeys-rescue.md diff --git a/.changeset/selfish-frogs-punch.md b/.changeset/selfish-frogs-punch.md new file mode 100644 index 0000000000..9dedd3544d --- /dev/null +++ b/.changeset/selfish-frogs-punch.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': minor +--- + +**BREAKING**: Inlined `LogMeta` type. diff --git a/.changeset/wild-donkeys-rescue.md b/.changeset/wild-donkeys-rescue.md new file mode 100644 index 0000000000..43dc3743bb --- /dev/null +++ b/.changeset/wild-donkeys-rescue.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-test-utils': patch +'@backstage/backend-app-api': patch +--- + +Updated usages of `LogMeta`. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 7ad4b590ab..67da4cb018 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -21,7 +21,6 @@ import { IdentityService } from '@backstage/backend-plugin-api'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { LogMeta } from '@backstage/backend-plugin-api'; import { PermissionsService } from '@backstage/backend-plugin-api'; import { PluginCacheManager } from '@backstage/backend-common'; import { PluginDatabaseManager } from '@backstage/backend-common'; @@ -263,21 +262,21 @@ export class WinstonLogger implements RootLoggerService { // (undocumented) addRedactions(redactions: Iterable): void; // (undocumented) - child(meta: LogMeta): LoggerService; + child(meta: Record): LoggerService; static colorFormat(): Format; static create(options: WinstonLoggerOptions): WinstonLogger; // (undocumented) - debug(message: string, meta?: LogMeta): void; + debug(message: string, meta?: Record): void; // (undocumented) - error(message: string, meta?: LogMeta): void; + error(message: string, meta?: Record): void; // (undocumented) - info(message: string, meta?: LogMeta): void; + info(message: string, meta?: Record): void; static redacter(): { format: Format; add: (redactions: Iterable) => void; }; // (undocumented) - warn(message: string, meta?: LogMeta): void; + warn(message: string, meta?: Record): void; } // @public (undocumented) @@ -287,7 +286,7 @@ export interface WinstonLoggerOptions { // (undocumented) level: string; // (undocumented) - meta?: LogMeta; + meta?: Record; // (undocumented) transports: transport[]; } diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index d32b816523..8d48015580 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -16,7 +16,6 @@ import { LoggerService, - LogMeta, RootLoggerService, } from '@backstage/backend-plugin-api'; import { Format, TransformableInfo } from 'logform'; @@ -33,7 +32,7 @@ import { escapeRegExp } from '../lib/escapeRegExp'; * @public */ export interface WinstonLoggerOptions { - meta?: LogMeta; + meta?: Record; level: string; format: Format; transports: Transport[]; @@ -150,23 +149,23 @@ export class WinstonLogger implements RootLoggerService { this.#addRedactions = addRedactions; } - error(message: string, meta?: LogMeta): void { + error(message: string, meta?: Record): void { this.#winston.error(message, meta); } - warn(message: string, meta?: LogMeta): void { + warn(message: string, meta?: Record): void { this.#winston.warn(message, meta); } - info(message: string, meta?: LogMeta): void { + info(message: string, meta?: Record): void { this.#winston.info(message, meta); } - debug(message: string, meta?: LogMeta): void { + debug(message: string, meta?: Record): void { this.#winston.debug(message, meta); } - child(meta: LogMeta): LoggerService { + child(meta: Record): LoggerService { return new WinstonLogger(this.#winston.child(meta)); } diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 8293ac193f..e0b8fdfa04 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -311,22 +311,17 @@ export interface LifecycleServiceShutdownOptions { // @public export interface LoggerService { // (undocumented) - child(meta: LogMeta): LoggerService; + child(meta: Record): LoggerService; // (undocumented) - debug(message: string, meta?: Error | LogMeta): void; + debug(message: string, meta?: Error | Record): void; // (undocumented) - error(message: string, meta?: Error | LogMeta): void; + error(message: string, meta?: Error | Record): void; // (undocumented) - info(message: string, meta?: Error | LogMeta): void; + info(message: string, meta?: Error | Record): void; // (undocumented) - warn(message: string, meta?: Error | LogMeta): void; + warn(message: string, meta?: Error | Record): void; } -// @public (undocumented) -export type LogMeta = { - [name: string]: unknown; -}; - // @public (undocumented) export interface PermissionsService extends PermissionEvaluator {} diff --git a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts index 269dfa0166..ce59b47007 100644 --- a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts +++ b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts @@ -14,21 +14,16 @@ * limitations under the License. */ -/** - * @public - */ -export type LogMeta = { [name: string]: unknown }; - /** * A service that provides a logging facility. * * @public */ export interface LoggerService { - error(message: string, meta?: Error | LogMeta): void; - warn(message: string, meta?: Error | LogMeta): void; - info(message: string, meta?: Error | LogMeta): void; - debug(message: string, meta?: Error | LogMeta): void; + error(message: string, meta?: Error | Record): void; + warn(message: string, meta?: Error | Record): void; + info(message: string, meta?: Error | Record): void; + debug(message: string, meta?: Error | Record): void; - child(meta: LogMeta): LoggerService; + child(meta: Record): LoggerService; } diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index 720b4d634d..35c2f0251c 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -30,7 +30,7 @@ export type { LifecycleServiceShutdownHook, LifecycleServiceShutdownOptions, } from './LifecycleService'; -export type { LoggerService, LogMeta } from './LoggerService'; +export type { LoggerService } from './LoggerService'; export type { PermissionsService } from './PermissionsService'; export type { PluginMetadataService } from './PluginMetadataService'; export type { RootHttpRouterService } from './RootHttpRouterService'; diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index 780d330bfb..5965792932 100644 --- a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -16,38 +16,49 @@ import { LoggerService, - LogMeta, RootLoggerService, } from '@backstage/backend-plugin-api'; import type { mockServices } from './mockServices'; export class MockRootLoggerService implements RootLoggerService { #levels: Exclude; - #meta: LogMeta; + #meta: Record; - error(message: string, meta?: LogMeta | Error | undefined): void { + error( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('error', message, meta); } - warn(message: string, meta?: LogMeta | Error | undefined): void { + warn( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('warn', message, meta); } - info(message: string, meta?: LogMeta | Error | undefined): void { + info( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('info', message, meta); } - debug(message: string, meta?: LogMeta | Error | undefined): void { + debug( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('debug', message, meta); } - child(meta: LogMeta): LoggerService { + child(meta: Record): LoggerService { return new MockRootLoggerService(this.#levels, { ...this.#meta, ...meta }); } constructor( levels: mockServices.rootLogger.Options['levels'], - meta: LogMeta, + meta: Record, ) { if (typeof levels === 'boolean') { this.#levels = { @@ -65,7 +76,7 @@ export class MockRootLoggerService implements RootLoggerService { #log( level: 'error' | 'warn' | 'info' | 'debug', message: string, - meta?: LogMeta | Error | undefined, + meta?: Record | Error | undefined, ) { if (this.#levels[level]) { const labels = Object.entries(this.#meta) From e42d1595cb6b6aaae04f490ae518f5302ef6ce18 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 7 Feb 2023 10:12:22 +0100 Subject: [PATCH 22/98] backend-common: work around missing logform dependency Signed-off-by: Patrik Oldsberg --- packages/backend-common/package.json | 1 + yarn.lock | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 9f1069f322..9ec68e5531 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -53,6 +53,7 @@ "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", + "@types/triple-beam": "^1.3.2", "@types/webpack-env": "^1.15.2", "archiver": "^5.0.2", "aws-sdk": "^2.840.0", diff --git a/yarn.lock b/yarn.lock index 6e252cb1c2..adcc15e13b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3457,6 +3457,7 @@ __metadata: "@types/stoppable": ^1.1.0 "@types/supertest": ^2.0.8 "@types/tar": ^6.1.1 + "@types/triple-beam": ^1.3.2 "@types/webpack-env": ^1.15.2 "@types/yauzl": ^2.10.0 archiver: ^5.0.2 @@ -15443,6 +15444,13 @@ __metadata: languageName: node linkType: hard +"@types/triple-beam@npm:^1.3.2": + version: 1.3.2 + resolution: "@types/triple-beam@npm:1.3.2" + checksum: dd7b4a563fb710abc992e5d59eac481bed9e303fada2e276e37b00be31c392e03300ee468e57761e616512872e77935f92472877d0704a19688d15a726cee17b + languageName: node + linkType: hard + "@types/trusted-types@npm:*": version: 2.0.2 resolution: "@types/trusted-types@npm:2.0.2" From 9c9456fd33adbcc74ed65a70f5b1c45464ea4b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 7 Feb 2023 10:35:38 +0100 Subject: [PATCH 23/98] Removed the unused TypesToServiceRef type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/dull-fishes-suffer.md | 5 +++++ packages/backend-plugin-api/api-report.md | 5 ----- packages/backend-plugin-api/src/services/system/index.ts | 1 - packages/backend-plugin-api/src/services/system/types.ts | 3 --- 4 files changed, 5 insertions(+), 9 deletions(-) create mode 100644 .changeset/dull-fishes-suffer.md diff --git a/.changeset/dull-fishes-suffer.md b/.changeset/dull-fishes-suffer.md new file mode 100644 index 0000000000..54baae404e --- /dev/null +++ b/.changeset/dull-fishes-suffer.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': patch +--- + +Removed the unused `TypesToServiceRef` type diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index a7700d81ac..0a23abf0f1 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -525,11 +525,6 @@ export interface TokenManagerService { }>; } -// @public (undocumented) -export type TypesToServiceRef = { - [key in keyof T]: ServiceRef; -}; - // @public export interface UrlReaderService { readTree(url: string, options?: ReadTreeOptions): Promise; diff --git a/packages/backend-plugin-api/src/services/system/index.ts b/packages/backend-plugin-api/src/services/system/index.ts index 74be9f8b11..2b91758cbc 100644 --- a/packages/backend-plugin-api/src/services/system/index.ts +++ b/packages/backend-plugin-api/src/services/system/index.ts @@ -17,7 +17,6 @@ export type { ServiceRef, ServiceRefConfig, - TypesToServiceRef, ServiceFactory, PluginServiceFactoryConfig, RootServiceFactoryConfig, diff --git a/packages/backend-plugin-api/src/services/system/types.ts b/packages/backend-plugin-api/src/services/system/types.ts index 2615c5e3a3..b414c72bc5 100644 --- a/packages/backend-plugin-api/src/services/system/types.ts +++ b/packages/backend-plugin-api/src/services/system/types.ts @@ -47,9 +47,6 @@ export type ServiceRef< $$ref: 'service'; }; -/** @public */ -export type TypesToServiceRef = { [key in keyof T]: ServiceRef }; - /** @public */ export type ServiceFactory = | { From b729f9f31f2feeb8f319f4b58906064ad7bbecf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 7 Feb 2023 10:49:45 +0100 Subject: [PATCH 24/98] Moved the options of the config service out to the factory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/silent-peas-fly.md | 5 +++++ packages/backend-app-api/api-report.md | 4 +++- .../implementations/config/configFactory.ts | 21 ++++++++++--------- 3 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 .changeset/silent-peas-fly.md diff --git a/.changeset/silent-peas-fly.md b/.changeset/silent-peas-fly.md new file mode 100644 index 0000000000..68dd6dfe47 --- /dev/null +++ b/.changeset/silent-peas-fly.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Moved the options of the config service out to the factory itself, where it belongs diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 7ad4b590ab..e7bdc40da5 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -53,7 +53,9 @@ export interface Backend { export const cacheFactory: () => ServiceFactory; // @public (undocumented) -export const configFactory: () => ServiceFactory; +export const configFactory: ( + options?: ConfigFactoryOptions | undefined, +) => ServiceFactory; // @public (undocumented) export interface ConfigFactoryOptions { diff --git a/packages/backend-app-api/src/services/implementations/config/configFactory.ts b/packages/backend-app-api/src/services/implementations/config/configFactory.ts index 0ec15c29fe..833730fdbd 100644 --- a/packages/backend-app-api/src/services/implementations/config/configFactory.ts +++ b/packages/backend-app-api/src/services/implementations/config/configFactory.ts @@ -35,13 +35,14 @@ export interface ConfigFactoryOptions { } /** @public */ -export const configFactory = createServiceFactory({ - service: coreServices.config, - deps: {}, - async factory({}, options?: ConfigFactoryOptions) { - const { argv = process.argv, remote } = options ?? {}; - - const { config } = await loadBackendConfig({ argv, remote }); - return config; - }, -}); +export const configFactory = createServiceFactory( + (options?: ConfigFactoryOptions) => ({ + service: coreServices.config, + deps: {}, + async factory({}) { + const { argv = process.argv, remote } = options ?? {}; + const { config } = await loadBackendConfig({ argv, remote }); + return config; + }, + }), +); From 5f98a682bb18c4b5607ff84ea7c2be0ae56f9ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 7 Feb 2023 11:15:21 +0100 Subject: [PATCH 25/98] root htt router too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/silent-peas-fly.md | 2 +- packages/backend-app-api/api-report.md | 4 +- .../rootHttpRouter/rootHttpRouterFactory.ts | 69 +++++++++---------- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/.changeset/silent-peas-fly.md b/.changeset/silent-peas-fly.md index 68dd6dfe47..8148cb5d12 100644 --- a/.changeset/silent-peas-fly.md +++ b/.changeset/silent-peas-fly.md @@ -2,4 +2,4 @@ '@backstage/backend-app-api': patch --- -Moved the options of the config service out to the factory itself, where it belongs +Moved the options of the `config` and `rootHttpRouter` services out to the factories themselves, where they belong diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index e7bdc40da5..8dc85d1728 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -232,7 +232,9 @@ export interface RootHttpRouterConfigureOptions { } // @public (undocumented) -export const rootHttpRouterFactory: () => ServiceFactory; +export const rootHttpRouterFactory: ( + options?: RootHttpRouterFactoryOptions | undefined, +) => ServiceFactory; // @public (undocumented) export type RootHttpRouterFactoryOptions = { diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts index f46f92741b..816c615817 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts @@ -69,45 +69,42 @@ function defaultConfigure({ } /** @public */ -export const rootHttpRouterFactory = createServiceFactory({ - service: coreServices.rootHttpRouter, - deps: { - config: coreServices.config, - rootLogger: coreServices.rootLogger, - lifecycle: coreServices.rootLifecycle, - }, - async factory( - { config, rootLogger, lifecycle }, - { - indexPath, - configure = defaultConfigure, - }: RootHttpRouterFactoryOptions = {}, - ) { - const logger = rootLogger.child({ service: 'rootHttpRouter' }); - const app = express(); +export const rootHttpRouterFactory = createServiceFactory( + (options?: RootHttpRouterFactoryOptions) => ({ + service: coreServices.rootHttpRouter, + deps: { + config: coreServices.config, + rootLogger: coreServices.rootLogger, + lifecycle: coreServices.rootLifecycle, + }, + async factory({ config, rootLogger, lifecycle }) { + const { indexPath, configure = defaultConfigure } = options ?? {}; + const logger = rootLogger.child({ service: 'rootHttpRouter' }); + const app = express(); - const router = DefaultRootHttpRouter.create({ indexPath }); - const middleware = MiddlewareFactory.create({ config, logger }); + const router = DefaultRootHttpRouter.create({ indexPath }); + const middleware = MiddlewareFactory.create({ config, logger }); - configure({ - app, - routes: router.handler(), - middleware, - config, - logger, - lifecycle, - }); + configure({ + app, + routes: router.handler(), + middleware, + config, + logger, + lifecycle, + }); - const server = await createHttpServer( - app, - readHttpServerOptions(config.getOptionalConfig('backend')), - { logger }, - ); + const server = await createHttpServer( + app, + readHttpServerOptions(config.getOptionalConfig('backend')), + { logger }, + ); - lifecycle.addShutdownHook(() => server.stop()); + lifecycle.addShutdownHook(() => server.stop()); - await server.start(); + await server.start(); - return router; - }, -}); + return router; + }, + }), +); From 7e7557a2be313064e79f5d3ab7fc68b26a3a57b8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 Feb 2023 16:58:42 +0100 Subject: [PATCH 26/98] backend-test-utils: switch levels to level for mock logger Signed-off-by: Patrik Oldsberg --- .changeset/hip-tables-prove.md | 5 + packages/backend-test-utils/api-report.md | 9 +- .../services/MockRootLoggerService.test.ts | 131 ++++++++++++++++++ .../next/services/MockRootLoggerService.ts | 41 +++--- .../src/next/services/mockServices.ts | 6 +- 5 files changed, 163 insertions(+), 29 deletions(-) create mode 100644 .changeset/hip-tables-prove.md create mode 100644 packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts diff --git a/.changeset/hip-tables-prove.md b/.changeset/hip-tables-prove.md new file mode 100644 index 0000000000..bc2c4e83d6 --- /dev/null +++ b/.changeset/hip-tables-prove.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Updated the `mockServices.rootLogger` options to accept a single level option instead. diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 672c574cb2..d99cf51866 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -91,14 +91,7 @@ export namespace mockServices { export namespace rootLogger { // (undocumented) export type Options = { - levels: - | boolean - | { - error: boolean; - warn: boolean; - info: boolean; - debug: boolean; - }; + level?: 'none' | 'error' | 'warn' | 'info' | 'debug'; }; const // (undocumented) factory: (options?: Options | undefined) => ServiceFactory; diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts new file mode 100644 index 0000000000..a3cbb5c384 --- /dev/null +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts @@ -0,0 +1,131 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MockRootLoggerService } from './MockRootLoggerService'; + +describe('MockRootLoggerService', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should be silent by default', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create(); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).not.toHaveBeenCalled(); + expect(console.warn).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set none level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'none' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).not.toHaveBeenCalled(); + expect(console.warn).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set error level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'error' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set warn level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'warn' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set info level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'info' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).toHaveBeenCalled(); + expect(console.info).toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set debug level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'debug' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).toHaveBeenCalled(); + expect(console.info).toHaveBeenCalled(); + expect(console.debug).toHaveBeenCalled(); + }); +}); diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index 5965792932..fabba82a0f 100644 --- a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -20,10 +20,28 @@ import { } from '@backstage/backend-plugin-api'; import type { mockServices } from './mockServices'; +const levels = { + none: 0, + error: 1, + warn: 2, + info: 3, + debug: 4, +}; + export class MockRootLoggerService implements RootLoggerService { - #levels: Exclude; + #level: number; #meta: Record; + static create( + options?: mockServices.rootLogger.Options, + ): MockRootLoggerService { + const level = options?.level ?? 'none'; + if (!(level in levels)) { + throw new Error(`Invalid log level '${level}'`); + } + return new MockRootLoggerService(levels[level], {}); + } + error( message: string, meta?: Record | Error | undefined, @@ -53,23 +71,11 @@ export class MockRootLoggerService implements RootLoggerService { } child(meta: Record): LoggerService { - return new MockRootLoggerService(this.#levels, { ...this.#meta, ...meta }); + return new MockRootLoggerService(this.#level, { ...this.#meta, ...meta }); } - constructor( - levels: mockServices.rootLogger.Options['levels'], - meta: Record, - ) { - if (typeof levels === 'boolean') { - this.#levels = { - error: levels, - debug: levels, - info: levels, - warn: levels, - }; - } else { - this.#levels = levels; - } + private constructor(level: number, meta: Record) { + this.#level = level; this.#meta = meta; } @@ -78,7 +84,8 @@ export class MockRootLoggerService implements RootLoggerService { message: string, meta?: Record | Error | undefined, ) { - if (this.#levels[level]) { + const levelValue = levels[level] ?? 0; + if (levelValue <= this.#level) { const labels = Object.entries(this.#meta) .map(([key, value]) => `${key}=${value}`) .join(','); diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 5f771f13c5..2a56bd78b8 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -67,13 +67,11 @@ export namespace mockServices { } export function rootLogger(options?: rootLogger.Options): LoggerService { - return new MockRootLoggerService(options?.levels ?? false, {}); + return MockRootLoggerService.create(options); } export namespace rootLogger { export type Options = { - levels: - | boolean - | { error: boolean; warn: boolean; info: boolean; debug: boolean }; + level?: 'none' | 'error' | 'warn' | 'info' | 'debug'; }; export const factory = simpleFactory(coreServices.rootLogger, rootLogger); From c769924e856cdf815b3193222611f2e578caa39e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 7 Feb 2023 11:43:08 +0100 Subject: [PATCH 27/98] backend-plugin-api: update old LogMeta to use JsonObject instead Signed-off-by: Patrik Oldsberg --- .changeset/selfish-frogs-punch.md | 2 +- packages/backend-app-api/api-report.md | 13 +++++---- .../src/logging/WinstonLogger.ts | 13 +++++---- .../src/logging/loggerToWinstonLogger.ts | 3 +- packages/backend-plugin-api/api-report.md | 11 +++---- .../src/services/definitions/LoggerService.ts | 12 ++++---- .../next/services/MockRootLoggerService.ts | 29 ++++++------------- 7 files changed, 39 insertions(+), 44 deletions(-) diff --git a/.changeset/selfish-frogs-punch.md b/.changeset/selfish-frogs-punch.md index 9dedd3544d..6484576af8 100644 --- a/.changeset/selfish-frogs-punch.md +++ b/.changeset/selfish-frogs-punch.md @@ -2,4 +2,4 @@ '@backstage/backend-plugin-api': minor --- -**BREAKING**: Inlined `LogMeta` type. +**BREAKING**: Switched out `LogMeta` type for `JsonObject`. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 67da4cb018..b7670747e4 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -18,6 +18,7 @@ import { HelmetOptions } from 'helmet'; import * as http from 'http'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import { IdentityService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { LoggerService } from '@backstage/backend-plugin-api'; @@ -262,21 +263,21 @@ export class WinstonLogger implements RootLoggerService { // (undocumented) addRedactions(redactions: Iterable): void; // (undocumented) - child(meta: Record): LoggerService; + child(meta: JsonObject): LoggerService; static colorFormat(): Format; static create(options: WinstonLoggerOptions): WinstonLogger; // (undocumented) - debug(message: string, meta?: Record): void; + debug(message: string, meta?: JsonObject): void; // (undocumented) - error(message: string, meta?: Record): void; + error(message: string, meta?: JsonObject): void; // (undocumented) - info(message: string, meta?: Record): void; + info(message: string, meta?: JsonObject): void; static redacter(): { format: Format; add: (redactions: Iterable) => void; }; // (undocumented) - warn(message: string, meta?: Record): void; + warn(message: string, meta?: JsonObject): void; } // @public (undocumented) @@ -286,7 +287,7 @@ export interface WinstonLoggerOptions { // (undocumented) level: string; // (undocumented) - meta?: Record; + meta?: JsonObject; // (undocumented) transports: transport[]; } diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index 8d48015580..06a189508b 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -18,6 +18,7 @@ import { LoggerService, RootLoggerService, } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import { Format, TransformableInfo } from 'logform'; import { Logger, @@ -32,7 +33,7 @@ import { escapeRegExp } from '../lib/escapeRegExp'; * @public */ export interface WinstonLoggerOptions { - meta?: Record; + meta?: JsonObject; level: string; format: Format; transports: Transport[]; @@ -149,23 +150,23 @@ export class WinstonLogger implements RootLoggerService { this.#addRedactions = addRedactions; } - error(message: string, meta?: Record): void { + error(message: string, meta?: JsonObject): void { this.#winston.error(message, meta); } - warn(message: string, meta?: Record): void { + warn(message: string, meta?: JsonObject): void { this.#winston.warn(message, meta); } - info(message: string, meta?: Record): void { + info(message: string, meta?: JsonObject): void { this.#winston.info(message, meta); } - debug(message: string, meta?: Record): void { + debug(message: string, meta?: JsonObject): void { this.#winston.debug(message, meta); } - child(meta: Record): LoggerService { + child(meta: JsonObject): LoggerService { return new WinstonLogger(this.#winston.child(meta)); } diff --git a/packages/backend-common/src/logging/loggerToWinstonLogger.ts b/packages/backend-common/src/logging/loggerToWinstonLogger.ts index f15bd5be81..4ba88358d2 100644 --- a/packages/backend-common/src/logging/loggerToWinstonLogger.ts +++ b/packages/backend-common/src/logging/loggerToWinstonLogger.ts @@ -15,6 +15,7 @@ */ import { LoggerService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import { Logger as WinstonLogger, createLogger } from 'winston'; import Transport, { TransportStreamOptions } from 'winston-transport'; @@ -31,7 +32,7 @@ class BackstageLoggerTransport extends Transport { callback(); return; } - const { level, message, ...meta } = info as { [name: string]: unknown }; + const { level, message, ...meta } = info as JsonObject; switch (level) { case 'error': this.backstageLogger.error(String(message), meta); diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index e0b8fdfa04..3ad972020d 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -8,6 +8,7 @@ import { Config } from '@backstage/config'; import { Handler } from 'express'; import { IdentityApi } from '@backstage/plugin-auth-node'; +import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; @@ -311,15 +312,15 @@ export interface LifecycleServiceShutdownOptions { // @public export interface LoggerService { // (undocumented) - child(meta: Record): LoggerService; + child(meta: JsonObject): LoggerService; // (undocumented) - debug(message: string, meta?: Error | Record): void; + debug(message: string, meta?: Error | JsonObject): void; // (undocumented) - error(message: string, meta?: Error | Record): void; + error(message: string, meta?: Error | JsonObject): void; // (undocumented) - info(message: string, meta?: Error | Record): void; + info(message: string, meta?: Error | JsonObject): void; // (undocumented) - warn(message: string, meta?: Error | Record): void; + warn(message: string, meta?: Error | JsonObject): void; } // @public (undocumented) diff --git a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts index ce59b47007..2e4edc60be 100644 --- a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts +++ b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts @@ -14,16 +14,18 @@ * limitations under the License. */ +import { JsonObject } from '@backstage/types'; + /** * A service that provides a logging facility. * * @public */ export interface LoggerService { - error(message: string, meta?: Error | Record): void; - warn(message: string, meta?: Error | Record): void; - info(message: string, meta?: Error | Record): void; - debug(message: string, meta?: Error | Record): void; + error(message: string, meta?: Error | JsonObject): void; + warn(message: string, meta?: Error | JsonObject): void; + info(message: string, meta?: Error | JsonObject): void; + debug(message: string, meta?: Error | JsonObject): void; - child(meta: Record): LoggerService; + child(meta: JsonObject): LoggerService; } diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index fabba82a0f..8b973eeeab 100644 --- a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -18,6 +18,7 @@ import { LoggerService, RootLoggerService, } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import type { mockServices } from './mockServices'; const levels = { @@ -30,7 +31,7 @@ const levels = { export class MockRootLoggerService implements RootLoggerService { #level: number; - #meta: Record; + #meta: JsonObject; static create( options?: mockServices.rootLogger.Options, @@ -42,39 +43,27 @@ export class MockRootLoggerService implements RootLoggerService { return new MockRootLoggerService(levels[level], {}); } - error( - message: string, - meta?: Record | Error | undefined, - ): void { + error(message: string, meta?: JsonObject | Error | undefined): void { this.#log('error', message, meta); } - warn( - message: string, - meta?: Record | Error | undefined, - ): void { + warn(message: string, meta?: JsonObject | Error | undefined): void { this.#log('warn', message, meta); } - info( - message: string, - meta?: Record | Error | undefined, - ): void { + info(message: string, meta?: JsonObject | Error | undefined): void { this.#log('info', message, meta); } - debug( - message: string, - meta?: Record | Error | undefined, - ): void { + debug(message: string, meta?: JsonObject | Error | undefined): void { this.#log('debug', message, meta); } - child(meta: Record): LoggerService { + child(meta: JsonObject): LoggerService { return new MockRootLoggerService(this.#level, { ...this.#meta, ...meta }); } - private constructor(level: number, meta: Record) { + private constructor(level: number, meta: JsonObject) { this.#level = level; this.#meta = meta; } @@ -82,7 +71,7 @@ export class MockRootLoggerService implements RootLoggerService { #log( level: 'error' | 'warn' | 'info' | 'debug', message: string, - meta?: Record | Error | undefined, + meta?: JsonObject | Error | undefined, ) { const levelValue = levels[level] ?? 0; if (levelValue <= this.#level) { From 9a3063377af82a363aa311dcd7a9636ff8dfcaab Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 7 Feb 2023 11:34:06 +0100 Subject: [PATCH 28/98] backend-plugin-api: simplify feature factory implementations Signed-off-by: Patrik Oldsberg --- .../src/wiring/factories.ts | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/packages/backend-plugin-api/src/wiring/factories.ts b/packages/backend-plugin-api/src/wiring/factories.ts index 26a65c292a..be55474904 100644 --- a/packages/backend-plugin-api/src/wiring/factories.ts +++ b/packages/backend-plugin-api/src/wiring/factories.ts @@ -17,7 +17,6 @@ import { BackendModuleRegistrationPoints, BackendPluginRegistrationPoints, - BackendRegistrationPoints, BackendFeature, ExtensionPoint, } from './types'; @@ -86,19 +85,14 @@ export interface BackendPluginConfig { export function createBackendPlugin( config: BackendPluginConfig | ((...params: TOptions) => BackendPluginConfig), ): (...params: TOptions) => BackendFeature { - if (typeof config === 'function') { - return (...options: TOptions) => { - const c = config(...options); - return { - ...c, - id: c.pluginId, - }; + const configCallback = typeof config === 'function' ? config : () => config; + return (...options: TOptions) => { + const c = configCallback(...options); + return { + ...c, + id: c.pluginId, }; - } - return () => ({ - ...config, - id: config.pluginId, - }); + }; } /** @@ -132,21 +126,12 @@ export interface BackendModuleConfig { export function createBackendModule( config: BackendModuleConfig | ((...params: TOptions) => BackendModuleConfig), ): (...params: TOptions) => BackendFeature { - if (typeof config === 'function') { - return (...options: TOptions) => { - const c = config(...options); - return { - id: `${c.pluginId}.${c.moduleId}`, - register: c.register, - }; + const configCallback = typeof config === 'function' ? config : () => config; + return (...options: TOptions) => { + const c = configCallback(...options); + return { + id: `${c.pluginId}.${c.moduleId}`, + register: c.register, }; - } - return () => ({ - id: `${config.pluginId}.${config.moduleId}`, - register(register: BackendRegistrationPoints) { - return config.register({ - registerInit: register.registerInit.bind(register), - }); - }, - }); + }; } From 783c54d497771958c422bb6d85f9a7b4ec0fe45a Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 12:07:20 +0100 Subject: [PATCH 29/98] chore: ignore this dependency in the typechecking Signed-off-by: blam --- packages/repo-tools/src/commands/type-deps/type-deps.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/repo-tools/src/commands/type-deps/type-deps.ts b/packages/repo-tools/src/commands/type-deps/type-deps.ts index 4f8e5e5529..852cec34d2 100644 --- a/packages/repo-tools/src/commands/type-deps/type-deps.ts +++ b/packages/repo-tools/src/commands/type-deps/type-deps.ts @@ -196,6 +196,14 @@ function findTypeDepErrors(typeDeps: string[], pkg: Package) { } for (const dep of deps) { + // Remove this once the logform issue has been fixed. + // https://github.com/winstonjs/logform/issues/242 + if ( + pkg.packageJson.name === '@backstage/backend-common' && + dep === '@types/triple-beam' + ) { + continue; + } errors.push( mkErr('WrongDepError', `Should be dev dep ${dep}`, { dep, From 70ae2c363496ce54033adb1af80936ed6f62ae01 Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Tue, 7 Feb 2023 11:32:34 +0000 Subject: [PATCH 30/98] fix stepper hasErrors to not bottom out at first error Signed-off-by: Paul Cowan --- .changeset/chilled-rice-own.md | 5 ++ .../Stepper/createAsyncValidators.test.ts | 33 ++++++++++ .../src/next/components/Stepper/utils.test.ts | 61 +++++++++++++++++++ .../src/next/components/Stepper/utils.ts | 6 +- 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 .changeset/chilled-rice-own.md create mode 100644 plugins/scaffolder-react/src/next/components/Stepper/utils.test.ts diff --git a/.changeset/chilled-rice-own.md b/.changeset/chilled-rice-own.md new file mode 100644 index 0000000000..58810734cf --- /dev/null +++ b/.changeset/chilled-rice-own.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': patch +--- + +fix `stepper` `hasErrors` to not bottom out at first error diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts index 15fa944b0f..fe8b41a9f3 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts @@ -181,6 +181,18 @@ describe('createAsyncValidators', () => { title: 'General', type: 'object', properties: { + address: { + type: 'object', + 'ui:field': 'AddressField', + properties: { + street: { + type: 'string', + }, + postcode: { + type: 'string', + }, + }, + }, name: { title: 'Name', type: 'string', @@ -207,6 +219,19 @@ describe('createAsyncValidators', () => { }, }; + const AddressField: NextCustomFieldValidator<{ + street?: string; + postcode?: string; + }> = (value, { addError }) => { + if (!value.postcode) { + addError('postcode is missing!'); + } + + if (!value.street) { + addError('street is missing here!'); + } + }; + const NameField: NextCustomFieldValidator = ( value, { addError }, @@ -217,6 +242,7 @@ describe('createAsyncValidators', () => { }; const validators = { + AddressField: AddressField as NextCustomFieldValidator, NameField: NameField as NextCustomFieldValidator, }; @@ -228,11 +254,18 @@ describe('createAsyncValidators', () => { validate({ actionType: 'newThing', general: { + address: { + street: 'street', + postcode: 'postcode', + }, name: undefined, }, }), ).resolves.toEqual({ general: { + address: expect.objectContaining({ + __errors: [], + }), name: expect.objectContaining({ __errors: ['something is broken here!'], }), diff --git a/plugins/scaffolder-react/src/next/components/Stepper/utils.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/utils.test.ts new file mode 100644 index 0000000000..f6a1b012ac --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/Stepper/utils.test.ts @@ -0,0 +1,61 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { hasErrors } from './utils'; + +describe('hasErrors', () => { + it('should return false for empty _errors', () => { + expect( + hasErrors({ + name: { + __errors: [], + addError: jest.fn(), + }, + }), + ).toBe(false); + }); + + it('should return true for a single error', () => { + expect( + hasErrors({ + name: { + __errors: ['an error'], + addError: jest.fn(), + }, + }), + ).toBe(true); + }); + + it('should return true for more than one error', () => { + expect( + hasErrors({ + name: { + __errors: [], + addError: jest.fn(), + }, + general: { + address: { + __errors: [], + addError: jest.fn(), + }, + name: { + __errors: ['something is broken here!'], + addError: jest.fn(), + }, + }, + }), + ).toBe(true); + }); +}); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/utils.ts b/plugins/scaffolder-react/src/next/components/Stepper/utils.ts index e4da5882e5..7d3efa9d94 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/utils.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/utils.ts @@ -28,7 +28,11 @@ export function hasErrors(errors?: FormValidation): boolean { for (const error of Object.values(errors)) { if (isFieldValidation(error)) { - return (error.__errors ?? []).length > 0; + if ((error.__errors ?? []).length > 0) { + return true; + } + + continue; } return hasErrors(error); From 9603cc9e816d7c1d3f6402df424fd3a97a645378 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 7 Feb 2023 12:37:55 +0100 Subject: [PATCH 31/98] Delete chilled-rice-own.md Signed-off-by: Ben Lambert --- .changeset/chilled-rice-own.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/chilled-rice-own.md diff --git a/.changeset/chilled-rice-own.md b/.changeset/chilled-rice-own.md deleted file mode 100644 index 58810734cf..0000000000 --- a/.changeset/chilled-rice-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -fix `stepper` `hasErrors` to not bottom out at first error From 610d65e143b6bd86bc0fe6cb1d250b6636bde3e4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 7 Feb 2023 13:11:24 +0100 Subject: [PATCH 32/98] backend-plugin-api: make BackendFeature opaque Signed-off-by: Patrik Oldsberg --- .changeset/nervous-phones-shout.md | 6 ++ .changeset/yellow-roses-tell.md | 5 + .../src/wiring/BackendInitializer.ts | 81 +++++++------- packages/backend-app-api/src/wiring/types.ts | 6 +- packages/backend-plugin-api/api-report.md | 24 +---- .../src/wiring/factories.test.ts | 59 ++++++++-- .../src/wiring/factories.ts | 101 ++++++++++++++++-- .../backend-plugin-api/src/wiring/index.ts | 1 - .../backend-plugin-api/src/wiring/types.ts | 55 ++++++---- .../src/next/wiring/TestBackend.ts | 21 ++-- 10 files changed, 250 insertions(+), 109 deletions(-) create mode 100644 .changeset/nervous-phones-shout.md create mode 100644 .changeset/yellow-roses-tell.md diff --git a/.changeset/nervous-phones-shout.md b/.changeset/nervous-phones-shout.md new file mode 100644 index 0000000000..a4e46b3be9 --- /dev/null +++ b/.changeset/nervous-phones-shout.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-test-utils': patch +'@backstage/backend-app-api': patch +--- + +Updates to match new `BackendFeature` type. diff --git a/.changeset/yellow-roses-tell.md b/.changeset/yellow-roses-tell.md new file mode 100644 index 0000000000..ad645df294 --- /dev/null +++ b/.changeset/yellow-roses-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': minor +--- + +Switched `BackendFeature` to be an opaque type. diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 4bdee8b085..6c551f082f 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -26,10 +26,13 @@ import { EnumerableServiceHolder, ServiceOrExtensionPoint, } from './types'; +// Direct internal import to avoid duplication +// eslint-disable-next-line @backstage/no-forbidden-package-imports +import { InternalBackendFeature } from '@backstage/backend-plugin-api/src/wiring/types'; export class BackendInitializer { #startPromise?: Promise; - #features = new Map(); + #features = new Array(); #registerInits = new Array(); #extensionPoints = new Map, unknown>(); #serviceHolder: EnumerableServiceHolder; @@ -74,11 +77,22 @@ export class BackendInitializer { return Object.fromEntries(result); } - add(feature: BackendFeature, options?: TOptions) { + add(feature: BackendFeature) { if (this.#startPromise) { throw new Error('feature can not be added after the backend has started'); } - this.#features.set(feature, options); + if (feature.$$type !== '@backstage/BackendFeature') { + throw new Error( + `Failed to add feature, invalid type '${feature.$$type}'`, + ); + } + const internalFeature = feature as InternalBackendFeature; + if (internalFeature.version !== 'v1') { + throw new Error( + `Failed to add feature, invalid version '${internalFeature.version}'`, + ); + } + this.#features.push(internalFeature); } async start(): Promise { @@ -117,50 +131,39 @@ export class BackendInitializer { } // Initialize all features - for (const [feature] of this.#features) { - const provides = new Set>(); + for (const feature of this.#features) { + for (const r of feature.getRegistrations()) { + const provides = new Set>(); - let registerInit: BackendRegisterInit | undefined = undefined; + if (r.type === 'plugin') { + for (const [extRef, extImpl] of r.extensionPoints) { + if (this.#extensionPoints.has(extRef)) { + throw new Error( + `ExtensionPoint with ID '${extRef.id}' is already registered`, + ); + } + this.#extensionPoints.set(extRef, extImpl); + provides.add(extRef); + } + } - feature.register({ - registerExtensionPoint: (extensionPointRef, impl) => { - if (registerInit) { - throw new Error('registerExtensionPoint called after registerInit'); - } - if (this.#extensionPoints.has(extensionPointRef)) { - throw new Error(`API ${extensionPointRef.id} already registered`); - } - this.#extensionPoints.set(extensionPointRef, impl); - provides.add(extensionPointRef); - }, - registerInit: registerOptions => { - if (registerInit) { - throw new Error('registerInit must only be called once'); - } - registerInit = { - id: feature.id, - provides, - consumes: new Set(Object.values(registerOptions.deps)), - deps: registerOptions.deps, - init: registerOptions.init as BackendRegisterInit['init'], - }; - }, - }); - - if (!registerInit) { - throw new Error( - `registerInit was not called by register in ${feature.id}`, - ); + this.#registerInits.push({ + id: r.type === 'plugin' ? r.pluginId : `${r.pluginId}.${r.moduleId}`, + provides, + consumes: new Set(Object.values(r.init.deps)), + init: r.init, + }); } - - this.#registerInits.push(registerInit); } const orderedRegisterResults = this.#resolveInitOrder(this.#registerInits); for (const registerInit of orderedRegisterResults) { - const deps = await this.#getInitDeps(registerInit.deps, registerInit.id); - await registerInit.init(deps); + const deps = await this.#getInitDeps( + registerInit.init.deps, + registerInit.id, + ); + await registerInit.init.func(deps); } } diff --git a/packages/backend-app-api/src/wiring/types.ts b/packages/backend-app-api/src/wiring/types.ts index d3c4fc48c7..2a91bf46b9 100644 --- a/packages/backend-app-api/src/wiring/types.ts +++ b/packages/backend-app-api/src/wiring/types.ts @@ -34,8 +34,10 @@ export interface BackendRegisterInit { id: string; consumes: Set; provides: Set; - deps: { [name: string]: ServiceOrExtensionPoint }; - init: (deps: { [name: string]: unknown }) => Promise; + init: { + deps: { [name: string]: ServiceOrExtensionPoint }; + func: (deps: { [name: string]: unknown }) => Promise; + }; } /** diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 4b8e0298ec..6dbafd0242 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -17,9 +17,7 @@ import { Readable } from 'stream'; // @public (undocumented) export interface BackendFeature { // (undocumented) - id: string; - // (undocumented) - register(reg: BackendRegistrationPoints): void; + $$type: '@backstage/BackendFeature'; } // @public @@ -72,26 +70,6 @@ export interface BackendPluginRegistrationPoints { }): void; } -// @public -export interface BackendRegistrationPoints { - // (undocumented) - registerExtensionPoint( - ref: ExtensionPoint, - impl: TExtensionPoint, - ): void; - // (undocumented) - registerInit< - Deps extends { - [name in string]: unknown; - }, - >(options: { - deps: { - [name in keyof Deps]: ServiceRef | ExtensionPoint; - }; - init(deps: Deps): Promise; - }): void; -} - // @public export interface CacheClient { delete(key: string): Promise; diff --git a/packages/backend-plugin-api/src/wiring/factories.test.ts b/packages/backend-plugin-api/src/wiring/factories.test.ts index 8e1b30ea53..ae199d84e4 100644 --- a/packages/backend-plugin-api/src/wiring/factories.test.ts +++ b/packages/backend-plugin-api/src/wiring/factories.test.ts @@ -19,6 +19,7 @@ import { createBackendPlugin, createExtensionPoint, } from './factories'; +import { InternalBackendFeature } from './types'; describe('createExtensionPoint', () => { it('should create an ExtensionPoint', () => { @@ -34,11 +35,30 @@ describe('createBackendPlugin', () => { it('should create a BackendPlugin', () => { const plugin = createBackendPlugin((_options: { a: string }) => ({ pluginId: 'x', - register() {}, + register(r) { + r.registerInit({ deps: {}, async init() {} }); + }, })); expect(plugin).toBeDefined(); expect(plugin({ a: 'a' })).toBeDefined(); - expect(plugin({ a: 'a' }).id).toBe('x'); + expect(plugin({ a: 'a' })).toEqual({ + $$type: '@backstage/BackendFeature', + version: 'v1', + getRegistrations: expect.any(Function), + }); + expect( + (plugin({ a: 'a' }) as InternalBackendFeature).getRegistrations(), + ).toEqual([ + { + type: 'plugin', + pluginId: 'x', + extensionPoints: [], + init: { + deps: expect.any(Object), + func: expect.any(Function), + }, + }, + ]); // @ts-expect-error expect(plugin()).toBeDefined(); // @ts-expect-error @@ -79,7 +99,11 @@ describe('createBackendPlugin', () => { })); expect(plugin).toBeDefined(); expect(plugin({ a: 'a' })).toBeDefined(); - expect(plugin({ a: 'a' }).id).toBe('x'); + expect(plugin({ a: 'a' })).toEqual({ + $$type: '@backstage/BackendFeature', + version: 'v1', + getRegistrations: expect.any(Function), + }); // @ts-expect-error expect(plugin()).toBeDefined(); // @ts-expect-error @@ -107,11 +131,30 @@ describe('createBackendModule', () => { const mod = createBackendModule((_options: { a: string }) => ({ pluginId: 'x', moduleId: 'y', - register() {}, + register(r) { + r.registerInit({ deps: {}, async init() {} }); + }, })); expect(mod).toBeDefined(); expect(mod({ a: 'a' })).toBeDefined(); - expect(mod({ a: 'a' }).id).toBe('x.y'); + expect(mod({ a: 'a' })).toEqual({ + $$type: '@backstage/BackendFeature', + version: 'v1', + getRegistrations: expect.any(Function), + }); + expect( + (mod({ a: 'a' }) as InternalBackendFeature).getRegistrations(), + ).toEqual([ + { + type: 'module', + pluginId: 'x', + moduleId: 'y', + init: { + deps: expect.any(Object), + func: expect.any(Function), + }, + }, + ]); // @ts-expect-error expect(mod()).toBeDefined(); // @ts-expect-error @@ -155,7 +198,11 @@ describe('createBackendModule', () => { })); expect(mod).toBeDefined(); expect(mod({ a: 'a' })).toBeDefined(); - expect(mod({ a: 'a' }).id).toBe('x.y'); + expect(mod({ a: 'a' })).toEqual({ + $$type: '@backstage/BackendFeature', + version: 'v1', + getRegistrations: expect.any(Function), + }); // @ts-expect-error expect(mod()).toBeDefined(); // @ts-expect-error diff --git a/packages/backend-plugin-api/src/wiring/factories.ts b/packages/backend-plugin-api/src/wiring/factories.ts index be55474904..928c933af0 100644 --- a/packages/backend-plugin-api/src/wiring/factories.ts +++ b/packages/backend-plugin-api/src/wiring/factories.ts @@ -19,6 +19,9 @@ import { BackendPluginRegistrationPoints, BackendFeature, ExtensionPoint, + InternalBackendFeature, + InternalBackendModuleRegistration, + InternalBackendPluginRegistration, } from './types'; /** @@ -86,11 +89,59 @@ export function createBackendPlugin( config: BackendPluginConfig | ((...params: TOptions) => BackendPluginConfig), ): (...params: TOptions) => BackendFeature { const configCallback = typeof config === 'function' ? config : () => config; - return (...options: TOptions) => { + return (...options: TOptions): InternalBackendFeature => { const c = configCallback(...options); + + let registrations: InternalBackendPluginRegistration[]; + return { - ...c, - id: c.pluginId, + $$type: '@backstage/BackendFeature', + version: 'v1', + getRegistrations() { + if (registrations) { + return registrations; + } + const extensionPoints: InternalBackendPluginRegistration['extensionPoints'] = + []; + let init: InternalBackendPluginRegistration['init'] | undefined = + undefined; + + c.register({ + registerExtensionPoint(ext, impl) { + if (init) { + throw new Error( + 'registerExtensionPoint called after registerInit', + ); + } + extensionPoints.push([ext, impl]); + }, + registerInit(regInit) { + if (init) { + throw new Error('registerInit must only be called once'); + } + init = { + deps: regInit.deps, + func: regInit.init, + }; + }, + }); + + if (!init) { + throw new Error( + `registerInit was not called by register in ${c.pluginId}`, + ); + } + + registrations = [ + { + type: 'plugin', + pluginId: c.pluginId, + extensionPoints, + init, + }, + ]; + return registrations; + }, }; }; } @@ -127,11 +178,49 @@ export function createBackendModule( config: BackendModuleConfig | ((...params: TOptions) => BackendModuleConfig), ): (...params: TOptions) => BackendFeature { const configCallback = typeof config === 'function' ? config : () => config; - return (...options: TOptions) => { + return (...options: TOptions): InternalBackendFeature => { const c = configCallback(...options); + + let registrations: InternalBackendModuleRegistration[]; + return { - id: `${c.pluginId}.${c.moduleId}`, - register: c.register, + $$type: '@backstage/BackendFeature', + version: 'v1', + getRegistrations() { + if (registrations) { + return registrations; + } + let init: InternalBackendModuleRegistration['init'] | undefined = + undefined; + + c.register({ + registerInit(regInit) { + if (init) { + throw new Error('registerInit must only be called once'); + } + init = { + deps: regInit.deps, + func: regInit.init, + }; + }, + }); + + if (!init) { + throw new Error( + `registerInit was not called by register in ${c.moduleId} module for ${c.pluginId}`, + ); + } + + registrations = [ + { + type: 'module', + pluginId: c.pluginId, + moduleId: c.moduleId, + init, + }, + ]; + return registrations; + }, }; }; } diff --git a/packages/backend-plugin-api/src/wiring/index.ts b/packages/backend-plugin-api/src/wiring/index.ts index e0c25eeb4e..242301ea4d 100644 --- a/packages/backend-plugin-api/src/wiring/index.ts +++ b/packages/backend-plugin-api/src/wiring/index.ts @@ -32,7 +32,6 @@ export { export type { BackendModuleRegistrationPoints, BackendPluginRegistrationPoints, - BackendRegistrationPoints, BackendFeature, ExtensionPoint, } from './types'; diff --git a/packages/backend-plugin-api/src/wiring/types.ts b/packages/backend-plugin-api/src/wiring/types.ts index ab8ce07284..c81ee3ceb7 100644 --- a/packages/backend-plugin-api/src/wiring/types.ts +++ b/packages/backend-plugin-api/src/wiring/types.ts @@ -35,26 +35,6 @@ export type ExtensionPoint = { $$type: '@backstage/ExtensionPoint'; }; -/** - * The callbacks passed to the `register` method of a backend feature; this is - * essentially a superset of {@link BackendPluginRegistrationPoints} and - * {@link BackendModuleRegistrationPoints}. - * - * @public - */ -export interface BackendRegistrationPoints { - registerExtensionPoint( - ref: ExtensionPoint, - impl: TExtensionPoint, - ): void; - registerInit(options: { - deps: { - [name in keyof Deps]: ServiceRef | ExtensionPoint; - }; - init(deps: Deps): Promise; - }): void; -} - /** * The callbacks passed to the `register` method of a backend plugin. * @@ -89,7 +69,36 @@ export interface BackendModuleRegistrationPoints { /** @public */ export interface BackendFeature { - // TODO(Rugvip): Try to get rid of the ID at this level, allowing for a feature to register multiple features as a bundle - id: string; - register(reg: BackendRegistrationPoints): void; + // NOTE: This type is opaque in order to simplify future API evolution. + $$type: '@backstage/BackendFeature'; +} + +/** @internal */ +export interface InternalBackendFeature extends BackendFeature { + version: 'v1'; + getRegistrations(): Array< + InternalBackendPluginRegistration | InternalBackendModuleRegistration + >; +} + +/** @internal */ +export interface InternalBackendPluginRegistration { + pluginId: string; + type: 'plugin'; + extensionPoints: Array, unknown]>; + init: { + deps: Record>; + func(deps: Record): Promise; + }; +} + +/** @internal */ +export interface InternalBackendModuleRegistration { + pluginId: string; + moduleId: string; + type: 'module'; + init: { + deps: Record | ExtensionPoint>; + func(deps: Record): Promise; + }; } diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 27a8c5bceb..bbda9854d4 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -30,6 +30,7 @@ import { BackendFeature, ExtensionPoint, coreServices, + createBackendPlugin, } from '@backstage/backend-plugin-api'; import { mockServices } from '../services'; import { ConfigReader } from '@backstage/config'; @@ -193,16 +194,18 @@ export async function startTestBackend< backendInstancesToCleanUp.push(backend); - backend.add({ - id: `---test-extension-point-registrar`, - register(reg) { - for (const [ref, impl] of extensionPoints) { - reg.registerExtensionPoint(ref, impl); - } + backend.add( + createBackendPlugin({ + pluginId: `---test-extension-point-registrar`, + register(reg) { + for (const [ref, impl] of extensionPoints) { + reg.registerExtensionPoint(ref, impl); + } - reg.registerInit({ deps: {}, async init() {} }); - }, - }); + reg.registerInit({ deps: {}, async init() {} }); + }, + })(), + ); for (const feature of features) { backend.add(feature); From d766419067b559bc1075932c11ae6fb397510f5f Mon Sep 17 00:00:00 2001 From: Mike Ball Date: Tue, 7 Feb 2023 07:35:24 -0500 Subject: [PATCH 33/98] Revert "add changeset documenting github-actions plugin fix" This reverts commit b623d1c8980a623cf04bd9ee44131536049bbd7a. Signed-off-by: Mike Ball --- .changeset/neat-elephants-breathe.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/neat-elephants-breathe.md diff --git a/.changeset/neat-elephants-breathe.md b/.changeset/neat-elephants-breathe.md deleted file mode 100644 index d1f88556e1..0000000000 --- a/.changeset/neat-elephants-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-github-actions': patch ---- - -`yarn start` now starts a functional dev environment using a mock GitHub API to properly render the `` component. From 35d736be0e5d09ff884145bb22f6f05f5bc2c106 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:15:52 +0100 Subject: [PATCH 34/98] chore: renaming to ServiceFactory Signed-off-by: blam --- .../cache/{cacheFactory.ts => cacheServiceFactory.ts} | 2 +- .../src/services/implementations/cache/index.ts | 2 +- .../config/{configFactory.ts => configServiceFactory.ts} | 2 +- .../src/services/implementations/config/index.ts | 4 ++-- .../{databaseFactory.ts => databaseServiceFactory.ts} | 2 +- .../src/services/implementations/database/index.ts | 2 +- .../{discoveryFactory.ts => discoveryServiceFactory.ts} | 2 +- .../src/services/implementations/discovery/index.ts | 2 +- ...uterFactory.test.ts => httpRouterServiceFactory.test.ts} | 6 +++--- .../{httpRouterFactory.ts => httpRouterServiceFactory.ts} | 2 +- .../src/services/implementations/httpRouter/index.ts | 4 ++-- .../{identityFactory.ts => identityServiceFactory.ts} | 2 +- .../src/services/implementations/identity/index.ts | 4 ++-- .../src/services/implementations/lifecycle/index.ts | 2 +- .../{lifecycleFactory.ts => lifecycleServiceFactory.ts} | 2 +- .../src/services/implementations/logger/index.ts | 2 +- .../logger/{loggerFactory.ts => loggerServiceFactory.ts} | 2 +- .../src/services/implementations/permissions/index.ts | 2 +- .../{permissionsFactory.ts => permissionsServiceFactory.ts} | 2 +- .../src/services/implementations/rootHttpRouter/index.ts | 4 ++-- ...HttpRouterFactory.ts => rootHttpRouterServiceFactory.ts} | 2 +- .../src/services/implementations/rootLifecycle/index.ts | 2 +- ...eFactory.test.ts => rootLifecycleServiceFactory.test.ts} | 2 +- ...otLifecycleFactory.ts => rootLifecycleServiceFactory.ts} | 2 +- .../src/services/implementations/rootLogger/index.ts | 2 +- .../{rootLoggerFactory.ts => rootLoggerServiceFactory.ts} | 2 +- .../src/services/implementations/scheduler/index.ts | 2 +- ...dulerFactory.test.ts => schedulerServiceFactory.test.ts} | 4 ++-- .../{schedulerFactory.ts => schedulerServiceFactory.ts} | 2 +- .../src/services/implementations/tokenManager/index.ts | 2 +- ...erFactory.test.ts => tokenManagerServiceFactory.test.ts} | 4 ++-- ...tokenManagerFactory.ts => tokenManagerServiceFactory.ts} | 2 +- .../src/services/implementations/urlReader/index.ts | 2 +- .../{urlReaderFactory.ts => urlReaderServiceFactory.ts} | 2 +- packages/backend-app-api/src/wiring/BackendInitializer.ts | 2 +- 35 files changed, 43 insertions(+), 43 deletions(-) rename packages/backend-app-api/src/services/implementations/cache/{cacheFactory.ts => cacheServiceFactory.ts} (94%) rename packages/backend-app-api/src/services/implementations/config/{configFactory.ts => configServiceFactory.ts} (95%) rename packages/backend-app-api/src/services/implementations/database/{databaseFactory.ts => databaseServiceFactory.ts} (96%) rename packages/backend-app-api/src/services/implementations/discovery/{discoveryFactory.ts => discoveryServiceFactory.ts} (93%) rename packages/backend-app-api/src/services/implementations/httpRouter/{httpRouterFactory.test.ts => httpRouterServiceFactory.test.ts} (93%) rename packages/backend-app-api/src/services/implementations/httpRouter/{httpRouterFactory.ts => httpRouterServiceFactory.ts} (95%) rename packages/backend-app-api/src/services/implementations/identity/{identityFactory.ts => identityServiceFactory.ts} (95%) rename packages/backend-app-api/src/services/implementations/lifecycle/{lifecycleFactory.ts => lifecycleServiceFactory.ts} (95%) rename packages/backend-app-api/src/services/implementations/logger/{loggerFactory.ts => loggerServiceFactory.ts} (94%) rename packages/backend-app-api/src/services/implementations/permissions/{permissionsFactory.ts => permissionsServiceFactory.ts} (94%) rename packages/backend-app-api/src/services/implementations/rootHttpRouter/{rootHttpRouterFactory.ts => rootHttpRouterServiceFactory.ts} (97%) rename packages/backend-app-api/src/services/implementations/rootLifecycle/{rootLifecycleFactory.test.ts => rootLifecycleServiceFactory.test.ts} (95%) rename packages/backend-app-api/src/services/implementations/rootLifecycle/{rootLifecycleFactory.ts => rootLifecycleServiceFactory.ts} (96%) rename packages/backend-app-api/src/services/implementations/rootLogger/{rootLoggerFactory.ts => rootLoggerServiceFactory.ts} (96%) rename packages/backend-app-api/src/services/implementations/scheduler/{schedulerFactory.test.ts => schedulerServiceFactory.test.ts} (94%) rename packages/backend-app-api/src/services/implementations/scheduler/{schedulerFactory.ts => schedulerServiceFactory.ts} (95%) rename packages/backend-app-api/src/services/implementations/tokenManager/{tokenManagerFactory.test.ts => tokenManagerServiceFactory.test.ts} (91%) rename packages/backend-app-api/src/services/implementations/tokenManager/{tokenManagerFactory.ts => tokenManagerServiceFactory.ts} (94%) rename packages/backend-app-api/src/services/implementations/urlReader/{urlReaderFactory.ts => urlReaderServiceFactory.ts} (94%) diff --git a/packages/backend-app-api/src/services/implementations/cache/cacheFactory.ts b/packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts similarity index 94% rename from packages/backend-app-api/src/services/implementations/cache/cacheFactory.ts rename to packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts index 426a890c00..3ccd2a2fac 100644 --- a/packages/backend-app-api/src/services/implementations/cache/cacheFactory.ts +++ b/packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; /** @public */ -export const cacheFactory = createServiceFactory({ +export const cacheServiceFactory = createServiceFactory({ service: coreServices.cache, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/services/implementations/cache/index.ts b/packages/backend-app-api/src/services/implementations/cache/index.ts index 3d1bcd75a7..f96ee77182 100644 --- a/packages/backend-app-api/src/services/implementations/cache/index.ts +++ b/packages/backend-app-api/src/services/implementations/cache/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { cacheFactory } from './cacheFactory'; +export { cacheServiceFactory } from './cacheServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/config/configFactory.ts b/packages/backend-app-api/src/services/implementations/config/configServiceFactory.ts similarity index 95% rename from packages/backend-app-api/src/services/implementations/config/configFactory.ts rename to packages/backend-app-api/src/services/implementations/config/configServiceFactory.ts index 833730fdbd..459c0d9f0c 100644 --- a/packages/backend-app-api/src/services/implementations/config/configFactory.ts +++ b/packages/backend-app-api/src/services/implementations/config/configServiceFactory.ts @@ -35,7 +35,7 @@ export interface ConfigFactoryOptions { } /** @public */ -export const configFactory = createServiceFactory( +export const configServiceFactory = createServiceFactory( (options?: ConfigFactoryOptions) => ({ service: coreServices.config, deps: {}, diff --git a/packages/backend-app-api/src/services/implementations/config/index.ts b/packages/backend-app-api/src/services/implementations/config/index.ts index b23c47ce0a..690f1e2d36 100644 --- a/packages/backend-app-api/src/services/implementations/config/index.ts +++ b/packages/backend-app-api/src/services/implementations/config/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { configFactory } from './configFactory'; -export type { ConfigFactoryOptions } from './configFactory'; +export { configServiceFactory } from './configServiceFactory'; +export type { ConfigFactoryOptions } from './configServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/database/databaseFactory.ts b/packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts similarity index 96% rename from packages/backend-app-api/src/services/implementations/database/databaseFactory.ts rename to packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts index 4d95f863db..05e2f1deb9 100644 --- a/packages/backend-app-api/src/services/implementations/database/databaseFactory.ts +++ b/packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts @@ -22,7 +22,7 @@ import { import { ConfigReader } from '@backstage/config'; /** @public */ -export const databaseFactory = createServiceFactory({ +export const databaseServiceFactory = createServiceFactory({ service: coreServices.database, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/services/implementations/database/index.ts b/packages/backend-app-api/src/services/implementations/database/index.ts index 0045630e15..d676c8013e 100644 --- a/packages/backend-app-api/src/services/implementations/database/index.ts +++ b/packages/backend-app-api/src/services/implementations/database/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { databaseFactory } from './databaseFactory'; +export { databaseServiceFactory } from './databaseServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/discovery/discoveryFactory.ts b/packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts similarity index 93% rename from packages/backend-app-api/src/services/implementations/discovery/discoveryFactory.ts rename to packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts index 51ea3c881d..6c0da8521d 100644 --- a/packages/backend-app-api/src/services/implementations/discovery/discoveryFactory.ts +++ b/packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; /** @public */ -export const discoveryFactory = createServiceFactory({ +export const discoveryServiceFactory = createServiceFactory({ service: coreServices.discovery, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/services/implementations/discovery/index.ts b/packages/backend-app-api/src/services/implementations/discovery/index.ts index 182b9f6cd2..7b3b9816b1 100644 --- a/packages/backend-app-api/src/services/implementations/discovery/index.ts +++ b/packages/backend-app-api/src/services/implementations/discovery/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { discoveryFactory } from './discoveryFactory'; +export { discoveryServiceFactory } from './discoveryServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterFactory.test.ts b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts similarity index 93% rename from packages/backend-app-api/src/services/implementations/httpRouter/httpRouterFactory.test.ts rename to packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts index 150bd628f5..2e124c98b6 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts @@ -18,12 +18,12 @@ import { HttpRouterService, ServiceFactory, } from '@backstage/backend-plugin-api'; -import { httpRouterFactory } from './httpRouterFactory'; +import { httpRouterServiceFactory } from './httpRouterServiceFactory'; describe('httpRouterFactory', () => { it('should register plugin paths', async () => { const rootHttpRouter = { use: jest.fn() }; - const factory = httpRouterFactory() as Exclude< + const factory = httpRouterServiceFactory() as Exclude< ServiceFactory, { scope: 'root' } >; @@ -55,7 +55,7 @@ describe('httpRouterFactory', () => { it('should use custom path generator', async () => { const rootHttpRouter = { use: jest.fn() }; - const factory = httpRouterFactory({ + const factory = httpRouterServiceFactory({ getPath: id => `/some/${id}/path`, }) as Exclude, { scope: 'root' }>; diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterFactory.ts b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts similarity index 95% rename from packages/backend-app-api/src/services/implementations/httpRouter/httpRouterFactory.ts rename to packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts index 218910345d..bbd54b7ade 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterFactory.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.ts @@ -31,7 +31,7 @@ export interface HttpRouterFactoryOptions { } /** @public */ -export const httpRouterFactory = createServiceFactory( +export const httpRouterServiceFactory = createServiceFactory( (options?: HttpRouterFactoryOptions) => ({ service: coreServices.httpRouter, deps: { diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/index.ts b/packages/backend-app-api/src/services/implementations/httpRouter/index.ts index f2db660414..9dfb01c5be 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/index.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { httpRouterFactory } from './httpRouterFactory'; -export type { HttpRouterFactoryOptions } from './httpRouterFactory'; +export { httpRouterServiceFactory } from './httpRouterServiceFactory'; +export type { HttpRouterFactoryOptions } from './httpRouterServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/identity/identityFactory.ts b/packages/backend-app-api/src/services/implementations/identity/identityServiceFactory.ts similarity index 95% rename from packages/backend-app-api/src/services/implementations/identity/identityFactory.ts rename to packages/backend-app-api/src/services/implementations/identity/identityServiceFactory.ts index 0031979390..58da1c37d5 100644 --- a/packages/backend-app-api/src/services/implementations/identity/identityFactory.ts +++ b/packages/backend-app-api/src/services/implementations/identity/identityServiceFactory.ts @@ -34,7 +34,7 @@ export type IdentityFactoryOptions = { }; /** @public */ -export const identityFactory = createServiceFactory( +export const identityServiceFactory = createServiceFactory( (options?: IdentityFactoryOptions) => ({ service: coreServices.identity, deps: { diff --git a/packages/backend-app-api/src/services/implementations/identity/index.ts b/packages/backend-app-api/src/services/implementations/identity/index.ts index 9382232620..bf2f4436dd 100644 --- a/packages/backend-app-api/src/services/implementations/identity/index.ts +++ b/packages/backend-app-api/src/services/implementations/identity/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { identityFactory } from './identityFactory'; -export type { IdentityFactoryOptions } from './identityFactory'; +export { identityServiceFactory } from './identityServiceFactory'; +export type { IdentityFactoryOptions } from './identityServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/lifecycle/index.ts b/packages/backend-app-api/src/services/implementations/lifecycle/index.ts index cfca37a162..8dac4c26b4 100644 --- a/packages/backend-app-api/src/services/implementations/lifecycle/index.ts +++ b/packages/backend-app-api/src/services/implementations/lifecycle/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { lifecycleFactory } from './lifecycleFactory'; +export { lifecycleServiceFactory } from './lifecycleServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleFactory.ts b/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts similarity index 95% rename from packages/backend-app-api/src/services/implementations/lifecycle/lifecycleFactory.ts rename to packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts index 27c1a139fd..79658c0d42 100644 --- a/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleFactory.ts +++ b/packages/backend-app-api/src/services/implementations/lifecycle/lifecycleServiceFactory.ts @@ -24,7 +24,7 @@ import { * Allows plugins to register shutdown hooks that are run when the process is about to exit. * @public */ -export const lifecycleFactory = createServiceFactory({ +export const lifecycleServiceFactory = createServiceFactory({ service: coreServices.lifecycle, deps: { logger: coreServices.logger, diff --git a/packages/backend-app-api/src/services/implementations/logger/index.ts b/packages/backend-app-api/src/services/implementations/logger/index.ts index acef1b178f..ca52bf5193 100644 --- a/packages/backend-app-api/src/services/implementations/logger/index.ts +++ b/packages/backend-app-api/src/services/implementations/logger/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { loggerFactory } from './loggerFactory'; +export { loggerServiceFactory } from './loggerServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/logger/loggerFactory.ts b/packages/backend-app-api/src/services/implementations/logger/loggerServiceFactory.ts similarity index 94% rename from packages/backend-app-api/src/services/implementations/logger/loggerFactory.ts rename to packages/backend-app-api/src/services/implementations/logger/loggerServiceFactory.ts index 60c91d0ee6..d9158529ca 100644 --- a/packages/backend-app-api/src/services/implementations/logger/loggerFactory.ts +++ b/packages/backend-app-api/src/services/implementations/logger/loggerServiceFactory.ts @@ -20,7 +20,7 @@ import { } from '@backstage/backend-plugin-api'; /** @public */ -export const loggerFactory = createServiceFactory({ +export const loggerServiceFactory = createServiceFactory({ service: coreServices.logger, deps: { rootLogger: coreServices.rootLogger, diff --git a/packages/backend-app-api/src/services/implementations/permissions/index.ts b/packages/backend-app-api/src/services/implementations/permissions/index.ts index 29a6aa237a..781dda31a0 100644 --- a/packages/backend-app-api/src/services/implementations/permissions/index.ts +++ b/packages/backend-app-api/src/services/implementations/permissions/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { permissionsFactory } from './permissionsFactory'; +export { permissionsServiceFactory } from './permissionsServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/permissions/permissionsFactory.ts b/packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts similarity index 94% rename from packages/backend-app-api/src/services/implementations/permissions/permissionsFactory.ts rename to packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts index 4eb05e3e4c..38cba73eda 100644 --- a/packages/backend-app-api/src/services/implementations/permissions/permissionsFactory.ts +++ b/packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts @@ -21,7 +21,7 @@ import { import { ServerPermissionClient } from '@backstage/plugin-permission-node'; /** @public */ -export const permissionsFactory = createServiceFactory({ +export const permissionsServiceFactory = createServiceFactory({ service: coreServices.permissions, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts index e24662df05..93b997239d 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts @@ -15,10 +15,10 @@ */ export { - rootHttpRouterFactory, + rootHttpRouterServiceFactory, type RootHttpRouterFactoryOptions, type RootHttpRouterConfigureOptions, -} from './rootHttpRouterFactory'; +} from './rootHttpRouterServiceFactory'; export { DefaultRootHttpRouter, type DefaultRootHttpRouterOptions, diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts similarity index 97% rename from packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts rename to packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts index 816c615817..a14beb428d 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -69,7 +69,7 @@ function defaultConfigure({ } /** @public */ -export const rootHttpRouterFactory = createServiceFactory( +export const rootHttpRouterServiceFactory = createServiceFactory( (options?: RootHttpRouterFactoryOptions) => ({ service: coreServices.rootHttpRouter, deps: { diff --git a/packages/backend-app-api/src/services/implementations/rootLifecycle/index.ts b/packages/backend-app-api/src/services/implementations/rootLifecycle/index.ts index 8adefbfe84..86589cd23e 100644 --- a/packages/backend-app-api/src/services/implementations/rootLifecycle/index.ts +++ b/packages/backend-app-api/src/services/implementations/rootLifecycle/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { rootLifecycleFactory } from './rootLifecycleFactory'; +export { rootLifecycleServiceFactory } from './rootLifecycleServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleFactory.test.ts b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts similarity index 95% rename from packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleFactory.test.ts rename to packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts index 3a93cacc8d..8d2b2af3d5 100644 --- a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.test.ts @@ -15,7 +15,7 @@ */ import { getVoidLogger } from '@backstage/backend-common'; -import { BackendLifecycleImpl } from './rootLifecycleFactory'; +import { BackendLifecycleImpl } from './rootLifecycleServiceFactory'; describe('lifecycleService', () => { it('should execute registered shutdown hook', async () => { diff --git a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleFactory.ts b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts similarity index 96% rename from packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleFactory.ts rename to packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts index 2b6f7eeafe..f379c2ec52 100644 --- a/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts @@ -65,7 +65,7 @@ export class BackendLifecycleImpl implements RootLifecycleService { * * @public */ -export const rootLifecycleFactory = createServiceFactory({ +export const rootLifecycleServiceFactory = createServiceFactory({ service: coreServices.rootLifecycle, deps: { logger: coreServices.rootLogger, diff --git a/packages/backend-app-api/src/services/implementations/rootLogger/index.ts b/packages/backend-app-api/src/services/implementations/rootLogger/index.ts index ce5816e6fa..366cd53163 100644 --- a/packages/backend-app-api/src/services/implementations/rootLogger/index.ts +++ b/packages/backend-app-api/src/services/implementations/rootLogger/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { rootLoggerFactory } from './rootLoggerFactory'; +export { rootLoggerServiceFactory } from './rootLoggerServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerFactory.ts b/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts similarity index 96% rename from packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerFactory.ts rename to packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts index 1c2214b98c..11bbd58050 100644 --- a/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts @@ -23,7 +23,7 @@ import { transports, format } from 'winston'; import { createConfigSecretEnumerator } from '../../../config'; /** @public */ -export const rootLoggerFactory = createServiceFactory({ +export const rootLoggerServiceFactory = createServiceFactory({ service: coreServices.rootLogger, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/services/implementations/scheduler/index.ts b/packages/backend-app-api/src/services/implementations/scheduler/index.ts index 8b84906b5b..8b67006a4d 100644 --- a/packages/backend-app-api/src/services/implementations/scheduler/index.ts +++ b/packages/backend-app-api/src/services/implementations/scheduler/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { schedulerFactory } from './schedulerFactory'; +export { schedulerServiceFactory } from './schedulerServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.test.ts b/packages/backend-app-api/src/services/implementations/scheduler/schedulerServiceFactory.test.ts similarity index 94% rename from packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.test.ts rename to packages/backend-app-api/src/services/implementations/scheduler/schedulerServiceFactory.test.ts index 15ec364ac5..7af9de44da 100644 --- a/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/scheduler/schedulerServiceFactory.test.ts @@ -19,13 +19,13 @@ import { createBackendPlugin, } from '@backstage/backend-plugin-api'; import { startTestBackend } from '@backstage/backend-test-utils'; -import { schedulerFactory } from './schedulerFactory'; +import { schedulerServiceFactory } from './schedulerServiceFactory'; describe('schedulerFactory', () => { it('creates sidecar database features', async () => { expect.assertions(3); - const subject = schedulerFactory(); + const subject = schedulerServiceFactory(); const plugin = createBackendPlugin({ pluginId: 'example', diff --git a/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.ts b/packages/backend-app-api/src/services/implementations/scheduler/schedulerServiceFactory.ts similarity index 95% rename from packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.ts rename to packages/backend-app-api/src/services/implementations/scheduler/schedulerServiceFactory.ts index 458c5acfd6..4dfe567ccc 100644 --- a/packages/backend-app-api/src/services/implementations/scheduler/schedulerFactory.ts +++ b/packages/backend-app-api/src/services/implementations/scheduler/schedulerServiceFactory.ts @@ -22,7 +22,7 @@ import { import { TaskScheduler } from '@backstage/backend-tasks'; /** @public */ -export const schedulerFactory = createServiceFactory({ +export const schedulerServiceFactory = createServiceFactory({ service: coreServices.scheduler, deps: { plugin: coreServices.pluginMetadata, diff --git a/packages/backend-app-api/src/services/implementations/tokenManager/index.ts b/packages/backend-app-api/src/services/implementations/tokenManager/index.ts index c0685079c4..3ae3d45d2f 100644 --- a/packages/backend-app-api/src/services/implementations/tokenManager/index.ts +++ b/packages/backend-app-api/src/services/implementations/tokenManager/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { tokenManagerFactory } from './tokenManagerFactory'; +export { tokenManagerServiceFactory } from './tokenManagerServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerFactory.test.ts b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts similarity index 91% rename from packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerFactory.test.ts rename to packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts index abc62fff69..6c33829967 100644 --- a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts @@ -20,13 +20,13 @@ import { TokenManagerService, } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; -import { tokenManagerFactory } from './tokenManagerFactory'; +import { tokenManagerServiceFactory } from './tokenManagerServiceFactory'; describe('tokenManagerFactory', () => { it('should create managers that can share tokens in development', async () => { (process.env as { NODE_ENV?: string }).NODE_ENV = 'development'; - const factory = tokenManagerFactory() as Exclude< + const factory = tokenManagerServiceFactory() as Exclude< ServiceFactory, { scope: 'root' } >; diff --git a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerFactory.ts b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts similarity index 94% rename from packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerFactory.ts rename to packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts index ae0b402eec..b3726176b6 100644 --- a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerFactory.ts +++ b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts @@ -21,7 +21,7 @@ import { import { ServerTokenManager } from '@backstage/backend-common'; /** @public */ -export const tokenManagerFactory = createServiceFactory({ +export const tokenManagerServiceFactory = createServiceFactory({ service: coreServices.tokenManager, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/services/implementations/urlReader/index.ts b/packages/backend-app-api/src/services/implementations/urlReader/index.ts index 5da0ef4049..6a4b9f65be 100644 --- a/packages/backend-app-api/src/services/implementations/urlReader/index.ts +++ b/packages/backend-app-api/src/services/implementations/urlReader/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { urlReaderFactory } from './urlReaderFactory'; +export { urlReaderServiceFactory } from './urlReaderServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/urlReader/urlReaderFactory.ts b/packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts similarity index 94% rename from packages/backend-app-api/src/services/implementations/urlReader/urlReaderFactory.ts rename to packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts index 1b52ce9604..83e594aa0b 100644 --- a/packages/backend-app-api/src/services/implementations/urlReader/urlReaderFactory.ts +++ b/packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; /** @public */ -export const urlReaderFactory = createServiceFactory({ +export const urlReaderServiceFactory = createServiceFactory({ service: coreServices.urlReader, deps: { config: coreServices.config, diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 4bdee8b085..40e2275e2a 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -20,7 +20,7 @@ import { coreServices, ServiceRef, } from '@backstage/backend-plugin-api'; -import { BackendLifecycleImpl } from '../services/implementations/rootLifecycle/rootLifecycleFactory'; +import { BackendLifecycleImpl } from '../services/implementations/rootLifecycle/rootLifecycleServiceFactory'; import { BackendRegisterInit, EnumerableServiceHolder, From 5077fdb2424613545a5ed33059a7823ddcfacffd Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:21:34 +0100 Subject: [PATCH 35/98] chore: fixing usages Signed-off-by: blam --- .../backend-defaults/src/CreateBackend.ts | 60 +++++++++---------- .../src/next/services/mockServices.ts | 36 +++++------ .../src/run.ts | 40 ++++++------- 3 files changed, 68 insertions(+), 68 deletions(-) diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 5cbed2c3df..480f365216 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -16,22 +16,22 @@ import { Backend, - cacheFactory, - configFactory, + cacheServiceFactory, + configServiceFactory, createSpecializedBackend, - databaseFactory, - discoveryFactory, - httpRouterFactory, - rootHttpRouterFactory, - lifecycleFactory, - rootLifecycleFactory, - loggerFactory, - permissionsFactory, - rootLoggerFactory, - schedulerFactory, - tokenManagerFactory, - urlReaderFactory, - identityFactory, + databaseServiceFactory, + discoveryServiceFactory, + httpRouterServiceFactory, + rootHttpRouterServiceFactory, + lifecycleServiceFactory, + rootLifecycleServiceFactory, + loggerServiceFactory, + permissionsServiceFactory, + rootLoggerServiceFactory, + schedulerServiceFactory, + tokenManagerServiceFactory, + urlReaderServiceFactory, + identityServiceFactory, } from '@backstage/backend-app-api'; import { ServiceFactory, @@ -44,21 +44,21 @@ import { import type { InternalSharedBackendEnvironment } from '@backstage/backend-plugin-api/src/wiring/createSharedEnvironment'; export const defaultServiceFactories = [ - cacheFactory(), - configFactory(), - databaseFactory(), - discoveryFactory(), - httpRouterFactory(), - identityFactory(), - lifecycleFactory(), - loggerFactory(), - permissionsFactory(), - rootHttpRouterFactory(), - rootLifecycleFactory(), - rootLoggerFactory(), - schedulerFactory(), - tokenManagerFactory(), - urlReaderFactory(), + cacheServiceFactory(), + configServiceFactory(), + databaseServiceFactory(), + discoveryServiceFactory(), + httpRouterServiceFactory(), + identityServiceFactory(), + lifecycleServiceFactory(), + loggerServiceFactory(), + permissionsServiceFactory(), + rootHttpRouterServiceFactory(), + rootLifecycleServiceFactory(), + rootLoggerServiceFactory(), + schedulerServiceFactory(), + tokenManagerServiceFactory(), + urlReaderServiceFactory(), ]; /** diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 5f771f13c5..d65cdb2877 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -25,15 +25,15 @@ import { TokenManagerService, } from '@backstage/backend-plugin-api'; import { - cacheFactory, - databaseFactory, - httpRouterFactory, - lifecycleFactory, - loggerFactory, - permissionsFactory, - rootLifecycleFactory, - schedulerFactory, - urlReaderFactory, + cacheServiceFactory, + databaseServiceFactory, + httpRouterServiceFactory, + lifecycleServiceFactory, + loggerServiceFactory, + permissionsServiceFactory, + rootLifecycleServiceFactory, + schedulerServiceFactory, + urlReaderServiceFactory, } from '@backstage/backend-app-api'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; @@ -109,30 +109,30 @@ export namespace mockServices { // some may need a bit more refactoring for it to be simpler to // re-implement functioning mock versions here. export namespace cache { - export const factory = cacheFactory; + export const factory = cacheServiceFactory; } export namespace database { - export const factory = databaseFactory; + export const factory = databaseServiceFactory; } export namespace httpRouter { - export const factory = httpRouterFactory; + export const factory = httpRouterServiceFactory; } export namespace lifecycle { - export const factory = lifecycleFactory; + export const factory = lifecycleServiceFactory; } export namespace logger { - export const factory = loggerFactory; + export const factory = loggerServiceFactory; } export namespace permissions { - export const factory = permissionsFactory; + export const factory = permissionsServiceFactory; } export namespace rootLifecycle { - export const factory = rootLifecycleFactory; + export const factory = rootLifecycleServiceFactory; } export namespace scheduler { - export const factory = schedulerFactory; + export const factory = schedulerServiceFactory; } export namespace urlReader { - export const factory = urlReaderFactory; + export const factory = urlReaderServiceFactory; } } diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts index 2a58227862..d41b9be115 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts @@ -16,16 +16,16 @@ // eslint-disable-next-line @backstage/no-undeclared-imports import { - databaseFactory, - discoveryFactory, - httpRouterFactory, - lifecycleFactory, - loggerFactory, - permissionsFactory, - rootLoggerFactory, - schedulerFactory, - tokenManagerFactory, - urlReaderFactory, + databaseServiceFactory, + discoveryServiceFactory, + httpRouterServiceFactory, + lifecycleServiceFactory, + loggerServiceFactory, + permissionsServiceFactory, + rootLoggerServiceFactory, + schedulerServiceFactory, + tokenManagerServiceFactory, + urlReaderServiceFactory, } from '@backstage/backend-app-api'; import { coreServices } from '@backstage/backend-plugin-api'; import { startTestBackend } from '@backstage/backend-test-utils'; @@ -63,16 +63,16 @@ async function main() { await startTestBackend({ services: [ [coreServices.config, new ConfigReader(config)], - databaseFactory(), - discoveryFactory(), - httpRouterFactory(), - lifecycleFactory(), - loggerFactory(), - permissionsFactory(), - rootLoggerFactory(), - schedulerFactory(), - tokenManagerFactory(), - urlReaderFactory(), + databaseServiceFactory(), + discoveryServiceFactory(), + httpRouterServiceFactory(), + lifecycleServiceFactory(), + loggerServiceFactory(), + permissionsServiceFactory(), + rootLoggerServiceFactory(), + schedulerServiceFactory(), + tokenManagerServiceFactory(), + urlReaderServiceFactory(), ], extensionPoints: [], features: [ From 6f1f2e94510c38cdb1b74d61928e78b781bb5b9b Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:28:02 +0100 Subject: [PATCH 36/98] chore: updating docs Signed-off-by: blam --- docs/backend-system/architecture/03-services.md | 16 ++++++++-------- .../architecture/07-naming-patterns.md | 14 +++++++------- .../backend-system/building-backends/01-index.md | 8 ++++---- docs/backend-system/core-services/01-index.md | 16 ++++++++-------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/backend-system/architecture/03-services.md b/docs/backend-system/architecture/03-services.md index d202c21740..875cb3aaea 100644 --- a/docs/backend-system/architecture/03-services.md +++ b/docs/backend-system/architecture/03-services.md @@ -61,7 +61,7 @@ class DefaultFooService implements FooService { } } -export const fooFactory = createServiceFactory({ +export const fooServiceFactory = createServiceFactory({ service: fooServiceRef, deps: { bar: barServiceRef }, factory({ bar }) { @@ -75,7 +75,7 @@ To create a service factory we need to provide a reference to the `service` for If you need the creation of the service instance to be asynchronous, you can make the `factory` function async. For example: ```ts -export const fooFactory = createServiceFactory({ +export const fooServiceFactory = createServiceFactory({ service: fooServiceRef, deps: {}, async factory() { @@ -94,18 +94,18 @@ To install a service factory in a backend instance, we pass it in through the `s ```ts const backend = createBackend({ - services: [fooFactory()], + services: [fooServiceFactory()], }); ``` -Note that we call `fooFactory` to create the service factory instance. This is because `createServiceFactory` always returns a factory function that creates the actual service factory. This is done to always allow for options to be added to the service factory in the future, without breaking existing code. To add options to your service factory, you wrap the object passed to `createServiceFactory` in a callback that accepts the desired options. For example: +Note that we call `fooServiceFactory` to create the service factory instance. This is because `createServiceFactory` always returns a factory function that creates the actual service factory. This is done to always allow for options to be added to the service factory in the future, without breaking existing code. To add options to your service factory, you wrap the object passed to `createServiceFactory` in a callback that accepts the desired options. For example: ```ts export interface FooFactoryOptions { mode: 'eager' | 'lazy'; } -export const fooFactory = createServiceFactory( +export const fooServiceFactory = createServiceFactory( (options?: FooFactoryOptions) => ({ service: fooServiceRef, deps: { bar: barServiceRef }, @@ -120,7 +120,7 @@ This lets us use the options to customize the factory implementation in any way ```ts const backend = createBackend({ - services: [fooFactory({ mode: 'eager' })], + services: [fooServiceFactory({ mode: 'eager' })], }); ``` @@ -164,7 +164,7 @@ Plugin scoped services have access to a plugin metadata service, which is a spec The plugin metadata service is the base for all plugin specific customizations for services. For example, the default implementation of the plugin scoped logger service uses the plugin metadata service to attach the plugin ID as a field in all log messages: ```ts -export const loggerFactory = createServiceFactory({ +export const loggerServiceFactory = createServiceFactory({ service: coreServices.logger, deps: { rootLogger: coreServices.rootLogger, @@ -183,7 +183,7 @@ Some services may benefit from having a context that is shared across all instan The root context is defined as part of the service factory by passing the `createRootContext` option: ```ts -export const fooFactory = createServiceFactory({ +export const fooServiceFactory = createServiceFactory({ service: fooServiceRef, deps: { rootLogger: coreServices.rootLogger, bar: barServiceRef }, createRootContext({ rootLogger }) { diff --git a/docs/backend-system/architecture/07-naming-patterns.md b/docs/backend-system/architecture/07-naming-patterns.md index b4b4c6c70f..b62e049f08 100644 --- a/docs/backend-system/architecture/07-naming-patterns.md +++ b/docs/backend-system/architecture/07-naming-patterns.md @@ -66,12 +66,12 @@ export const catalogProcessingExtensionPoint = createExtensionPointService` | `LoggerService`, `DatabaseService` | -| Reference | `ServiceRef` | `loggerServiceRef`, `databaseServiceRef` | -| ID | `.` | `'core.rootHttpRouter'`, `'catalog.catalogClient'` | -| Factory | `Factory` | `loggerFactory`, `databaseFactory` | +| Description | Pattern | Examples | +| ----------- | ---------------------- | -------------------------------------------------- | +| Interface | `Service` | `LoggerService`, `DatabaseService` | +| Reference | `ServiceRef` | `loggerServiceRef`, `databaseServiceRef` | +| ID | `.` | `'core.rootHttpRouter'`, `'catalog.catalogClient'` | +| Factory | `ServiceFactory` | `loggerServiceFactory`, `databaseServiceFactory` | Example: @@ -85,7 +85,7 @@ export const catalogClientServiceRef = createServiceRef({ ... }) -export const catalogClientFactory = createServiceFactory({ +export const catalogClientServiceFactory = createServiceFactory({ service: catalogClientServiceRef, ... }) diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index de01c6d39c..bda2aa7eaa 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -61,11 +61,11 @@ All of these services can be replaced with your own implementations if you need For example, let's say we want to customize the core configuration service to enable remote configuration loading. That would look something like this: ```ts -import { configFactory } from '@backstage/backend-app-api'; +import { configServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - configFactory({ + configServiceFactory({ remote: { reloadIntervalSeconds: 60 }, }), ], @@ -160,11 +160,11 @@ A shared environment is defined using `createSharedEnvironment`. In this example ```ts // packages/backend-env/src/index.ts import { createSharedEnvironment } from '@backstage/backend-plugin-api'; -import { customDiscoveryFactory } from './customDiscoveryFactory'; +import { customDiscoveryServiceFactory } from './customDiscoveryServiceFactory'; export const env = createSharedEnvironment({ services: [ - customDiscoveryFactory(), // custom DiscoveryService implementation + customDiscoveryServiceFactory(), // custom DiscoveryService implementation ], }); ``` diff --git a/docs/backend-system/core-services/01-index.md b/docs/backend-system/core-services/01-index.md index 5128a95cb3..b6682c2708 100644 --- a/docs/backend-system/core-services/01-index.md +++ b/docs/backend-system/core-services/01-index.md @@ -59,11 +59,11 @@ There's additional configuration that you can optionally pass to setup the `http You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: ```ts -import { httpRouterFactory } from '@backstage/backend-app-api'; +import { httpRouterServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - httpRouterFactory({ + httpRouterServiceFactory({ getPath: (pluginId: string) => `/plugins/${pluginId}`, }), ], @@ -116,11 +116,11 @@ There's additional options that you can pass to configure the root HTTP Router s You can configure the root HTTP Router service by passing the options to the `createBackend` function. ```ts -import { rootHttpRouterFactory } from '@backstage/backend-app-api'; +import { rootHttpRouterServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - rootHttpRouterFactory({ + rootHttpRouterServiceFactory({ configure: ({ app, middleware, routes, config, logger, lifecycle }) => { // the built in middleware is provided through an option in the configure function app.use(middleware.helmet()); @@ -183,11 +183,11 @@ There's additional configuration that you can optionally pass to setup the `conf You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: ```ts -import { configFactory } from '@backstage/backend-app-api'; +import { configServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - configFactory({ + configServiceFactory({ argv: [ '--config', '/backstage/app-config.development.yaml', @@ -438,11 +438,11 @@ There's additional configuration that you can optionally pass to setup the `iden You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: ```ts -import { identityFactory } from '@backstage/backend-app-api'; +import { identityServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - identityFactory({ + identityServiceFactory({ issuer: 'backstage', algorithms: ['ES256', 'RS256'], }), From 4ae71b7f2e0874a0cbcd464df8113cbd537f3835 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:32:54 +0100 Subject: [PATCH 37/98] chore: api-reports and breaking changeset Signed-off-by: blam --- .changeset/short-apes-relate.md | 5 +++ packages/backend-app-api/api-report.md | 62 +++++++++++++------------- 2 files changed, 36 insertions(+), 31 deletions(-) create mode 100644 .changeset/short-apes-relate.md diff --git a/.changeset/short-apes-relate.md b/.changeset/short-apes-relate.md new file mode 100644 index 0000000000..d93c046a4d --- /dev/null +++ b/.changeset/short-apes-relate.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': minor +--- + +**BREAKING** Renaming `*Factory` exports to `*ServiceFactory` instead. For example `configFactory` now is exported as `configServiceFactory`. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 8dc85d1728..52b86eb3d5 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -50,12 +50,7 @@ export interface Backend { } // @public (undocumented) -export const cacheFactory: () => ServiceFactory; - -// @public (undocumented) -export const configFactory: ( - options?: ConfigFactoryOptions | undefined, -) => ServiceFactory; +export const cacheServiceFactory: () => ServiceFactory; // @public (undocumented) export interface ConfigFactoryOptions { @@ -63,6 +58,11 @@ export interface ConfigFactoryOptions { remote?: LoadConfigOptionsRemote; } +// @public (undocumented) +export const configServiceFactory: ( + options?: ConfigFactoryOptions | undefined, +) => ServiceFactory; + // @public (undocumented) export function createConfigSecretEnumerator(options: { logger: LoggerService; @@ -90,7 +90,7 @@ export interface CreateSpecializedBackendOptions { } // @public (undocumented) -export const databaseFactory: () => ServiceFactory; +export const databaseServiceFactory: () => ServiceFactory; // @public export class DefaultRootHttpRouter implements RootHttpRouterService { @@ -108,7 +108,7 @@ export interface DefaultRootHttpRouterOptions { } // @public (undocumented) -export const discoveryFactory: () => ServiceFactory; +export const discoveryServiceFactory: () => ServiceFactory; // @public export interface ExtendedHttpServer extends http.Server { @@ -120,16 +120,16 @@ export interface ExtendedHttpServer extends http.Server { stop(): Promise; } -// @public (undocumented) -export const httpRouterFactory: ( - options?: HttpRouterFactoryOptions | undefined, -) => ServiceFactory; - // @public (undocumented) export interface HttpRouterFactoryOptions { getPath?(pluginId: string): string; } +// @public (undocumented) +export const httpRouterServiceFactory: ( + options?: HttpRouterFactoryOptions | undefined, +) => ServiceFactory; + // @public export type HttpServerCertificateOptions = | { @@ -153,19 +153,19 @@ export type HttpServerOptions = { }; }; -// @public (undocumented) -export const identityFactory: ( - options?: IdentityFactoryOptions | undefined, -) => ServiceFactory; - // @public export type IdentityFactoryOptions = { issuer?: string; algorithms?: string[]; }; +// @public (undocumented) +export const identityServiceFactory: ( + options?: IdentityFactoryOptions | undefined, +) => ServiceFactory; + // @public -export const lifecycleFactory: () => ServiceFactory; +export const lifecycleServiceFactory: () => ServiceFactory; // @public export function loadBackendConfig(options: { @@ -176,7 +176,7 @@ export function loadBackendConfig(options: { }>; // @public (undocumented) -export const loggerFactory: () => ServiceFactory; +export const loggerServiceFactory: () => ServiceFactory; // @public export class MiddlewareFactory { @@ -204,7 +204,7 @@ export interface MiddlewareFactoryOptions { } // @public (undocumented) -export const permissionsFactory: () => ServiceFactory; +export const permissionsServiceFactory: () => ServiceFactory; // @public export function readCorsOptions(config?: Config): CorsOptions; @@ -231,25 +231,25 @@ export interface RootHttpRouterConfigureOptions { routes: RequestHandler; } -// @public (undocumented) -export const rootHttpRouterFactory: ( - options?: RootHttpRouterFactoryOptions | undefined, -) => ServiceFactory; - // @public (undocumented) export type RootHttpRouterFactoryOptions = { indexPath?: string | false; configure?(options: RootHttpRouterConfigureOptions): void; }; +// @public (undocumented) +export const rootHttpRouterServiceFactory: ( + options?: RootHttpRouterFactoryOptions | undefined, +) => ServiceFactory; + // @public -export const rootLifecycleFactory: () => ServiceFactory; +export const rootLifecycleServiceFactory: () => ServiceFactory; // @public (undocumented) -export const rootLoggerFactory: () => ServiceFactory; +export const rootLoggerServiceFactory: () => ServiceFactory; // @public (undocumented) -export const schedulerFactory: () => ServiceFactory; +export const schedulerServiceFactory: () => ServiceFactory; // @public (undocumented) export type ServiceOrExtensionPoint = @@ -257,10 +257,10 @@ export type ServiceOrExtensionPoint = | ServiceRef; // @public (undocumented) -export const tokenManagerFactory: () => ServiceFactory; +export const tokenManagerServiceFactory: () => ServiceFactory; // @public (undocumented) -export const urlReaderFactory: () => ServiceFactory; +export const urlReaderServiceFactory: () => ServiceFactory; // @public export class WinstonLogger implements RootLoggerService { From da208444d0c3080dec643e9052f7b32e44f8e72a Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:37:28 +0100 Subject: [PATCH 38/98] chore: removing extraneous imports as they already ship with the TestBackend now Signed-off-by: blam --- .../src/run.ts | 28 +------------------ 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts index d41b9be115..e9cc7dbb2a 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts @@ -13,20 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -// eslint-disable-next-line @backstage/no-undeclared-imports -import { - databaseServiceFactory, - discoveryServiceFactory, - httpRouterServiceFactory, - lifecycleServiceFactory, - loggerServiceFactory, - permissionsServiceFactory, - rootLoggerServiceFactory, - schedulerServiceFactory, - tokenManagerServiceFactory, - urlReaderServiceFactory, -} from '@backstage/backend-app-api'; import { coreServices } from '@backstage/backend-plugin-api'; import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; @@ -61,19 +47,7 @@ async function main() { }; await startTestBackend({ - services: [ - [coreServices.config, new ConfigReader(config)], - databaseServiceFactory(), - discoveryServiceFactory(), - httpRouterServiceFactory(), - lifecycleServiceFactory(), - loggerServiceFactory(), - permissionsServiceFactory(), - rootLoggerServiceFactory(), - schedulerServiceFactory(), - tokenManagerServiceFactory(), - urlReaderServiceFactory(), - ], + services: [[coreServices.config, new ConfigReader(config)]], extensionPoints: [], features: [ catalogPlugin(), From 407dc01fc9b4a576d37366b10636bd51d9f451ae Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:38:17 +0100 Subject: [PATCH 39/98] chore: changeset Signed-off-by: blam --- .changeset/friendly-chefs-rule.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/friendly-chefs-rule.md diff --git a/.changeset/friendly-chefs-rule.md b/.changeset/friendly-chefs-rule.md new file mode 100644 index 0000000000..872a36b5ae --- /dev/null +++ b/.changeset/friendly-chefs-rule.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +--- + +Removing extra imports for `run` script as `TestBackend` auto loads the default factories From e412d33025e0ab25b948fa946a8d3b8fe8d9bf95 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:40:10 +0100 Subject: [PATCH 40/98] chore: last changeset Signed-off-by: blam --- .changeset/quick-mice-change.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/quick-mice-change.md diff --git a/.changeset/quick-mice-change.md b/.changeset/quick-mice-change.md new file mode 100644 index 0000000000..aeee24a021 --- /dev/null +++ b/.changeset/quick-mice-change.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-test-utils': patch +'@backstage/backend-defaults': patch +--- + +Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` From b286e3d286e32c221f7d16e4f0021ecef5a6be31 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:53:54 +0100 Subject: [PATCH 41/98] rename: `plain` -> `pem` Signed-off-by: blam --- packages/backend-app-api/api-report.md | 2 +- packages/backend-app-api/src/http/config.test.ts | 2 +- packages/backend-app-api/src/http/config.ts | 2 +- packages/backend-app-api/src/http/types.ts | 2 +- packages/backend-common/src/service/lib/ServiceBuilderImpl.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 8dc85d1728..1c05f14ddb 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -133,7 +133,7 @@ export interface HttpRouterFactoryOptions { // @public export type HttpServerCertificateOptions = | { - type: 'plain'; + type: 'pem'; key: string; cert: string; } diff --git a/packages/backend-app-api/src/http/config.test.ts b/packages/backend-app-api/src/http/config.test.ts index f54ba927ca..577bae08f3 100644 --- a/packages/backend-app-api/src/http/config.test.ts +++ b/packages/backend-app-api/src/http/config.test.ts @@ -53,7 +53,7 @@ describe('readHttpServerOptions', () => { { listen: { host: '', port: 7007 }, https: { - certificate: { type: 'plain', cert: 'my-cert', key: 'my-key' }, + certificate: { type: 'pem', cert: 'my-cert', key: 'my-key' }, }, }, ], diff --git a/packages/backend-app-api/src/http/config.ts b/packages/backend-app-api/src/http/config.ts index e3b41c63de..ec29a8a044 100644 --- a/packages/backend-app-api/src/http/config.ts +++ b/packages/backend-app-api/src/http/config.ts @@ -93,7 +93,7 @@ function readHttpsOptions(config?: Config): HttpServerOptions['https'] { return { certificate: { - type: 'plain', + type: 'pem', cert: cc.getString('certificate.cert'), key: cc.getString('certificate.key'), }, diff --git a/packages/backend-app-api/src/http/types.ts b/packages/backend-app-api/src/http/types.ts index ff96f69bff..2298ef11ff 100644 --- a/packages/backend-app-api/src/http/types.ts +++ b/packages/backend-app-api/src/http/types.ts @@ -51,7 +51,7 @@ export type HttpServerOptions = { */ export type HttpServerCertificateOptions = | { - type: 'plain'; + type: 'pem'; key: string; cert: string; } diff --git a/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts b/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts index f74dcd9b64..f577017b77 100644 --- a/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts +++ b/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts @@ -102,7 +102,7 @@ export class ServiceBuilderImpl implements ServiceBuilder { this.serverOptions.https = { certificate: { ...settings.certificate, - type: 'plain', + type: 'pem', }, }; } From d31d8e00b3d64c520b52e35b408ac9af4e269c7f Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 13:57:08 +0100 Subject: [PATCH 42/98] chore: added changesets Signed-off-by: blam --- .changeset/hot-wasps-cover.md | 5 +++++ .changeset/soft-actors-worry.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/hot-wasps-cover.md create mode 100644 .changeset/soft-actors-worry.md diff --git a/.changeset/hot-wasps-cover.md b/.changeset/hot-wasps-cover.md new file mode 100644 index 0000000000..e142980b56 --- /dev/null +++ b/.changeset/hot-wasps-cover.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Updated to work with the new `type: 'pem'` with `createHttpServer` from `@backstage/backend-app-api` diff --git a/.changeset/soft-actors-worry.md b/.changeset/soft-actors-worry.md new file mode 100644 index 0000000000..5186499292 --- /dev/null +++ b/.changeset/soft-actors-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': minor +--- + +**BREAKING** `HttpServerCertificateOptions` when specified with a `key` and `cert` should also have the `type: 'pem'` instead of `type: 'plain'` From ab2c12fa1dad1fcf647cd8c4028f84b38e023c0f Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 16 Jan 2023 17:02:15 +0100 Subject: [PATCH 43/98] chore: moved across the work from previous branch Signed-off-by: blam --- .../src/components/hooks/useEventStream.ts | 2 +- plugins/scaffolder/src/next/Router/Router.tsx | 14 ++++- .../scaffolder/src/next/TaskPage/TaskPage.tsx | 63 +++++++++++++++++++ .../src/next/TaskPage/TaskSteps/TaskSteps.tsx | 63 +++++++++++++++++++ .../src/next/TaskPage/TaskSteps/index.ts | 16 +++++ plugins/scaffolder/src/next/TaskPage/index.ts | 16 +++++ .../TemplateWizardPage/TemplateWizardPage.tsx | 17 +++-- 7 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 plugins/scaffolder/src/next/TaskPage/TaskPage.tsx create mode 100644 plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx create mode 100644 plugins/scaffolder/src/next/TaskPage/TaskSteps/index.ts create mode 100644 plugins/scaffolder/src/next/TaskPage/index.ts diff --git a/plugins/scaffolder/src/components/hooks/useEventStream.ts b/plugins/scaffolder/src/components/hooks/useEventStream.ts index 0b36c85ad8..be0ff922a4 100644 --- a/plugins/scaffolder/src/components/hooks/useEventStream.ts +++ b/plugins/scaffolder/src/components/hooks/useEventStream.ts @@ -25,7 +25,7 @@ import { import { useApi } from '@backstage/core-plugin-api'; import { Subscription } from '@backstage/types'; -type Step = { +export type Step = { id: string; status: ScaffolderTaskStatus; endedAt?: string; diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 8dd47b478e..f5e186eb67 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -28,7 +28,14 @@ import { import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; -import { nextSelectedTemplateRouteRef } from '../routes'; + +import { FormProps } from '../types'; +import { + nextScaffolderTaskRouteRef, + nextSelectedTemplateRouteRef, +} from '../routes'; +import { ErrorPage } from '@backstage/core-components'; +import { TaskPage } from '../TaskPage'; /** * The Props for the Scaffolder Router @@ -91,6 +98,11 @@ export const Router = (props: PropsWithChildren) => { } /> + } /> + } + /> ); }; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx new file mode 100644 index 0000000000..f259231e4d --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx @@ -0,0 +1,63 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useMemo } from 'react'; +import { Page, Header, Content } from '@backstage/core-components'; +import { useTaskEventStream } from '../../components/hooks/useEventStream'; +import { useParams } from 'react-router-dom'; +import { Box, LinearProgress, Paper } from '@material-ui/core'; +import { TaskSteps } from './TaskSteps'; + +export const TaskPage = () => { + const { taskId } = useParams(); + // check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. + const taskStream = useTaskEventStream(taskId!); + const steps = useMemo( + () => + taskStream.task?.spec.steps.map(step => ({ + ...step, + ...taskStream?.steps?.[step.id], + })) ?? [], + [taskStream], + ); + + const activeStep = React.useMemo(() => { + for (let i = steps.length - 1; i >= 0; i--) { + if (steps[i].status !== 'open') { + return i; + } + } + + return 0; + }, [steps]); + + return ( + +

+ + + + + + + + + + ); +}; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx b/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx new file mode 100644 index 0000000000..fb24a8a832 --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx @@ -0,0 +1,63 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { + Stepper as MuiStepper, + Step as MuiStep, + StepButton as MuiStepButton, + StepLabel as MuiStepLabel, +} from '@material-ui/core'; +import { TaskStep } from '@backstage/plugin-scaffolder-common'; +import { Step } from '../../../components/hooks/useEventStream'; + +interface StepperProps { + steps: (TaskStep & Step)[]; + activeStep?: number; + setActiveStep?: (step: number) => void; +} + +export const TaskSteps = (props: StepperProps) => { + return ( + + {props.steps.map((step, index) => { + const isCompleted = step.status === 'completed'; + const isFailed = step.status === 'failed'; + const isActive = step.status === 'processing'; + const isSkipped = step.status === 'skipped'; + + return ( + + + + {step.name} + + + + ); + })} + + ); +}; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/index.ts b/plugins/scaffolder/src/next/TaskPage/TaskSteps/index.ts new file mode 100644 index 0000000000..28724ba512 --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/TaskSteps/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { TaskSteps } from './TaskSteps'; diff --git a/plugins/scaffolder/src/next/TaskPage/index.ts b/plugins/scaffolder/src/next/TaskPage/index.ts new file mode 100644 index 0000000000..9b6e502fed --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { TaskPage } from './TaskPage'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index d24482a583..b71d0bd7a3 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -28,12 +28,17 @@ import { Workflow, type LayoutOptions, } from '@backstage/plugin-scaffolder-react'; -import { NextFieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; +import { + NextFieldExtensionOptions, + FormProps, +} from '@backstage/plugin-scaffolder-react'; import { JsonValue } from '@backstage/types'; -import { type FormProps } from '../types'; -import { nextRouteRef } from '../routes'; -import { scaffolderTaskRouteRef, selectedTemplateRouteRef } from '../../routes'; import { Header, Page } from '@backstage/core-components'; +import { + nextRouteRef, + nextScaffolderTaskRouteRef, + nextSelectedTemplateRouteRef, +} from '../routes'; export type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; @@ -43,12 +48,12 @@ export type TemplateWizardPageProps = { export const TemplateWizardPage = (props: TemplateWizardPageProps) => { const rootRef = useRouteRef(nextRouteRef); - const taskRoute = useRouteRef(scaffolderTaskRouteRef); + const taskRoute = useRouteRef(nextScaffolderTaskRouteRef); const { secrets } = useTemplateSecrets(); const scaffolderApi = useApi(scaffolderApiRef); const navigate = useNavigate(); const { templateName, namespace } = useRouteRefParams( - selectedTemplateRouteRef, + nextSelectedTemplateRouteRef, ); const templateRef = stringifyEntityRef({ From 29feff150ed9b13d6d94e8c0e4358ff83a0e7aa2 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 17 Jan 2023 15:49:02 +0100 Subject: [PATCH 44/98] chore: added some more things for enabling testing Signed-off-by: blam --- app-config.yaml | 6 +++ packages/backend/src/plugins/scaffolder.ts | 28 +++++++++++++- packages/backend/test-template.yaml | 37 +++++++++++++++++++ .../default-app/app-config.local.yaml | 4 ++ .../scaffolder/src/next/TaskPage/TaskPage.tsx | 4 +- .../src/next/TaskPage/TaskSteps/TaskSteps.tsx | 19 ++++++---- 6 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 packages/backend/test-template.yaml diff --git a/app-config.yaml b/app-config.yaml index dd72051189..2eed4762ce 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -255,6 +255,12 @@ catalog: # Backstage example entities - type: file target: ../catalog-model/examples/all.yaml + + - type: file + target: ./test-template.yaml + rules: + - allow: [Template] + # Backstage example groups and users - type: file target: ../catalog-model/examples/acme-corp.yaml diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index d079b64c28..b6275e9883 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -15,7 +15,12 @@ */ import { CatalogClient } from '@backstage/catalog-client'; -import { createRouter } from '@backstage/plugin-scaffolder-backend'; +import { ScmIntegrations } from '@backstage/integration'; +import { + createRouter, + createTemplateAction, + createBuiltinActions, +} from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import type { PluginEnvironment } from '../types'; @@ -26,6 +31,26 @@ export default async function createPlugin( discoveryApi: env.discovery, }); + const defaultActions = createBuiltinActions({ + catalogClient, + reader: env.reader, + config: env.config, + integrations: ScmIntegrations.fromConfig(env.config), + }); + + const delayAction = createTemplateAction({ + id: 'mock:delay', + async handler(ctx) { + const interval = setInterval( + () => ctx.logger.info('Writing something', new Date().toISOString()), + 1000, + ); + + await new Promise(resolve => setTimeout(resolve, 5000)); + clearTimeout(interval); + }, + }); + return await createRouter({ logger: env.logger, config: env.config, @@ -34,5 +59,6 @@ export default async function createPlugin( reader: env.reader, identity: env.identity, scheduler: env.scheduler, + actions: [...defaultActions, delayAction], }); } diff --git a/packages/backend/test-template.yaml b/packages/backend/test-template.yaml new file mode 100644 index 0000000000..13a002e0b9 --- /dev/null +++ b/packages/backend/test-template.yaml @@ -0,0 +1,37 @@ +apiVersion: scaffolder.backstage.io/v1beta3 +# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-template +kind: Template +metadata: + name: example-delay-tempalte + title: Delay template + description: An example template for the scaffolder that creates a simple Node.js service +spec: + type: service + + parameters: [] + + steps: + - id: delay1 + name: Delay 1 + action: mock:delay + + - id: delay2 + name: Delay 2 + action: mock:delay + + - id: delay3 + name: Delay 3 + action: mock:delay + + - id: delay4 + name: Delay 4 + action: mock:delay + + - id: delay5 + if: true + name: Delay 5 + action: mock:delay + + - id: delay6 + name: Delay 6 + action: mock:delay diff --git a/packages/create-app/templates/default-app/app-config.local.yaml b/packages/create-app/templates/default-app/app-config.local.yaml index 976293b546..6b4dcd0327 100644 --- a/packages/create-app/templates/default-app/app-config.local.yaml +++ b/packages/create-app/templates/default-app/app-config.local.yaml @@ -1 +1,5 @@ # Backstage override configuration for your local development environment +catalog: + locations: + - type: file + target: ./test-template.yaml diff --git a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx index f259231e4d..f9a84d2355 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx @@ -52,7 +52,9 @@ export const TaskPage = () => { /> - + {!taskStream.completed && ( + + )} diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx b/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx index fb24a8a832..4095872465 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx +++ b/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx @@ -19,9 +19,11 @@ import { Step as MuiStep, StepButton as MuiStepButton, StepLabel as MuiStepLabel, + StepIconProps, } from '@material-ui/core'; import { TaskStep } from '@backstage/plugin-scaffolder-common'; import { Step } from '../../../components/hooks/useEventStream'; +import RemoveCircleOutlineIcon from '@material-ui/icons/RemoveCircleOutline'; interface StepperProps { steps: (TaskStep & Step)[]; @@ -41,17 +43,20 @@ export const TaskSteps = (props: StepperProps) => { const isFailed = step.status === 'failed'; const isActive = step.status === 'processing'; const isSkipped = step.status === 'skipped'; + const stepIconProps: Partial = { + completed: isCompleted, + error: isFailed, + active: isActive, + }; + + if (isSkipped) { + stepIconProps.icon = ; + } return ( - + {step.name} From 07c675f7ebd4fe3b72a808ff6cfd35c3f4b15af6 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 25 Jan 2023 10:14:48 +0100 Subject: [PATCH 45/98] chore: added times to the dropdown box Signed-off-by: blam --- plugins/scaffolder/src/next/Router/Router.tsx | 1 - .../scaffolder/src/next/TaskPage/TaskPage.tsx | 5 +- .../src/next/TaskPage/TaskSteps/StepIcon.tsx | 71 +++++++++++++++++++ .../src/next/TaskPage/TaskSteps/StepTime.tsx | 53 ++++++++++++++ .../src/next/TaskPage/TaskSteps/TaskSteps.tsx | 17 +++-- 5 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 plugins/scaffolder/src/next/TaskPage/TaskSteps/StepIcon.tsx create mode 100644 plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index f5e186eb67..8de9ac57e4 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -29,7 +29,6 @@ import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; -import { FormProps } from '../types'; import { nextScaffolderTaskRouteRef, nextSelectedTemplateRouteRef, diff --git a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx index f9a84d2355..138c6ac24e 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx @@ -52,11 +52,10 @@ export const TaskPage = () => { /> - {!taskStream.completed && ( - - )} + {!taskStream.completed && } + {/* */} diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepIcon.tsx b/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepIcon.tsx new file mode 100644 index 0000000000..39ef37c771 --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepIcon.tsx @@ -0,0 +1,71 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; + +import { BackstageTheme } from '@backstage/theme'; +import { CircularProgress, makeStyles, StepIconProps } from '@material-ui/core'; +import RemoveCircleOutline from '@material-ui/icons/RemoveCircleOutline'; +import FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord'; +import classNames from 'classnames'; +import CheckCircleOutline from '@material-ui/icons/CheckCircleOutline'; +import DeleteOutline from '@material-ui/icons/DeleteOutline'; + +const useStepIconStyles = makeStyles((theme: BackstageTheme) => ({ + root: { + color: theme.palette.text.disabled, + }, + completed: { + color: theme.palette.status.ok, + }, + error: { + color: theme.palette.status.error, + }, +})); + +export const StepIcon = (props: StepIconProps & { skipped: boolean }) => { + const classes = useStepIconStyles(); + const { active, completed, error, skipped } = props; + + const getMiddle = () => { + if (active) { + return ; + } + if (completed) { + return ; + } + + if (error) { + return ; + } + + if (skipped) { + return ; + } + + return ; + }; + + return ( +
+ {getMiddle()} +
+ ); +}; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx b/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx new file mode 100644 index 0000000000..f2d3116854 --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx @@ -0,0 +1,53 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { useState } from 'react'; +import useInterval from 'react-use/lib/useInterval'; +import { DateTime, Interval } from 'luxon'; +import humanizeDuration from 'humanize-duration'; +import { Typography } from '@material-ui/core'; + +export const StepTime = ({ + step, +}: { + step: { + id: string; + name: string; + startedAt?: string; + endedAt?: string; + }; +}) => { + const [time, setTime] = useState(''); + + useInterval(() => { + if (!step.startedAt) { + setTime(''); + return; + } + + const end = step.endedAt + ? DateTime.fromISO(step.endedAt) + : DateTime.local(); + + const startedAt = DateTime.fromISO(step.startedAt); + const formatted = Interval.fromDateTimes(startedAt, end) + .toDuration() + .valueOf(); + + setTime(humanizeDuration(formatted, { round: true })); + }, 1000); + + return {time}; +}; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx b/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx index 4095872465..40f9f9c189 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx +++ b/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx @@ -23,7 +23,8 @@ import { } from '@material-ui/core'; import { TaskStep } from '@backstage/plugin-scaffolder-common'; import { Step } from '../../../components/hooks/useEventStream'; -import RemoveCircleOutlineIcon from '@material-ui/icons/RemoveCircleOutline'; +import { StepIcon } from './StepIcon'; +import { StepTime } from './StepTime'; interface StepperProps { steps: (TaskStep & Step)[]; @@ -43,21 +44,23 @@ export const TaskSteps = (props: StepperProps) => { const isFailed = step.status === 'failed'; const isActive = step.status === 'processing'; const isSkipped = step.status === 'skipped'; - const stepIconProps: Partial = { + const stepIconProps: Partial = { completed: isCompleted, error: isFailed, active: isActive, + skipped: isSkipped, }; - if (isSkipped) { - stepIconProps.icon = ; - } - return ( - + {step.name} +
+
From 66948f1a99dd676ad0f602de66b9f96e8f1308e2 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 25 Jan 2023 14:19:50 +0100 Subject: [PATCH 46/98] chore: make a little clearer when a task has failed Signed-off-by: blam --- .../src/next/TaskPage/TaskBorder.tsx | 51 +++++++++++++++++++ .../scaffolder/src/next/TaskPage/TaskPage.tsx | 8 ++- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 plugins/scaffolder/src/next/TaskPage/TaskBorder.tsx diff --git a/plugins/scaffolder/src/next/TaskPage/TaskBorder.tsx b/plugins/scaffolder/src/next/TaskPage/TaskBorder.tsx new file mode 100644 index 0000000000..1bf09bf207 --- /dev/null +++ b/plugins/scaffolder/src/next/TaskPage/TaskBorder.tsx @@ -0,0 +1,51 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { LinearProgress, makeStyles } from '@material-ui/core'; +import { BackstageTheme } from '@backstage/theme'; + +const useStyles = makeStyles((theme: BackstageTheme) => ({ + failed: { + backgroundColor: theme.palette.error.main, + }, + success: { + backgroundColor: theme.palette.success.main, + }, +})); + +export const TaskBorder = ({ + isComplete, + isError, +}: { + isComplete: boolean; + isError: boolean; +}) => { + const styles = useStyles(); + + if (!isComplete) { + return ; + } + + if (isError) { + return ( + + ); + } + + return ( + + ); +}; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx index 138c6ac24e..87d5d35453 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx @@ -17,8 +17,9 @@ import React, { useMemo } from 'react'; import { Page, Header, Content } from '@backstage/core-components'; import { useTaskEventStream } from '../../components/hooks/useEventStream'; import { useParams } from 'react-router-dom'; -import { Box, LinearProgress, Paper } from '@material-ui/core'; +import { Box, Paper } from '@material-ui/core'; import { TaskSteps } from './TaskSteps'; +import { TaskBorder } from './TaskBorder'; export const TaskPage = () => { const { taskId } = useParams(); @@ -52,7 +53,10 @@ export const TaskPage = () => { /> - {!taskStream.completed && } + {/* */} From 2b27e58084815f9a88fea94d19f5bb71e13e0ed7 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 25 Jan 2023 15:29:21 +0100 Subject: [PATCH 47/98] chore: change order of hooks Signed-off-by: blam --- .../scaffolder-react/src/next/components/Stepper/Stepper.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index 9242ef0086..f802121597 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -127,6 +127,8 @@ export const Stepper = (stepperProps: StepperProps) => { [setFormState], ); + const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts }); + const handleNext = async ({ formData = {}, }: { @@ -151,8 +153,6 @@ export const Stepper = (stepperProps: StepperProps) => { setFormState(current => ({ ...current, ...formData })); }; - const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts }); - return ( <> From 5cc6278ddc52d8f72ae0cd46f18766484cf4a6cb Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 25 Jan 2023 16:26:01 +0100 Subject: [PATCH 48/98] chore: moving some files around and making them pretty Signed-off-by: blam --- .../src/components/LogViewer/LogLine.tsx | 7 ++-- .../OngoingTask.tsx} | 18 ++++++--- .../{TaskPage => OngoingTask}/TaskBorder.tsx | 0 .../src/next/OngoingTask/TaskLogStream.tsx | 39 +++++++++++++++++++ .../TaskSteps/StepIcon.tsx | 0 .../TaskSteps/StepTime.tsx | 10 +++-- .../TaskSteps/TaskSteps.tsx | 0 .../TaskSteps/index.ts | 0 .../next/{TaskPage => OngoingTask}/index.ts | 2 +- plugins/scaffolder/src/next/Router/Router.tsx | 4 +- 10 files changed, 65 insertions(+), 15 deletions(-) rename plugins/scaffolder/src/next/{TaskPage/TaskPage.tsx => OngoingTask/OngoingTask.tsx} (82%) rename plugins/scaffolder/src/next/{TaskPage => OngoingTask}/TaskBorder.tsx (100%) create mode 100644 plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx rename plugins/scaffolder/src/next/{TaskPage => OngoingTask}/TaskSteps/StepIcon.tsx (100%) rename plugins/scaffolder/src/next/{TaskPage => OngoingTask}/TaskSteps/StepTime.tsx (85%) rename plugins/scaffolder/src/next/{TaskPage => OngoingTask}/TaskSteps/TaskSteps.tsx (100%) rename plugins/scaffolder/src/next/{TaskPage => OngoingTask}/TaskSteps/index.ts (100%) rename plugins/scaffolder/src/next/{TaskPage => OngoingTask}/index.ts (93%) diff --git a/packages/core-components/src/components/LogViewer/LogLine.tsx b/packages/core-components/src/components/LogViewer/LogLine.tsx index 8f3a2ce65c..c8ff5cbceb 100644 --- a/packages/core-components/src/components/LogViewer/LogLine.tsx +++ b/packages/core-components/src/components/LogViewer/LogLine.tsx @@ -15,7 +15,6 @@ */ import React, { useMemo } from 'react'; -import Typography from '@material-ui/core/Typography'; import { AnsiChunk, AnsiLine, ChunkModifiers } from './AnsiProcessor'; import startCase from 'lodash/startCase'; import classnames from 'classnames'; @@ -159,8 +158,8 @@ export function LogLine({ const elements = useMemo( () => chunks.map(({ text, modifiers, highlight }, index) => ( - {text} - + )), [chunks, highlightResultIndex, classes], ); diff --git a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx similarity index 82% rename from plugins/scaffolder/src/next/TaskPage/TaskPage.tsx rename to plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index 87d5d35453..feed582745 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -20,8 +20,9 @@ import { useParams } from 'react-router-dom'; import { Box, Paper } from '@material-ui/core'; import { TaskSteps } from './TaskSteps'; import { TaskBorder } from './TaskBorder'; +import { TaskLogStream } from './TaskLogStream'; -export const TaskPage = () => { +export const OngoingTask = () => { const { taskId } = useParams(); // check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. const taskStream = useTaskEventStream(taskId!); @@ -44,12 +45,19 @@ export const TaskPage = () => { return 0; }, [steps]); + const templateName = + taskStream.task?.spec.templateInfo?.entity?.metadata.name; + return (
+ Run of {templateName} + + } + subtitle={`Task ${taskId}`} /> @@ -59,7 +67,7 @@ export const TaskPage = () => { /> - {/* */} + diff --git a/plugins/scaffolder/src/next/TaskPage/TaskBorder.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx similarity index 100% rename from plugins/scaffolder/src/next/TaskPage/TaskBorder.tsx rename to plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx new file mode 100644 index 0000000000..0060a9c9be --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx @@ -0,0 +1,39 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { LogViewer } from '@backstage/core-components'; +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles({ + root: { + width: '100%', + height: '200px', + position: 'relative', + }, +}); + +export const TaskLogStream = (opts: { logs: { [k: string]: string[] } }) => { + const styles = useStyles(); + return ( +
+ l.join('\n')) + .join('\n')} + /> +
+ ); +}; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepIcon.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepIcon.tsx similarity index 100% rename from plugins/scaffolder/src/next/TaskPage/TaskSteps/StepIcon.tsx rename to plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepIcon.tsx diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx similarity index 85% rename from plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx rename to plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx index f2d3116854..746007a7d3 100644 --- a/plugins/scaffolder/src/next/TaskPage/TaskSteps/StepTime.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import useInterval from 'react-use/lib/useInterval'; import { DateTime, Interval } from 'luxon'; import humanizeDuration from 'humanize-duration'; @@ -31,7 +31,7 @@ export const StepTime = ({ }) => { const [time, setTime] = useState(''); - useInterval(() => { + const calculate = useCallback(() => { if (!step.startedAt) { setTime(''); return; @@ -47,7 +47,11 @@ export const StepTime = ({ .valueOf(); setTime(humanizeDuration(formatted, { round: true })); - }, 1000); + }, [step.endedAt, step.startedAt]); + + useMemo(() => calculate(), [calculate]); + + useInterval(() => !step.endedAt && calculate(), 1000); return {time}; }; diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.tsx similarity index 100% rename from plugins/scaffolder/src/next/TaskPage/TaskSteps/TaskSteps.tsx rename to plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.tsx diff --git a/plugins/scaffolder/src/next/TaskPage/TaskSteps/index.ts b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/index.ts similarity index 100% rename from plugins/scaffolder/src/next/TaskPage/TaskSteps/index.ts rename to plugins/scaffolder/src/next/OngoingTask/TaskSteps/index.ts diff --git a/plugins/scaffolder/src/next/TaskPage/index.ts b/plugins/scaffolder/src/next/OngoingTask/index.ts similarity index 93% rename from plugins/scaffolder/src/next/TaskPage/index.ts rename to plugins/scaffolder/src/next/OngoingTask/index.ts index 9b6e502fed..f0c7e2a6cc 100644 --- a/plugins/scaffolder/src/next/TaskPage/index.ts +++ b/plugins/scaffolder/src/next/OngoingTask/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { TaskPage } from './TaskPage'; +export { OngoingTask } from './OngoingTask'; diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 8de9ac57e4..b9c18f9d02 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -34,7 +34,7 @@ import { nextSelectedTemplateRouteRef, } from '../routes'; import { ErrorPage } from '@backstage/core-components'; -import { TaskPage } from '../TaskPage'; +import { OngoingTask } from '../OngoingTask'; /** * The Props for the Scaffolder Router @@ -97,7 +97,7 @@ export const Router = (props: PropsWithChildren) => { } /> - } /> + } /> } From c230ae79201037eea289c61045314f6c854eef65 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 30 Jan 2023 16:04:55 +0100 Subject: [PATCH 49/98] feat: added the ability to tail the logs on the LogViewer Signed-off-by: blam --- .../core-components/src/components/LogViewer/LogViewer.tsx | 4 ++++ .../src/components/LogViewer/RealLogViewer.tsx | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/packages/core-components/src/components/LogViewer/LogViewer.tsx b/packages/core-components/src/components/LogViewer/LogViewer.tsx index 20530cffaf..f1396eef36 100644 --- a/packages/core-components/src/components/LogViewer/LogViewer.tsx +++ b/packages/core-components/src/components/LogViewer/LogViewer.tsx @@ -39,6 +39,10 @@ export interface LogViewerProps { classes?: { root?: string; }; + /** + * Whether the LogViewer should automatically scroll to the bottom of the log. + */ + tail?: boolean; } /** diff --git a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx index 59e0bea44b..d211399c69 100644 --- a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx +++ b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx @@ -32,6 +32,7 @@ import { useLogViewerSelection } from './useLogViewerSelection'; export interface RealLogViewerProps { text: string; classes?: { root?: string }; + tail?: boolean; } export function RealLogViewer(props: RealLogViewerProps) { @@ -52,6 +53,12 @@ export function RealLogViewer(props: RealLogViewerProps) { } }, [search.resultLine]); + useEffect(() => { + if (props.tail && listRef.current) { + listRef.current.scrollToItem(lines.length - 1, 'center'); + } + }, [lines.length, props.tail]); + useEffect(() => { if (location.hash) { // #line-6 -> 6 From ce32a61d388c29008deeaf20cd5494eb3d6d42d0 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 30 Jan 2023 22:03:36 +0100 Subject: [PATCH 50/98] chore: changeset and fixing tserrors Signed-off-by: blam --- .changeset/nasty-students-double.md | 5 +++++ .../scaffolder/src/next/OngoingTask/TaskBorder.tsx | 12 +++++------- .../src/next/OngoingTask/TaskLogStream.tsx | 4 ++++ 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 .changeset/nasty-students-double.md diff --git a/.changeset/nasty-students-double.md b/.changeset/nasty-students-double.md new file mode 100644 index 0000000000..d552fdf91e --- /dev/null +++ b/.changeset/nasty-students-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Added the ability to tail the `LogViewer` logs diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx index 1bf09bf207..ada4db1240 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx @@ -39,13 +39,11 @@ export const TaskBorder = ({ return ; } - if (isError) { - return ( - - ); - } - return ( - + ); }; diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx index 0060a9c9be..d587f47f17 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx @@ -30,8 +30,12 @@ export const TaskLogStream = (opts: { logs: { [k: string]: string[] } }) => { return (
l.join('\n')) + .filter(Boolean) + .join('\n')} />
From c4b6770b67265d48c3e94860fd64347dda669c90 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 12:53:53 +0100 Subject: [PATCH 51/98] chore: refactor and tidy up the UI slightly Signed-off-by: blam --- .../src/next/OngoingTask/OngoingTask.tsx | 98 ++++++++++++++++--- .../src/next/OngoingTask/TaskLogStream.tsx | 4 +- .../next/OngoingTask/TaskSteps/StepIcon.tsx | 8 +- 3 files changed, 89 insertions(+), 21 deletions(-) diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index feed582745..68e05f29e2 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -13,18 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useMemo } from 'react'; +import React, { useEffect, useMemo, useState, useCallback } from 'react'; import { Page, Header, Content } from '@backstage/core-components'; import { useTaskEventStream } from '../../components/hooks/useEventStream'; -import { useParams } from 'react-router-dom'; -import { Box, Paper } from '@material-ui/core'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, Button, Paper } from '@material-ui/core'; import { TaskSteps } from './TaskSteps'; import { TaskBorder } from './TaskBorder'; import { TaskLogStream } from './TaskLogStream'; +import { nextSelectedTemplateRouteRef } from '../routes'; +import { useRouteRef } from '@backstage/core-plugin-api'; +import qs from 'qs'; export const OngoingTask = () => { + // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. const { taskId } = useParams(); - // check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. + const templateRouteRef = useRouteRef(nextSelectedTemplateRouteRef); + const navigate = useNavigate(); const taskStream = useTaskEventStream(taskId!); const steps = useMemo( () => @@ -35,7 +40,15 @@ export const OngoingTask = () => { [taskStream], ); - const activeStep = React.useMemo(() => { + const [logsVisible, setLogsVisible] = useState(false); + + useEffect(() => { + if (taskStream.error) { + setLogsVisible(true); + } + }, [taskStream.error]); + + const activeStep = useMemo(() => { for (let i = steps.length - 1; i >= 0; i--) { if (steps[i].status !== 'open') { return i; @@ -45,6 +58,30 @@ export const OngoingTask = () => { return 0; }, [steps]); + const startOver = useCallback(() => { + const { namespace, name } = + taskStream.task?.spec.templateInfo?.entity?.metadata ?? {}; + + const formData = taskStream.task?.spec.parameters ?? {}; + + if (!namespace || !name) { + return; + } + + navigate({ + pathname: templateRouteRef({ + namespace, + templateName: name, + }), + search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`, + }); + }, [ + navigate, + taskStream.task?.spec.parameters, + taskStream.task?.spec.templateInfo?.entity?.metadata, + templateRouteRef, + ]); + const templateName = taskStream.task?.spec.templateInfo?.entity?.metadata.name; @@ -60,16 +97,49 @@ export const OngoingTask = () => { subtitle={`Task ${taskId}`} /> - - - - - + + + + + + + + + + + + + + + + + + + {logsVisible ? ( + + + + + + - + ) : null} ); diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx index d587f47f17..65c0022e1d 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx @@ -20,7 +20,7 @@ import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles({ root: { width: '100%', - height: '200px', + height: '100%', position: 'relative', }, }); @@ -32,10 +32,8 @@ export const TaskLogStream = (opts: { logs: { [k: string]: string[] } }) => { l.join('\n')) .filter(Boolean) - .join('\n')} /> diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepIcon.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepIcon.tsx index 39ef37c771..cecf682596 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepIcon.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepIcon.tsx @@ -18,10 +18,10 @@ import React from 'react'; import { BackstageTheme } from '@backstage/theme'; import { CircularProgress, makeStyles, StepIconProps } from '@material-ui/core'; import RemoveCircleOutline from '@material-ui/icons/RemoveCircleOutline'; -import FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord'; +import PanoramaFishEyeIcon from '@material-ui/icons/PanoramaFishEye'; import classNames from 'classnames'; import CheckCircleOutline from '@material-ui/icons/CheckCircleOutline'; -import DeleteOutline from '@material-ui/icons/DeleteOutline'; +import ErrorOutline from '@material-ui/icons/ErrorOutline'; const useStepIconStyles = makeStyles((theme: BackstageTheme) => ({ root: { @@ -48,14 +48,14 @@ export const StepIcon = (props: StepIconProps & { skipped: boolean }) => { } if (error) { - return ; + return ; } if (skipped) { return ; } - return ; + return ; }; return ( From 25d25778d0534d1a5acbc01ec73d844b402e9c90 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 13:39:56 +0100 Subject: [PATCH 52/98] chore: added default outputs to the template when there's links Signed-off-by: blam Signed-off-by: blam --- .../src/next/OngoingTask/OngoingTask.tsx | 4 +- .../OngoingTask/Outputs/DefaultOutputs.tsx | 35 ++++++++++ .../next/OngoingTask/Outputs/LinkOutputs.tsx | 70 +++++++++++++++++++ .../src/next/OngoingTask/Outputs/index.ts | 16 +++++ 4 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx create mode 100644 plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx create mode 100644 plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index 68e05f29e2..15669469fe 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -24,6 +24,7 @@ import { TaskLogStream } from './TaskLogStream'; import { nextSelectedTemplateRouteRef } from '../routes'; import { useRouteRef } from '@backstage/core-plugin-api'; import qs from 'qs'; +import { DefaultOutputs } from './Outputs'; export const OngoingTask = () => { // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. @@ -108,7 +109,7 @@ export const OngoingTask = () => { - + { - {logsVisible ? ( diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx b/plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx new file mode 100644 index 0000000000..39bf89e4c5 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx @@ -0,0 +1,35 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; +import { Box, Paper } from '@material-ui/core'; +import { LinkOutputs } from './LinkOutputs'; + +export const DefaultOutputs = (props: { output?: ScaffolderTaskOutput }) => { + if (!props.output?.links) { + return null; + } + + return ( + + + + + + + + ); +}; diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx b/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx new file mode 100644 index 0000000000..5d0f9c76fd --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx @@ -0,0 +1,70 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api'; +import { entityRouteRef } from '@backstage/plugin-catalog-react'; +import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; +import { Box, Button, makeStyles, Link } from '@material-ui/core'; +import React from 'react'; +import WebIcon from '@material-ui/icons/Web'; +import { parseEntityRef } from '@backstage/catalog-model'; + +const useStyles = makeStyles({ + root: { + '&:hover': { + textDecoration: 'none', + }, + }, +}); + +export const LinkOutputs = (props: { output: ScaffolderTaskOutput }) => { + const { links = [] } = props.output; + const classes = useStyles(); + const app = useApp(); + const entityRoute = useRouteRef(entityRouteRef); + + const iconResolver = (key?: string): IconComponent => + app.getSystemIcon(key!) ?? WebIcon; + + return ( + <> + {links + .filter(({ url, entityRef }) => url || entityRef) + .map(({ url, entityRef, title, icon }) => { + if (entityRef) { + const entityName = parseEntityRef(entityRef); + const target = entityRoute(entityName); + return { title, icon, url: target }; + } + return { title, icon, url: url! }; + }) + .map(({ url, title, icon }, i) => { + const Icon = iconResolver(icon); + return ( + } + > + {title} + + ); + })} + + ); +}; diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts b/plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts new file mode 100644 index 0000000000..647f1eebb2 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { DefaultOutputs } from './DefaultOutputs'; From 468cbbf55f3a6ed12f1f3503a4d21faeb8bbf619 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 13:46:07 +0100 Subject: [PATCH 53/98] chore: reset some files Signed-off-by: blam --- app-config.yaml | 6 --- packages/backend/src/plugins/scaffolder.ts | 28 +------------- packages/backend/test-template.yaml | 37 ------------------- .../default-app/app-config.local.yaml | 4 -- 4 files changed, 1 insertion(+), 74 deletions(-) delete mode 100644 packages/backend/test-template.yaml diff --git a/app-config.yaml b/app-config.yaml index 2eed4762ce..dd72051189 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -255,12 +255,6 @@ catalog: # Backstage example entities - type: file target: ../catalog-model/examples/all.yaml - - - type: file - target: ./test-template.yaml - rules: - - allow: [Template] - # Backstage example groups and users - type: file target: ../catalog-model/examples/acme-corp.yaml diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index b6275e9883..d079b64c28 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -15,12 +15,7 @@ */ import { CatalogClient } from '@backstage/catalog-client'; -import { ScmIntegrations } from '@backstage/integration'; -import { - createRouter, - createTemplateAction, - createBuiltinActions, -} from '@backstage/plugin-scaffolder-backend'; +import { createRouter } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import type { PluginEnvironment } from '../types'; @@ -31,26 +26,6 @@ export default async function createPlugin( discoveryApi: env.discovery, }); - const defaultActions = createBuiltinActions({ - catalogClient, - reader: env.reader, - config: env.config, - integrations: ScmIntegrations.fromConfig(env.config), - }); - - const delayAction = createTemplateAction({ - id: 'mock:delay', - async handler(ctx) { - const interval = setInterval( - () => ctx.logger.info('Writing something', new Date().toISOString()), - 1000, - ); - - await new Promise(resolve => setTimeout(resolve, 5000)); - clearTimeout(interval); - }, - }); - return await createRouter({ logger: env.logger, config: env.config, @@ -59,6 +34,5 @@ export default async function createPlugin( reader: env.reader, identity: env.identity, scheduler: env.scheduler, - actions: [...defaultActions, delayAction], }); } diff --git a/packages/backend/test-template.yaml b/packages/backend/test-template.yaml deleted file mode 100644 index 13a002e0b9..0000000000 --- a/packages/backend/test-template.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: scaffolder.backstage.io/v1beta3 -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-template -kind: Template -metadata: - name: example-delay-tempalte - title: Delay template - description: An example template for the scaffolder that creates a simple Node.js service -spec: - type: service - - parameters: [] - - steps: - - id: delay1 - name: Delay 1 - action: mock:delay - - - id: delay2 - name: Delay 2 - action: mock:delay - - - id: delay3 - name: Delay 3 - action: mock:delay - - - id: delay4 - name: Delay 4 - action: mock:delay - - - id: delay5 - if: true - name: Delay 5 - action: mock:delay - - - id: delay6 - name: Delay 6 - action: mock:delay diff --git a/packages/create-app/templates/default-app/app-config.local.yaml b/packages/create-app/templates/default-app/app-config.local.yaml index 6b4dcd0327..976293b546 100644 --- a/packages/create-app/templates/default-app/app-config.local.yaml +++ b/packages/create-app/templates/default-app/app-config.local.yaml @@ -1,5 +1 @@ # Backstage override configuration for your local development environment -catalog: - locations: - - type: file - target: ./test-template.yaml From 2d66fca317d0b2014127853b85b850b9a2f7d718 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 13:50:28 +0100 Subject: [PATCH 54/98] chore: changelog Signed-off-by: blam --- packages/core-components/api-report.md | 1 + plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 721c208406..f720e0305d 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -693,6 +693,7 @@ export interface LogViewerProps { classes?: { root?: string; }; + tail?: boolean; text: string; } diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx b/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx index 5d0f9c76fd..596e91d5ab 100644 --- a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx @@ -16,7 +16,7 @@ import { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; -import { Box, Button, makeStyles, Link } from '@material-ui/core'; +import { Button, makeStyles, Link } from '@material-ui/core'; import React from 'react'; import WebIcon from '@material-ui/icons/Web'; import { parseEntityRef } from '@backstage/catalog-model'; From b46f385effdf4928df5968e95bbc2077e7f6d3a0 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 13:51:26 +0100 Subject: [PATCH 55/98] chore: add changeset Signed-off-by: blam --- .changeset/eleven-shoes-crash.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/eleven-shoes-crash.md diff --git a/.changeset/eleven-shoes-crash.md b/.changeset/eleven-shoes-crash.md new file mode 100644 index 0000000000..8013f311d5 --- /dev/null +++ b/.changeset/eleven-shoes-crash.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +scaffolder/next: Implementing a simple `OngoingTask` page From ce0866d2e94c243ddc4bd0ba8f1e311d55a6d042 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 16:26:15 +0100 Subject: [PATCH 56/98] chore: writing some tests for the new components Signed-off-by: blam --- .../src/next/OngoingTask/TaskBorder.test.tsx | 40 ++++++++++ .../src/next/OngoingTask/TaskBorder.tsx | 9 +-- .../next/OngoingTask/TaskLogStream.test.tsx | 50 ++++++++++++ .../src/next/OngoingTask/TaskLogStream.tsx | 4 +- .../OngoingTask/TaskSteps/StepTime.test.tsx | 79 +++++++++++++++++++ .../next/OngoingTask/TaskSteps/StepTime.tsx | 5 +- 6 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 plugins/scaffolder/src/next/OngoingTask/TaskBorder.test.tsx create mode 100644 plugins/scaffolder/src/next/OngoingTask/TaskLogStream.test.tsx create mode 100644 plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.test.tsx diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskBorder.test.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.test.tsx new file mode 100644 index 0000000000..f3a59ad344 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.test.tsx @@ -0,0 +1,40 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { TaskBorder } from './TaskBorder'; +import { render } from '@testing-library/react'; + +describe('TaskBorder', () => { + it('should render a pending linear progress if the task is not complete', () => { + const { getByRole } = render( + , + ); + + const progressBar = getByRole('progressbar'); + + expect(progressBar).toBeInTheDocument(); + expect(progressBar).toHaveClass('MuiLinearProgress-indeterminate'); + }); + + it('should render a determinate progress bar if the task is complete', () => { + const { getByRole } = render(); + + const progressBar = getByRole('progressbar'); + + expect(progressBar).toBeInTheDocument(); + expect(progressBar).toHaveClass('MuiLinearProgress-determinate'); + }); +}); diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx index ada4db1240..fdfab17367 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskBorder.tsx @@ -26,23 +26,20 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({ }, })); -export const TaskBorder = ({ - isComplete, - isError, -}: { +export const TaskBorder = (props: { isComplete: boolean; isError: boolean; }) => { const styles = useStyles(); - if (!isComplete) { + if (!props.isComplete) { return ; } return ( ); diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.test.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.test.tsx new file mode 100644 index 0000000000..e8f9e67e96 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.test.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { renderInTestApp } from '@backstage/test-utils'; +import React, { ReactNode } from 'react'; +import { TaskLogStream } from './TaskLogStream'; + +// The inside needs mocking to render in jsdom +jest.mock('react-virtualized-auto-sizer', () => ({ + __esModule: true, + default: (props: { + children: (size: { width: number; height: number }) => ReactNode; + }) => <>{props.children({ width: 400, height: 200 })}, +})); + +describe('TaskLogStream', () => { + it('should render a log stream with the correct log lines', async () => { + const logs = { step: ['line 1', 'line 2'], step2: ['line 3'] }; + + const { findByText } = await renderInTestApp(); + + const logLines = Object.values(logs).flat(); + + for (const line of logLines) { + await expect(findByText(line)).resolves.toBeInTheDocument(); + } + }); + + it('should filter out empty log lines', async () => { + const logs = { step: ['line 1', 'line 2'], step2: [] }; + + const { findAllByRole } = await renderInTestApp( + , + ); + + await expect(findAllByRole('row')).resolves.toHaveLength(2); + }); +}); diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx index 65c0022e1d..2cfcdf1da6 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx @@ -25,13 +25,13 @@ const useStyles = makeStyles({ }, }); -export const TaskLogStream = (opts: { logs: { [k: string]: string[] } }) => { +export const TaskLogStream = (props: { logs: { [k: string]: string[] } }) => { const styles = useStyles(); return (
l.join('\n')) .filter(Boolean) .join('\n')} diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.test.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.test.tsx new file mode 100644 index 0000000000..185d2fa7fb --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.test.tsx @@ -0,0 +1,79 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { StepTime } from './StepTime'; +import { render, act } from '@testing-library/react'; + +describe('StepTime', () => { + it('should return empty when there is no start time', () => { + const step = { + id: 'test', + startedAt: undefined, + endedAt: undefined, + name: 'test', + }; + + const { container } = render(); + + expect(container.querySelector('span')?.textContent).toBe(''); + }); + + it('should format the time between the start and end date properly', async () => { + const step = { + id: 'test', + startedAt: '2021-01-01T00:00:00Z', + endedAt: '2021-01-01T00:00:01Z', + name: 'test', + }; + + const { findByText } = render(); + + await expect(findByText('1 second')).resolves.toBeInTheDocument(); + }); + + describe('updates', () => { + beforeEach(() => { + jest.useFakeTimers({ now: new Date('2021-01-01T00:00:00Z') }); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should update the time every second', async () => { + const step = { + id: 'test', + startedAt: '2021-01-01T00:00:00Z', + endedAt: undefined, + name: 'test', + }; + + const { findByText } = render(); + + await expect(findByText('0 seconds')).resolves.toBeInTheDocument(); + + act(() => jest.advanceTimersByTime(1000)); + + await expect(findByText('1 second')).resolves.toBeInTheDocument(); + + act(() => jest.advanceTimersByTime(1000 * 60)); + + await expect( + findByText('1 minute, 1 second'), + ).resolves.toBeInTheDocument(); + }); + }); +}); diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx index 746007a7d3..2ec89f385a 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx @@ -19,9 +19,7 @@ import { DateTime, Interval } from 'luxon'; import humanizeDuration from 'humanize-duration'; import { Typography } from '@material-ui/core'; -export const StepTime = ({ - step, -}: { +export const StepTime = (props: { step: { id: string; name: string; @@ -30,6 +28,7 @@ export const StepTime = ({ }; }) => { const [time, setTime] = useState(''); + const { step } = props; const calculate = useCallback(() => { if (!step.startedAt) { From f08364291e9ff6ce0fadbe98a527fd75444b0ad9 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 31 Jan 2023 16:34:00 +0100 Subject: [PATCH 57/98] chore: more test Signed-off-by: blam Signed-off-by: blam --- .../OngoingTask/TaskSteps/TaskSteps.test.tsx | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.test.tsx diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.test.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.test.tsx new file mode 100644 index 0000000000..afd1f58190 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.test.tsx @@ -0,0 +1,64 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { TaskSteps } from './TaskSteps'; +import { ScaffolderTaskStatus } from '@backstage/plugin-scaffolder-react'; +import { renderInTestApp } from '@backstage/test-utils'; + +describe('TaskSteps', () => { + it('should render each of the steps', async () => { + const steps = [ + { + id: '1', + name: 'Step 1', + status: 'processing' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + action: 'create', + }, + { + id: '2', + name: 'Step 2', + status: 'failed' as ScaffolderTaskStatus, + + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'create', + }, + { + id: '3', + name: 'Step 3', + status: 'completed' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'create', + }, + { + id: '4', + name: 'Step 4', + status: 'skipped' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'create', + }, + ]; + + const { getByText } = await renderInTestApp(); + + for (const step of steps) { + expect(getByText(step.name)).toBeInTheDocument(); + } + }); +}); From ba679976efb0257479386a75fa795d7b5df87ea9 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 3 Feb 2023 15:15:30 +0100 Subject: [PATCH 58/98] chore: use the backstage link component instead and wrap a div instead Signed-off-by: blam --- .../src/next/OngoingTask/Outputs/LinkOutputs.tsx | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx b/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx index 596e91d5ab..d7c5ad0b67 100644 --- a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx @@ -16,10 +16,11 @@ import { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; -import { Button, makeStyles, Link } from '@material-ui/core'; +import { Button, makeStyles } from '@material-ui/core'; import React from 'react'; import WebIcon from '@material-ui/icons/Web'; import { parseEntityRef } from '@backstage/catalog-model'; +import { Link } from '@backstage/core-components'; const useStyles = makeStyles({ root: { @@ -53,15 +54,10 @@ export const LinkOutputs = (props: { output: ScaffolderTaskOutput }) => { .map(({ url, title, icon }, i) => { const Icon = iconResolver(icon); return ( - } - > - {title} + + ); })} From cb25785e251a941c21556f9c8163da809c4bece7 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 3 Feb 2023 16:00:08 +0100 Subject: [PATCH 59/98] chore: move the buttons to the contextmenu instead Signed-off-by: blam --- .../src/next/OngoingTask/ContextMenu.tsx | 87 +++++++++++++++++++ .../src/next/OngoingTask/OngoingTask.tsx | 35 +++----- 2 files changed, 98 insertions(+), 24 deletions(-) create mode 100644 plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx diff --git a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx new file mode 100644 index 0000000000..d4c771a9f8 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx @@ -0,0 +1,87 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { BackstageTheme } from '@backstage/theme'; +import { + IconButton, + ListItemIcon, + ListItemText, + makeStyles, + MenuItem, + MenuList, + Popover, +} from '@material-ui/core'; +import Retry from '@material-ui/icons/Repeat'; +import Toc from '@material-ui/icons/Toc'; +import MoreVert from '@material-ui/icons/MoreVert'; +import React, { useState } from 'react'; + +type ContextMenuProps = { + logsVisible?: boolean; + onToggleLogs?: (state: boolean) => void; + onStartOver?: () => void; +}; + +const useStyles = makeStyles((theme: BackstageTheme) => ({ + button: { + color: theme.palette.common.white, + }, +})); + +export const ContextMenu = (props: ContextMenuProps) => { + const { logsVisible, onToggleLogs, onStartOver } = props; + const classes = useStyles(); + const [anchorEl, setAnchorEl] = useState(); + + return ( + <> + ) => { + setAnchorEl(event.currentTarget); + }} + data-testid="menu-button" + color="inherit" + className={classes.button} + > + + + setAnchorEl(undefined)} + anchorEl={anchorEl} + anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }} + transformOrigin={{ vertical: 'top', horizontal: 'right' }} + > + + onToggleLogs?.(!logsVisible)}> + + + + + + + + + + + + + + + ); +}; diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index 15669469fe..a146780683 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -25,6 +25,7 @@ import { nextSelectedTemplateRouteRef } from '../routes'; import { useRouteRef } from '@backstage/core-plugin-api'; import qs from 'qs'; import { DefaultOutputs } from './Outputs'; +import { ContextMenu } from './ContextMenu'; export const OngoingTask = () => { // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. @@ -41,11 +42,11 @@ export const OngoingTask = () => { [taskStream], ); - const [logsVisible, setLogsVisible] = useState(false); + const [logsVisible, setLogVisibleState] = useState(false); useEffect(() => { if (taskStream.error) { - setLogsVisible(true); + setLogVisibleState(true); } }, [taskStream.error]); @@ -96,7 +97,13 @@ export const OngoingTask = () => {
} subtitle={`Task ${taskId}`} - /> + > + +
@@ -110,27 +117,7 @@ export const OngoingTask = () => { - - - - - - - - + {logsVisible ? ( From 7dcd44286df2b62d03b2ca42a7a96dda112148e1 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 Feb 2023 21:34:47 +0100 Subject: [PATCH 60/98] chore: removing the tail functionality for now Signed-off-by: blam Signed-off-by: blam --- packages/core-components/api-report.md | 1 - .../core-components/src/components/LogViewer/LogViewer.tsx | 4 ---- .../src/components/LogViewer/RealLogViewer.tsx | 7 ------- 3 files changed, 12 deletions(-) diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index f720e0305d..721c208406 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -693,7 +693,6 @@ export interface LogViewerProps { classes?: { root?: string; }; - tail?: boolean; text: string; } diff --git a/packages/core-components/src/components/LogViewer/LogViewer.tsx b/packages/core-components/src/components/LogViewer/LogViewer.tsx index f1396eef36..20530cffaf 100644 --- a/packages/core-components/src/components/LogViewer/LogViewer.tsx +++ b/packages/core-components/src/components/LogViewer/LogViewer.tsx @@ -39,10 +39,6 @@ export interface LogViewerProps { classes?: { root?: string; }; - /** - * Whether the LogViewer should automatically scroll to the bottom of the log. - */ - tail?: boolean; } /** diff --git a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx index d211399c69..59e0bea44b 100644 --- a/packages/core-components/src/components/LogViewer/RealLogViewer.tsx +++ b/packages/core-components/src/components/LogViewer/RealLogViewer.tsx @@ -32,7 +32,6 @@ import { useLogViewerSelection } from './useLogViewerSelection'; export interface RealLogViewerProps { text: string; classes?: { root?: string }; - tail?: boolean; } export function RealLogViewer(props: RealLogViewerProps) { @@ -53,12 +52,6 @@ export function RealLogViewer(props: RealLogViewerProps) { } }, [search.resultLine]); - useEffect(() => { - if (props.tail && listRef.current) { - listRef.current.scrollToItem(lines.length - 1, 'center'); - } - }, [lines.length, props.tail]); - useEffect(() => { if (location.hash) { // #line-6 -> 6 From ec83fd4616568f32ff1eecb2e9337fb303fd140f Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 Feb 2023 21:35:36 +0100 Subject: [PATCH 61/98] chore: removing changeset Signed-off-by: blam --- .changeset/nasty-students-double.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/nasty-students-double.md diff --git a/.changeset/nasty-students-double.md b/.changeset/nasty-students-double.md deleted file mode 100644 index d552fdf91e..0000000000 --- a/.changeset/nasty-students-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Added the ability to tail the `LogViewer` logs From 3887621d5d00aca9aa9319b484428c4f80a7d225 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 Feb 2023 21:35:48 +0100 Subject: [PATCH 62/98] chore: added the error panel Signed-off-by: blam --- .../src/next/OngoingTask/OngoingTask.tsx | 24 ++++++++++++++++--- .../src/next/OngoingTask/TaskLogStream.tsx | 1 - .../next/OngoingTask/TaskSteps/TaskSteps.tsx | 5 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index a146780683..e166a96dd7 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -14,10 +14,10 @@ * limitations under the License. */ import React, { useEffect, useMemo, useState, useCallback } from 'react'; -import { Page, Header, Content } from '@backstage/core-components'; +import { Page, Header, Content, ErrorPanel } from '@backstage/core-components'; import { useTaskEventStream } from '../../components/hooks/useEventStream'; import { useNavigate, useParams } from 'react-router-dom'; -import { Box, Button, Paper } from '@material-ui/core'; +import { Box, makeStyles, Paper } from '@material-ui/core'; import { TaskSteps } from './TaskSteps'; import { TaskBorder } from './TaskBorder'; import { TaskLogStream } from './TaskLogStream'; @@ -27,12 +27,20 @@ import qs from 'qs'; import { DefaultOutputs } from './Outputs'; import { ContextMenu } from './ContextMenu'; +const useStyles = makeStyles({ + contentWrapper: { + display: 'flex', + flexDirection: 'column', + }, +}); + export const OngoingTask = () => { // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. const { taskId } = useParams(); const templateRouteRef = useRouteRef(nextSelectedTemplateRouteRef); const navigate = useNavigate(); const taskStream = useTaskEventStream(taskId!); + const classes = useStyles(); const steps = useMemo( () => taskStream.task?.spec.steps.map(step => ({ @@ -104,7 +112,16 @@ export const OngoingTask = () => { logsVisible={logsVisible} />
- + + {taskStream.error ? ( + + + + ) : null} + { + {logsVisible ? ( diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx index 2cfcdf1da6..00e8452b42 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskLogStream.tsx @@ -30,7 +30,6 @@ export const TaskLogStream = (props: { logs: { [k: string]: string[] } }) => { return (
l.join('\n')) .filter(Boolean) diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.tsx index 40f9f9c189..7cf5ed71bf 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/TaskSteps.tsx @@ -20,6 +20,7 @@ import { StepButton as MuiStepButton, StepLabel as MuiStepLabel, StepIconProps, + Box, } from '@material-ui/core'; import { TaskStep } from '@backstage/plugin-scaffolder-common'; import { Step } from '../../../components/hooks/useEventStream'; @@ -29,7 +30,6 @@ import { StepTime } from './StepTime'; interface StepperProps { steps: (TaskStep & Step)[]; activeStep?: number; - setActiveStep?: (step: number) => void; } export const TaskSteps = (props: StepperProps) => { @@ -58,8 +58,7 @@ export const TaskSteps = (props: StepperProps) => { StepIconProps={stepIconProps} StepIconComponent={StepIcon} > - {step.name} -
+ {step.name} From 33b6ed5a5a6c5ca92aa81d69a6c303fd1d3da321 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 Feb 2023 21:52:15 +0100 Subject: [PATCH 63/98] chore: moving the outputs around and fixing some navigation] Signed-off-by: blam --- .../DefaultTemplateOutputs.tsx} | 11 ++++++-- .../TemplateOutputs}/LinkOutputs.tsx | 2 +- .../next/components/TemplateOutputs}/index.ts | 2 +- .../src/next/components/index.ts | 1 + .../src/next/OngoingTask/OngoingTask.tsx | 15 ++++++++--- plugins/scaffolder/src/next/Router/Router.tsx | 26 +++++++++++++++++-- .../TemplateListPage/TemplateListPage.tsx | 10 ++++++- 7 files changed, 57 insertions(+), 10 deletions(-) rename plugins/{scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx => scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx} (81%) rename plugins/{scaffolder/src/next/OngoingTask/Outputs => scaffolder-react/src/next/components/TemplateOutputs}/LinkOutputs.tsx (96%) rename plugins/{scaffolder/src/next/OngoingTask/Outputs => scaffolder-react/src/next/components/TemplateOutputs}/index.ts (90%) diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx similarity index 81% rename from plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx rename to plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx index 39bf89e4c5..5fbd3a5142 100644 --- a/plugins/scaffolder/src/next/OngoingTask/Outputs/DefaultOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx @@ -14,11 +14,18 @@ * limitations under the License. */ import React from 'react'; -import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; import { Box, Paper } from '@material-ui/core'; import { LinkOutputs } from './LinkOutputs'; +import { ScaffolderTaskOutput } from '../../../api'; -export const DefaultOutputs = (props: { output?: ScaffolderTaskOutput }) => { +/** + * The DefaultOutputs renderer for the scaffolder task output + * + * @alpha + */ +export const DefaultTemplateOutputs = (props: { + output?: ScaffolderTaskOutput; +}) => { if (!props.output?.links) { return null; } diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/LinkOutputs.tsx similarity index 96% rename from plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx rename to plugins/scaffolder-react/src/next/components/TemplateOutputs/LinkOutputs.tsx index d7c5ad0b67..d172aa9cb3 100644 --- a/plugins/scaffolder/src/next/OngoingTask/Outputs/LinkOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/LinkOutputs.tsx @@ -15,12 +15,12 @@ */ import { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api'; import { entityRouteRef } from '@backstage/plugin-catalog-react'; -import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; import { Button, makeStyles } from '@material-ui/core'; import React from 'react'; import WebIcon from '@material-ui/icons/Web'; import { parseEntityRef } from '@backstage/catalog-model'; import { Link } from '@backstage/core-components'; +import { ScaffolderTaskOutput } from '../../../api'; const useStyles = makeStyles({ root: { diff --git a/plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts b/plugins/scaffolder-react/src/next/components/TemplateOutputs/index.ts similarity index 90% rename from plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts rename to plugins/scaffolder-react/src/next/components/TemplateOutputs/index.ts index 647f1eebb2..1c998eb1b9 100644 --- a/plugins/scaffolder/src/next/OngoingTask/Outputs/index.ts +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { DefaultOutputs } from './DefaultOutputs'; +export { DefaultTemplateOutputs } from './DefaultTemplateOutputs'; diff --git a/plugins/scaffolder-react/src/next/components/index.ts b/plugins/scaffolder-react/src/next/components/index.ts index babe3b4dcb..05e5a1105a 100644 --- a/plugins/scaffolder-react/src/next/components/index.ts +++ b/plugins/scaffolder-react/src/next/components/index.ts @@ -18,3 +18,4 @@ export * from './TemplateCard'; export * from './ReviewState'; export * from './TemplateGroup'; export * from './Workflow'; +export * from './TemplateOutputs'; diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index e166a96dd7..a68df01ed5 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -24,8 +24,11 @@ import { TaskLogStream } from './TaskLogStream'; import { nextSelectedTemplateRouteRef } from '../routes'; import { useRouteRef } from '@backstage/core-plugin-api'; import qs from 'qs'; -import { DefaultOutputs } from './Outputs'; import { ContextMenu } from './ContextMenu'; +import { + DefaultTemplateOutputs, + ScaffolderTaskOutput, +} from '@backstage/plugin-scaffolder-react'; const useStyles = makeStyles({ contentWrapper: { @@ -34,7 +37,11 @@ const useStyles = makeStyles({ }, }); -export const OngoingTask = () => { +export const OngoingTask = (props: { + TemplateOutputsComponent?: React.ComponentType<{ + output?: ScaffolderTaskOutput; + }>; +}) => { // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. const { taskId } = useParams(); const templateRouteRef = useRouteRef(nextSelectedTemplateRouteRef); @@ -92,6 +99,8 @@ export const OngoingTask = () => { templateRouteRef, ]); + const Outputs = props.TemplateOutputsComponent ?? DefaultTemplateOutputs; + const templateName = taskStream.task?.spec.templateInfo?.entity?.metadata.name; @@ -134,7 +143,7 @@ export const OngoingTask = () => { - + {logsVisible ? ( diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index b9c18f9d02..6ac8bbff65 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -19,6 +19,7 @@ import { TemplateListPage } from '../TemplateListPage'; import { TemplateWizardPage } from '../TemplateWizardPage'; import { NextFieldExtensionOptions, + ScaffolderTaskOutput, SecretsContextProvider, useCustomFieldExtensions, useCustomLayouts, @@ -47,9 +48,21 @@ export type NextRouterProps = { template: TemplateEntityV1beta3; }>; TaskPageComponent?: React.ComponentType<{}>; + TemplateOutputsComponent?: React.ComponentType<{ + output?: ScaffolderTaskOutput; + }>; }; groups?: TemplateGroupFilter[]; + // todo(blam): rename this to formProps FormProps?: FormProps; + contextMenu?: { + /** Whether to show a link to the template editor */ + editor?: boolean; + /** Whether to show a link to the actions documentation */ + actions?: boolean; + /** Whether to show a link to the tasks page */ + tasks?: boolean; + }; }; /** @@ -58,10 +71,13 @@ export type NextRouterProps = { * @alpha */ export const Router = (props: PropsWithChildren) => { - const { components: { TemplateCardComponent } = {} } = props; + const { + components: { TemplateCardComponent, TemplateOutputsComponent } = {}, + } = props; const outlet = useOutlet() || props.children; const customFieldExtensions = useCustomFieldExtensions(outlet); + const fieldExtensions = [ ...customFieldExtensions, ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter( @@ -81,6 +97,7 @@ export const Router = (props: PropsWithChildren) => { element={ } @@ -97,7 +114,12 @@ export const Router = (props: PropsWithChildren) => { } /> - } /> + + } + /> } diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index 4eae84b866..3097bd98be 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -37,12 +37,18 @@ import { RegisterExistingButton } from './RegisterExistingButton'; import { useRouteRef } from '@backstage/core-plugin-api'; import { TemplateGroupFilter, TemplateGroups } from './TemplateGroups'; import { registerComponentRouteRef } from '../../routes'; +import { ScaffolderPageContextMenu } from '../../components/ScaffolderPage/ScaffolderPageContextMenu'; export type TemplateListPageProps = { TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; groups?: TemplateGroupFilter[]; + contextMenu?: { + editor?: boolean; + actions?: boolean; + tasks?: boolean; + }; }; const defaultGroup: TemplateGroupFilter = { @@ -61,7 +67,9 @@ export const TemplateListPage = (props: TemplateListPageProps) => { pageTitleOverride="Create a new component" title="Create a new component" subtitle="Create new software components using standard templates in your organization" - /> + > + +
Date: Mon, 6 Feb 2023 21:54:20 +0100 Subject: [PATCH 64/98] chore: fixing api-reports Signed-off-by: blam --- plugins/badges-backend/api-report.md | 2 +- plugins/bitbucket-cloud-common/api-report.md | 14 +++++++------- plugins/scaffolder-react/api-report.md | 5 +++++ plugins/scaffolder/api-report.md | 8 ++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/plugins/badges-backend/api-report.md b/plugins/badges-backend/api-report.md index 8ca4b561a2..0ecf41ee85 100644 --- a/plugins/badges-backend/api-report.md +++ b/plugins/badges-backend/api-report.md @@ -79,7 +79,7 @@ export type BadgeSpec = { }; // @public (undocumented) -export type BadgeStyle = (typeof BADGE_STYLES)[number]; +export type BadgeStyle = typeof BADGE_STYLES[number]; // @public (undocumented) export const createDefaultBadgeFactories: () => BadgeFactories; diff --git a/plugins/bitbucket-cloud-common/api-report.md b/plugins/bitbucket-cloud-common/api-report.md index 95e6f36836..5182579a4b 100644 --- a/plugins/bitbucket-cloud-common/api-report.md +++ b/plugins/bitbucket-cloud-common/api-report.md @@ -132,7 +132,7 @@ export namespace Models { readonly Plaintext: 'plaintext'; }; export type BaseCommitSummaryMarkupEnum = - (typeof BaseCommitSummaryMarkupEnum)[keyof typeof BaseCommitSummaryMarkupEnum]; + typeof BaseCommitSummaryMarkupEnum[keyof typeof BaseCommitSummaryMarkupEnum]; export interface Branch { default_merge_strategy?: string; // (undocumented) @@ -150,7 +150,7 @@ export namespace Models { readonly FastForward: 'fast_forward'; }; export type BranchMergeStrategiesEnum = - (typeof BranchMergeStrategiesEnum)[keyof typeof BranchMergeStrategiesEnum]; + typeof BranchMergeStrategiesEnum[keyof typeof BranchMergeStrategiesEnum]; export interface Commit extends BaseCommit { // (undocumented) participants?: Array; @@ -179,7 +179,7 @@ export namespace Models { }; // (undocumented) export type CommitFileAttributesEnum = - (typeof CommitFileAttributesEnum)[keyof typeof CommitFileAttributesEnum]; + typeof CommitFileAttributesEnum[keyof typeof CommitFileAttributesEnum]; export interface Link { // (undocumented) href?: string; @@ -221,7 +221,7 @@ export namespace Models { }; // (undocumented) export type ParticipantRoleEnum = - (typeof ParticipantRoleEnum)[keyof typeof ParticipantRoleEnum]; + typeof ParticipantRoleEnum[keyof typeof ParticipantRoleEnum]; const // (undocumented) ParticipantStateEnum: { readonly Approved: 'approved'; @@ -230,7 +230,7 @@ export namespace Models { }; // (undocumented) export type ParticipantStateEnum = - (typeof ParticipantStateEnum)[keyof typeof ParticipantStateEnum]; + typeof ParticipantStateEnum[keyof typeof ParticipantStateEnum]; export interface Project extends ModelObject { // (undocumented) created_on?: string; @@ -306,7 +306,7 @@ export namespace Models { readonly NoForks: 'no_forks'; }; export type RepositoryForkPolicyEnum = - (typeof RepositoryForkPolicyEnum)[keyof typeof RepositoryForkPolicyEnum]; + typeof RepositoryForkPolicyEnum[keyof typeof RepositoryForkPolicyEnum]; const // (undocumented) RepositoryScmEnum: { readonly Git: 'git'; @@ -336,7 +336,7 @@ export namespace Models { } // (undocumented) export type RepositoryScmEnum = - (typeof RepositoryScmEnum)[keyof typeof RepositoryScmEnum]; + typeof RepositoryScmEnum[keyof typeof RepositoryScmEnum]; // (undocumented) export interface SearchCodeSearchResult { // (undocumented) diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index deead4366c..72a0b92eef 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -85,6 +85,11 @@ export type CustomFieldValidator = ( }, ) => void | Promise; +// @alpha +export const DefaultTemplateOutputs: (props: { + output?: ScaffolderTaskOutput; +}) => JSX.Element | null; + // @alpha (undocumented) export const EmbeddableWorkflow: (props: WorkflowProps) => JSX.Element; diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 1fb72b0fac..43b885b81a 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -197,9 +197,17 @@ export type NextRouterProps = { template: TemplateEntityV1beta3; }>; TaskPageComponent?: React_2.ComponentType<{}>; + TemplateOutputsComponent?: React_2.ComponentType<{ + output?: ScaffolderTaskOutput_2; + }>; }; groups?: TemplateGroupFilter[]; FormProps?: FormProps_2; + contextMenu?: { + editor?: boolean; + actions?: boolean; + tasks?: boolean; + }; }; // @alpha From 01b6f56c8072ee155008943ae652d9dc0d3a2a36 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 10:49:48 +0100 Subject: [PATCH 65/98] chore: fixing api-reports Signed-off-by: blam --- plugins/scaffolder/src/components/Router.tsx | 5 +- plugins/scaffolder/src/next/Router/Router.tsx | 9 ++ .../src/next/TemplateListPage/ContextMenu.tsx | 123 ++++++++++++++++++ .../TemplateListPage/TemplateListPage.tsx | 4 +- plugins/scaffolder/src/next/routes.ts | 21 +++ 5 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index ccc2bd283b..06c28682c5 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -149,12 +149,13 @@ export const Router = (props: RouterProps) => { } /> + + } /> + } /> } /> - } /> - } /> ) => { } /> + } /> + } + /> } diff --git a/plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx b/plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx new file mode 100644 index 0000000000..3bca46af2a --- /dev/null +++ b/plugins/scaffolder/src/next/TemplateListPage/ContextMenu.tsx @@ -0,0 +1,123 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useRouteRef } from '@backstage/core-plugin-api'; +import IconButton from '@material-ui/core/IconButton'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import MenuItem from '@material-ui/core/MenuItem'; +import MenuList from '@material-ui/core/MenuList'; +import Popover from '@material-ui/core/Popover'; +import { makeStyles } from '@material-ui/core/styles'; +import Description from '@material-ui/icons/Description'; +import Edit from '@material-ui/icons/Edit'; +import List from '@material-ui/icons/List'; +import MoreVert from '@material-ui/icons/MoreVert'; +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { + nextActionsRouteRef, + nextEditRouteRef, + nextScaffolderListTaskRouteRef, +} from '../routes'; + +const useStyles = makeStyles({ + button: { + color: 'white', + }, +}); + +export type ScaffolderPageContextMenuProps = { + editor?: boolean; + actions?: boolean; + tasks?: boolean; +}; + +export function ContextMenu(props: ScaffolderPageContextMenuProps) { + const classes = useStyles(); + const [anchorEl, setAnchorEl] = useState(); + const editLink = useRouteRef(nextEditRouteRef); + const actionsLink = useRouteRef(nextActionsRouteRef); + const tasksLink = useRouteRef(nextScaffolderListTaskRouteRef); + + const navigate = useNavigate(); + + const showEditor = props.editor !== false; + const showActions = props.actions !== false; + const showTasks = props.tasks !== false; + + if (!showEditor && !showActions) { + return null; + } + + const onOpen = (event: React.SyntheticEvent) => { + setAnchorEl(event.currentTarget); + }; + + const onClose = () => { + setAnchorEl(undefined); + }; + + return ( + <> + + + + + + {showEditor && ( + navigate(editLink())}> + + + + + + )} + {showActions && ( + navigate(actionsLink())}> + + + + + + )} + {showTasks && ( + navigate(tasksLink())}> + + + + + + )} + + + + ); +} diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index 3097bd98be..b701ceb3c4 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -37,7 +37,7 @@ import { RegisterExistingButton } from './RegisterExistingButton'; import { useRouteRef } from '@backstage/core-plugin-api'; import { TemplateGroupFilter, TemplateGroups } from './TemplateGroups'; import { registerComponentRouteRef } from '../../routes'; -import { ScaffolderPageContextMenu } from '../../components/ScaffolderPage/ScaffolderPageContextMenu'; +import { ContextMenu } from './ContextMenu'; export type TemplateListPageProps = { TemplateCardComponent?: React.ComponentType<{ @@ -68,7 +68,7 @@ export const TemplateListPage = (props: TemplateListPageProps) => { title="Create a new component" subtitle="Create new software components using standard templates in your organization" > - + diff --git a/plugins/scaffolder/src/next/routes.ts b/plugins/scaffolder/src/next/routes.ts index 620122ee60..12fad4210a 100644 --- a/plugins/scaffolder/src/next/routes.ts +++ b/plugins/scaffolder/src/next/routes.ts @@ -34,3 +34,24 @@ export const nextScaffolderTaskRouteRef = createSubRouteRef({ parent: nextRouteRef, path: '/tasks/:taskId', }); + +/** @alpha */ +export const nextScaffolderListTaskRouteRef = createSubRouteRef({ + id: 'scaffolder/next/list-tasks', + parent: nextRouteRef, + path: '/tasks', +}); + +/** @alpha */ +export const nextActionsRouteRef = createSubRouteRef({ + id: 'scaffolder/next/actions', + parent: nextRouteRef, + path: '/actions', +}); + +/** @alpha */ +export const nextEditRouteRef = createSubRouteRef({ + id: 'scaffolder/next/edit', + parent: nextRouteRef, + path: '/edit', +}); From 419aaafd18a9ba2ae26eef93cba1248df1192b5e Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 11:20:59 +0100 Subject: [PATCH 66/98] chore: fixing the prettier of the api-reports Signed-off-by: blam --- plugins/badges-backend/api-report.md | 2 +- plugins/bitbucket-cloud-common/api-report.md | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/badges-backend/api-report.md b/plugins/badges-backend/api-report.md index 0ecf41ee85..8ca4b561a2 100644 --- a/plugins/badges-backend/api-report.md +++ b/plugins/badges-backend/api-report.md @@ -79,7 +79,7 @@ export type BadgeSpec = { }; // @public (undocumented) -export type BadgeStyle = typeof BADGE_STYLES[number]; +export type BadgeStyle = (typeof BADGE_STYLES)[number]; // @public (undocumented) export const createDefaultBadgeFactories: () => BadgeFactories; diff --git a/plugins/bitbucket-cloud-common/api-report.md b/plugins/bitbucket-cloud-common/api-report.md index 5182579a4b..95e6f36836 100644 --- a/plugins/bitbucket-cloud-common/api-report.md +++ b/plugins/bitbucket-cloud-common/api-report.md @@ -132,7 +132,7 @@ export namespace Models { readonly Plaintext: 'plaintext'; }; export type BaseCommitSummaryMarkupEnum = - typeof BaseCommitSummaryMarkupEnum[keyof typeof BaseCommitSummaryMarkupEnum]; + (typeof BaseCommitSummaryMarkupEnum)[keyof typeof BaseCommitSummaryMarkupEnum]; export interface Branch { default_merge_strategy?: string; // (undocumented) @@ -150,7 +150,7 @@ export namespace Models { readonly FastForward: 'fast_forward'; }; export type BranchMergeStrategiesEnum = - typeof BranchMergeStrategiesEnum[keyof typeof BranchMergeStrategiesEnum]; + (typeof BranchMergeStrategiesEnum)[keyof typeof BranchMergeStrategiesEnum]; export interface Commit extends BaseCommit { // (undocumented) participants?: Array; @@ -179,7 +179,7 @@ export namespace Models { }; // (undocumented) export type CommitFileAttributesEnum = - typeof CommitFileAttributesEnum[keyof typeof CommitFileAttributesEnum]; + (typeof CommitFileAttributesEnum)[keyof typeof CommitFileAttributesEnum]; export interface Link { // (undocumented) href?: string; @@ -221,7 +221,7 @@ export namespace Models { }; // (undocumented) export type ParticipantRoleEnum = - typeof ParticipantRoleEnum[keyof typeof ParticipantRoleEnum]; + (typeof ParticipantRoleEnum)[keyof typeof ParticipantRoleEnum]; const // (undocumented) ParticipantStateEnum: { readonly Approved: 'approved'; @@ -230,7 +230,7 @@ export namespace Models { }; // (undocumented) export type ParticipantStateEnum = - typeof ParticipantStateEnum[keyof typeof ParticipantStateEnum]; + (typeof ParticipantStateEnum)[keyof typeof ParticipantStateEnum]; export interface Project extends ModelObject { // (undocumented) created_on?: string; @@ -306,7 +306,7 @@ export namespace Models { readonly NoForks: 'no_forks'; }; export type RepositoryForkPolicyEnum = - typeof RepositoryForkPolicyEnum[keyof typeof RepositoryForkPolicyEnum]; + (typeof RepositoryForkPolicyEnum)[keyof typeof RepositoryForkPolicyEnum]; const // (undocumented) RepositoryScmEnum: { readonly Git: 'git'; @@ -336,7 +336,7 @@ export namespace Models { } // (undocumented) export type RepositoryScmEnum = - typeof RepositoryScmEnum[keyof typeof RepositoryScmEnum]; + (typeof RepositoryScmEnum)[keyof typeof RepositoryScmEnum]; // (undocumented) export interface SearchCodeSearchResult { // (undocumented) From 0f0f48cb821ef397e5e61ef9d6b264c4310439e7 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 12:40:05 +0100 Subject: [PATCH 67/98] chore: reset router Signed-off-by: blam --- plugins/scaffolder/src/components/Router.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 06c28682c5..ccc2bd283b 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -149,13 +149,12 @@ export const Router = (props: RouterProps) => { } /> - - } /> - } /> } /> + } /> + } /> Date: Tue, 7 Feb 2023 12:50:38 +0100 Subject: [PATCH 68/98] chore: prefer useMountEffect over use memo Signed-off-by: blam --- .../src/next/OngoingTask/TaskSteps/StepTime.tsx | 5 +++-- plugins/scaffolder/src/next/Router/Router.tsx | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx index 2ec89f385a..653fe6e942 100644 --- a/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/TaskSteps/StepTime.tsx @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import useInterval from 'react-use/lib/useInterval'; import { DateTime, Interval } from 'luxon'; import humanizeDuration from 'humanize-duration'; import { Typography } from '@material-ui/core'; +import { useMountEffect } from '@react-hookz/web'; export const StepTime = (props: { step: { @@ -48,7 +49,7 @@ export const StepTime = (props: { setTime(humanizeDuration(formatted, { round: true })); }, [step.endedAt, step.startedAt]); - useMemo(() => calculate(), [calculate]); + useMountEffect(() => calculate()); useInterval(() => !step.endedAt && calculate(), 1000); diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 0ca9e452cd..049579e16c 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -76,7 +76,11 @@ export type NextRouterProps = { */ export const Router = (props: PropsWithChildren) => { const { - components: { TemplateCardComponent, TemplateOutputsComponent } = {}, + components: { + TemplateCardComponent, + TemplateOutputsComponent, + TaskPageComponent = OngoingTask, + } = {}, } = props; const outlet = useOutlet() || props.children; const customFieldExtensions = @@ -121,7 +125,9 @@ export const Router = (props: PropsWithChildren) => { + } /> } /> From 01a075ec1df4d493b94df660ecc5660fd0837898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 7 Feb 2023 14:15:53 +0100 Subject: [PATCH 69/98] rename RootHttpRouterConfigureOptions, remove ServiceOrExtensionPoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/afraid-planets-crash.md | 5 +++++ packages/backend-app-api/api-report.md | 11 ++--------- .../services/implementations/rootHttpRouter/index.ts | 2 +- .../rootHttpRouter/rootHttpRouterServiceFactory.ts | 11 ++++------- packages/backend-app-api/src/wiring/index.ts | 6 +----- 5 files changed, 13 insertions(+), 22 deletions(-) create mode 100644 .changeset/afraid-planets-crash.md diff --git a/.changeset/afraid-planets-crash.md b/.changeset/afraid-planets-crash.md new file mode 100644 index 0000000000..b31a492f3d --- /dev/null +++ b/.changeset/afraid-planets-crash.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': minor +--- + +**BREAKING**: Renamed `RootHttpRouterConfigureOptions` to `RootHttpRouterConfigureContext`, and removed the unused type `ServiceOrExtensionPoint`. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 02b5685ead..e4c3e34751 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -11,7 +11,6 @@ import { ConfigService } from '@backstage/backend-plugin-api'; import { CorsOptions } from 'cors'; import { ErrorRequestHandler } from 'express'; import { Express as Express_2 } from 'express'; -import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { Format } from 'logform'; import { Handler } from 'express'; import { HelmetOptions } from 'helmet'; @@ -34,7 +33,6 @@ import { RootLoggerService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceFactoryOrFunction } from '@backstage/backend-plugin-api'; -import { ServiceRef } from '@backstage/backend-plugin-api'; import { TokenManagerService } from '@backstage/backend-plugin-api'; import { transport } from 'winston'; import { UrlReader } from '@backstage/backend-common'; @@ -216,7 +214,7 @@ export function readHelmetOptions(config?: Config): HelmetOptions; export function readHttpServerOptions(config?: Config): HttpServerOptions; // @public (undocumented) -export interface RootHttpRouterConfigureOptions { +export interface RootHttpRouterConfigureContext { // (undocumented) app: Express_2; // (undocumented) @@ -234,7 +232,7 @@ export interface RootHttpRouterConfigureOptions { // @public (undocumented) export type RootHttpRouterFactoryOptions = { indexPath?: string | false; - configure?(options: RootHttpRouterConfigureOptions): void; + configure?(context: RootHttpRouterConfigureContext): void; }; // @public (undocumented) @@ -251,11 +249,6 @@ export const rootLoggerServiceFactory: () => ServiceFactory; // @public (undocumented) export const schedulerServiceFactory: () => ServiceFactory; -// @public (undocumented) -export type ServiceOrExtensionPoint = - | ExtensionPoint - | ServiceRef; - // @public (undocumented) export const tokenManagerServiceFactory: () => ServiceFactory; diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts index 93b997239d..8437399fec 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouter/index.ts @@ -17,7 +17,7 @@ export { rootHttpRouterServiceFactory, type RootHttpRouterFactoryOptions, - type RootHttpRouterConfigureOptions, + type RootHttpRouterConfigureContext, } from './rootHttpRouterServiceFactory'; export { DefaultRootHttpRouter, diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts index a14beb428d..5eaf8aa152 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -32,7 +32,7 @@ import { DefaultRootHttpRouter } from './DefaultRootHttpRouter'; /** * @public */ -export interface RootHttpRouterConfigureOptions { +export interface RootHttpRouterConfigureContext { app: Express; middleware: MiddlewareFactory; routes: RequestHandler; @@ -51,14 +51,11 @@ export type RootHttpRouterFactoryOptions = { */ indexPath?: string | false; - configure?(options: RootHttpRouterConfigureOptions): void; + configure?(context: RootHttpRouterConfigureContext): void; }; -function defaultConfigure({ - app, - routes, - middleware, -}: RootHttpRouterConfigureOptions) { +function defaultConfigure(context: RootHttpRouterConfigureContext) { + const { app, routes, middleware } = context; app.use(middleware.helmet()); app.use(middleware.cors()); app.use(middleware.compression()); diff --git a/packages/backend-app-api/src/wiring/index.ts b/packages/backend-app-api/src/wiring/index.ts index 6e0fb272ae..00e4a9d4b4 100644 --- a/packages/backend-app-api/src/wiring/index.ts +++ b/packages/backend-app-api/src/wiring/index.ts @@ -14,9 +14,5 @@ * limitations under the License. */ -export type { - Backend, - CreateSpecializedBackendOptions, - ServiceOrExtensionPoint, -} from './types'; +export type { Backend, CreateSpecializedBackendOptions } from './types'; export { createSpecializedBackend } from './createSpecializedBackend'; From b2a73c984a9c2271d0f3eb68f2301f98744beb91 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Feb 2023 15:03:45 +0000 Subject: [PATCH 70/98] Version Packages (next) --- .changeset/pre.json | 69 +- docs/releases/v1.11.0-next.2-changelog.md | 2289 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 11 + packages/app-defaults/package.json | 2 +- packages/app/CHANGELOG.md | 64 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 28 + packages/backend-app-api/package.json | 2 +- packages/backend-common/CHANGELOG.md | 19 + packages/backend-common/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 9 + packages/backend-defaults/package.json | 2 +- packages/backend-dev-utils/CHANGELOG.md | 7 + packages/backend-dev-utils/package.json | 2 +- packages/backend-next/CHANGELOG.md | 10 + packages/backend-next/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 20 + packages/backend-plugin-api/package.json | 2 +- packages/backend-tasks/CHANGELOG.md | 10 + packages/backend-tasks/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 20 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 49 + packages/backend/package.json | 2 +- packages/catalog-client/CHANGELOG.md | 8 + packages/catalog-client/package.json | 2 +- packages/catalog-model/CHANGELOG.md | 13 + packages/catalog-model/package.json | 2 +- packages/cli/CHANGELOG.md | 15 + packages/cli/package.json | 2 +- packages/codemods/CHANGELOG.md | 8 + packages/codemods/package.json | 2 +- packages/core-components/CHANGELOG.md | 12 + packages/core-components/package.json | 2 +- packages/create-app/CHANGELOG.md | 8 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 15 + packages/dev-utils/package.json | 2 +- packages/eslint-plugin/CHANGELOG.md | 7 + packages/eslint-plugin/package.json | 2 +- packages/integration-react/CHANGELOG.md | 11 + packages/integration-react/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 9 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 19 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 11 + packages/techdocs-cli/package.json | 2 +- plugins/adr-backend/CHANGELOG.md | 14 + plugins/adr-backend/package.json | 2 +- plugins/adr-common/CHANGELOG.md | 9 + plugins/adr-common/package.json | 2 +- plugins/adr/CHANGELOG.md | 20 + plugins/adr/package.json | 2 +- plugins/airbrake-backend/CHANGELOG.md | 8 + plugins/airbrake-backend/package.json | 2 +- plugins/airbrake/CHANGELOG.md | 13 + plugins/airbrake/package.json | 2 +- plugins/allure/CHANGELOG.md | 11 + plugins/allure/package.json | 2 +- plugins/analytics-module-ga/CHANGELOG.md | 10 + plugins/analytics-module-ga/package.json | 2 +- plugins/apache-airflow/CHANGELOG.md | 8 + plugins/apache-airflow/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 17 + plugins/api-docs/package.json | 2 +- plugins/apollo-explorer/CHANGELOG.md | 9 + plugins/apollo-explorer/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 12 + plugins/app-backend/package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 13 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 9 + plugins/auth-node/package.json | 2 +- plugins/azure-devops-backend/CHANGELOG.md | 9 + plugins/azure-devops-backend/package.json | 2 +- plugins/azure-devops/CHANGELOG.md | 13 + plugins/azure-devops/package.json | 2 +- plugins/azure-sites-backend/CHANGELOG.md | 9 + plugins/azure-sites-backend/package.json | 2 +- plugins/azure-sites/CHANGELOG.md | 14 + plugins/azure-sites/package.json | 2 +- plugins/badges-backend/CHANGELOG.md | 11 + plugins/badges-backend/package.json | 2 +- plugins/badges/CHANGELOG.md | 12 + plugins/badges/package.json | 2 +- plugins/bazaar-backend/CHANGELOG.md | 14 + plugins/bazaar-backend/package.json | 2 +- plugins/bazaar/CHANGELOG.md | 15 + plugins/bazaar/package.json | 2 +- plugins/bitrise/CHANGELOG.md | 11 + plugins/bitrise/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 16 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 16 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 19 + .../package.json | 2 +- .../CHANGELOG.md | 17 + .../package.json | 2 +- .../CHANGELOG.md | 19 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 12 + .../catalog-backend-module-ldap/package.json | 2 +- .../CHANGELOG.md | 22 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 22 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-common/CHANGELOG.md | 9 + plugins/catalog-common/package.json | 2 +- plugins/catalog-customized/CHANGELOG.md | 8 + plugins/catalog-customized/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 12 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-graphql/CHANGELOG.md | 9 + plugins/catalog-graphql/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 16 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 12 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 18 + plugins/catalog-react/package.json | 2 +- plugins/catalog/CHANGELOG.md | 22 + plugins/catalog/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/cicd-statistics/CHANGELOG.md | 9 + plugins/cicd-statistics/package.json | 2 +- plugins/circleci/CHANGELOG.md | 12 + plugins/circleci/package.json | 2 +- plugins/cloudbuild/CHANGELOG.md | 11 + plugins/cloudbuild/package.json | 2 +- plugins/code-climate/CHANGELOG.md | 11 + plugins/code-climate/package.json | 2 +- plugins/code-coverage-backend/CHANGELOG.md | 12 + plugins/code-coverage-backend/package.json | 2 +- plugins/code-coverage/CHANGELOG.md | 13 + plugins/code-coverage/package.json | 2 +- plugins/codescene/CHANGELOG.md | 11 + plugins/codescene/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 12 + plugins/config-schema/package.json | 2 +- plugins/cost-insights/CHANGELOG.md | 13 + plugins/cost-insights/package.json | 2 +- plugins/dynatrace/CHANGELOG.md | 11 + plugins/dynatrace/package.json | 2 +- plugins/entity-validation/CHANGELOG.md | 19 + plugins/entity-validation/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 8 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 8 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 9 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 9 + .../events-backend-module-gitlab/package.json | 2 +- .../events-backend-test-utils/CHANGELOG.md | 7 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 11 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 8 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 11 + .../example-todo-list-backend/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 9 + plugins/example-todo-list/package.json | 2 +- plugins/explore-backend/CHANGELOG.md | 10 + plugins/explore-backend/package.json | 2 +- plugins/explore/CHANGELOG.md | 20 + plugins/explore/package.json | 2 +- plugins/firehydrant/CHANGELOG.md | 10 + plugins/firehydrant/package.json | 2 +- plugins/fossa/CHANGELOG.md | 12 + plugins/fossa/package.json | 2 +- plugins/gcalendar/CHANGELOG.md | 10 + plugins/gcalendar/package.json | 2 +- plugins/gcp-projects/CHANGELOG.md | 9 + plugins/gcp-projects/package.json | 2 +- plugins/git-release-manager/CHANGELOG.md | 10 + plugins/git-release-manager/package.json | 2 +- plugins/github-actions/CHANGELOG.md | 12 + plugins/github-actions/package.json | 2 +- plugins/github-deployments/CHANGELOG.md | 14 + plugins/github-deployments/package.json | 2 +- plugins/github-issues/CHANGELOG.md | 13 + plugins/github-issues/package.json | 2 +- .../github-pull-requests-board/CHANGELOG.md | 12 + .../github-pull-requests-board/package.json | 2 +- plugins/gitops-profiles/CHANGELOG.md | 9 + plugins/gitops-profiles/package.json | 2 +- plugins/gocd/CHANGELOG.md | 12 + plugins/gocd/package.json | 2 +- plugins/graphiql/CHANGELOG.md | 9 + plugins/graphiql/package.json | 2 +- plugins/graphql-backend/CHANGELOG.md | 9 + plugins/graphql-backend/package.json | 2 +- plugins/graphql-voyager/CHANGELOG.md | 16 + plugins/graphql-voyager/package.json | 2 +- plugins/home/CHANGELOG.md | 12 + plugins/home/package.json | 2 +- plugins/ilert/CHANGELOG.md | 12 + plugins/ilert/package.json | 2 +- plugins/jenkins-backend/CHANGELOG.md | 14 + plugins/jenkins-backend/package.json | 2 +- plugins/jenkins-common/CHANGELOG.md | 8 + plugins/jenkins-common/package.json | 2 +- plugins/jenkins/CHANGELOG.md | 13 + plugins/jenkins/package.json | 2 +- plugins/kafka-backend/CHANGELOG.md | 13 + plugins/kafka-backend/package.json | 2 +- plugins/kafka/CHANGELOG.md | 12 + plugins/kafka/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 15 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-common/CHANGELOG.md | 7 + plugins/kubernetes-common/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 13 + plugins/kubernetes/package.json | 2 +- plugins/lighthouse-backend/CHANGELOG.md | 18 + plugins/lighthouse-backend/package.json | 2 +- plugins/lighthouse-common/CHANGELOG.md | 12 + plugins/lighthouse-common/package.json | 2 +- plugins/lighthouse/CHANGELOG.md | 36 + plugins/lighthouse/package.json | 2 +- plugins/newrelic-dashboard/CHANGELOG.md | 11 + plugins/newrelic-dashboard/package.json | 2 +- plugins/newrelic/CHANGELOG.md | 9 + plugins/newrelic/package.json | 2 +- plugins/org-react/CHANGELOG.md | 12 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 11 + plugins/org/package.json | 2 +- plugins/pagerduty/CHANGELOG.md | 12 + plugins/pagerduty/package.json | 2 +- plugins/periskop-backend/CHANGELOG.md | 11 + plugins/periskop-backend/package.json | 2 +- plugins/periskop/CHANGELOG.md | 12 + plugins/periskop/package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 12 + plugins/permission-backend/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 11 + plugins/permission-node/package.json | 2 +- plugins/playlist-backend/CHANGELOG.md | 16 + plugins/playlist-backend/package.json | 2 +- plugins/playlist/CHANGELOG.md | 17 + plugins/playlist/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 11 + plugins/proxy-backend/package.json | 2 +- plugins/rollbar-backend/CHANGELOG.md | 8 + plugins/rollbar-backend/package.json | 2 +- plugins/rollbar/CHANGELOG.md | 11 + plugins/rollbar/package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 21 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 8 + plugins/scaffolder-common/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 10 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 22 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 23 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 10 + plugins/search-backend-module-pg/package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 12 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 16 + plugins/search-backend/package.json | 2 +- plugins/search-react/CHANGELOG.md | 16 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 18 + plugins/search/package.json | 2 +- plugins/sentry/CHANGELOG.md | 15 + plugins/sentry/package.json | 2 +- plugins/shortcuts/CHANGELOG.md | 10 + plugins/shortcuts/package.json | 2 +- plugins/sonarqube-backend/CHANGELOG.md | 9 + plugins/sonarqube-backend/package.json | 2 +- plugins/sonarqube-react/CHANGELOG.md | 8 + plugins/sonarqube-react/package.json | 2 +- plugins/sonarqube/CHANGELOG.md | 12 + plugins/sonarqube/package.json | 2 +- plugins/splunk-on-call/CHANGELOG.md | 11 + plugins/splunk-on-call/package.json | 2 +- plugins/stack-overflow-backend/CHANGELOG.md | 9 + plugins/stack-overflow-backend/package.json | 2 +- plugins/stack-overflow/CHANGELOG.md | 13 + plugins/stack-overflow/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/tech-insights-backend/CHANGELOG.md | 15 + plugins/tech-insights-backend/package.json | 2 +- plugins/tech-insights-node/CHANGELOG.md | 11 + plugins/tech-insights-node/package.json | 2 +- plugins/tech-insights/CHANGELOG.md | 14 + plugins/tech-insights/package.json | 2 +- plugins/tech-radar/CHANGELOG.md | 25 + plugins/tech-radar/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 16 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 16 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 13 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 11 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 22 + plugins/techdocs/package.json | 2 +- plugins/todo-backend/CHANGELOG.md | 12 + plugins/todo-backend/package.json | 2 +- plugins/todo/CHANGELOG.md | 12 + plugins/todo/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 14 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 13 + plugins/user-settings/package.json | 2 +- plugins/vault-backend/CHANGELOG.md | 11 + plugins/vault-backend/package.json | 2 +- plugins/vault/CHANGELOG.md | 13 + plugins/vault/package.json | 2 +- plugins/xcmetrics/CHANGELOG.md | 10 + plugins/xcmetrics/package.json | 2 +- 349 files changed, 4825 insertions(+), 175 deletions(-) create mode 100644 docs/releases/v1.11.0-next.2-changelog.md create mode 100644 packages/backend-dev-utils/CHANGELOG.md create mode 100644 packages/eslint-plugin/CHANGELOG.md create mode 100644 plugins/entity-validation/CHANGELOG.md create mode 100644 plugins/graphql-voyager/CHANGELOG.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 8d412f53b5..9b28c37a30 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -195,82 +195,149 @@ "@backstage/plugin-vault": "0.1.8", "@backstage/plugin-vault-backend": "0.2.6", "@backstage/plugin-xcmetrics": "0.2.34", - "@backstage/plugin-scaffolder-node": "0.0.0" + "@backstage/plugin-scaffolder-node": "0.0.0", + "@backstage/backend-dev-utils": "0.0.0", + "@backstage/eslint-plugin": "0.0.0", + "@backstage/plugin-entity-validation": "0.0.0", + "@backstage/plugin-graphql-voyager": "0.0.0", + "@backstage/plugin-lighthouse-backend": "0.0.0", + "@backstage/plugin-lighthouse-common": "0.0.0" }, "changesets": [ "afraid-foxes-provide", + "afraid-planets-crash", "brave-cougars-burn", + "breezy-ears-rule", "bright-eagles-love", + "bright-plums-cough", + "bright-teachers-compete", "brown-islands-own", "calm-avocados-exercise", "chatty-owls-care", + "chilled-sheep-collect", "clean-queens-judge", "cold-cycles-switch", + "cool-spoons-bathe", "create-app-1674561612", "cuddly-boxes-agree", "cyan-deers-walk", "dry-donkeys-cheer", + "dull-fishes-suffer", "dull-gorillas-sing", "eight-falcons-explode", "eight-hotels-sparkle", + "eight-vans-drum", + "eleven-shoes-crash", + "few-moons-accept", "flat-cups-itch", "four-candles-add", "four-rivers-enjoy", + "four-tables-fix", + "friendly-chefs-rule", "friendly-scissors-shop", "gold-bulldogs-talk", "gold-lemons-eat", "gold-masks-sleep", + "great-goats-talk", + "green-adults-retire", + "green-guests-flow", "grumpy-bottles-stare", + "grumpy-fireants-drop", "happy-cows-moo", + "hip-chairs-double", + "hip-onions-tan", "hip-pugs-teach", + "hip-tables-prove", "hot-lions-cover", + "hot-wasps-cover", "hungry-news-fix", + "itchy-chairs-punch", "itchy-goats-melt", "khaki-toes-care", "late-rice-crash", "lazy-badgers-rule", "lazy-badgers-try", "lemon-tables-train", + "little-jars-lay", + "long-chefs-burn", "lovely-ladybugs-taste", "many-nails-joke", + "many-pans-unite", + "mean-squids-kneel", "modern-cats-worry", "nasty-beans-accept", + "neat-schools-raise", "neat-zebras-run", "nervous-apricots-whisper", "nervous-mangos-rhyme", + "nervous-phones-shout", + "new-pumpkins-sleep", "nine-glasses-invent", "nine-guests-compete", + "nine-ravens-kiss", "ninety-hats-serve", "old-knives-wonder", + "old-ways-know", "perfect-cheetahs-serve", "pink-falcons-serve", "poor-moons-confess", "popular-dancers-join", "pretty-ladybugs-taste", + "proud-glasses-live", "purple-feet-smile", "quick-ladybugs-reply", + "quick-mice-change", + "rare-berries-give", "rare-melons-battle", + "red-kiwis-compare", "renovate-0b349f9", "renovate-0c3644c", + "renovate-53e8b07", "rich-snakes-rest", "rotten-mayflies-love", + "selfish-frogs-punch", + "serious-pigs-watch", "sharp-lobsters-build", "shiny-years-tap", + "short-apes-relate", + "shy-buses-mix", "shy-steaks-invite", + "silent-peas-fly", + "silly-buckets-joke", + "silly-socks-lie", "silly-turkeys-hang", + "silver-wolves-breathe", + "slow-carrots-sniff", + "slow-moles-sin", "smart-dingos-raise", + "soft-actors-worry", "soft-boxes-buy", "soft-snails-notice", "spotty-coats-clean", "stale-dots-smile", + "stale-experts-punch", "stupid-ladybugs-brake", "swift-fishes-smash", + "tall-falcons-teach", + "tall-tables-hide", "tall-years-relate", + "tasty-jobs-help", "thick-clocks-pump", + "thick-tables-travel", + "thin-donkeys-attack", + "thin-scissors-press", + "tough-jeans-camp", "twenty-islands-wonder", "twenty-parents-relate", "two-melons-lie", + "violet-tips-rhyme", + "weak-radios-sing", + "wicked-beers-walk", + "wild-donkeys-rescue", "witty-moose-itch", + "yellow-roses-tell", + "young-beans-float", + "young-points-drop", "young-singers-learn" ] } diff --git a/docs/releases/v1.11.0-next.2-changelog.md b/docs/releases/v1.11.0-next.2-changelog.md new file mode 100644 index 0000000000..65f6622921 --- /dev/null +++ b/docs/releases/v1.11.0-next.2-changelog.md @@ -0,0 +1,2289 @@ +# Release v1.11.0-next.2 + +## @backstage/backend-app-api@0.4.0-next.2 + +### Minor Changes + +- 01a075ec1d: **BREAKING**: Renamed `RootHttpRouterConfigureOptions` to `RootHttpRouterConfigureContext`, and removed the unused type `ServiceOrExtensionPoint`. +- 4ae71b7f2e: **BREAKING** Renaming `*Factory` exports to `*ServiceFactory` instead. For example `configFactory` now is exported as `configServiceFactory`. +- d31d8e00b3: **BREAKING** `HttpServerCertificateOptions` when specified with a `key` and `cert` should also have the `type: 'pem'` instead of `type: 'plain'` + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- f60cca9da1: Updated database factory to pass service deps required for restoring database state during development. +- 610d65e143: Updates to match new `BackendFeature` type. +- ab22515647: The shutdown signal handlers are now installed as part of the backend instance rather than the lifecycle service, and explicitly cause the process to exit. +- b729f9f31f: Moved the options of the `config` and `rootHttpRouter` services out to the factories themselves, where they belong +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/backend-dev-utils@0.1.0-next.0 + +### Minor Changes + +- 9d9cdea117: Introduced a new package for backend development utilities. Similar to how `@backstage/dev-utils` is used in the frontend. + +## @backstage/backend-plugin-api@0.4.0-next.2 + +### Minor Changes + +- e716946103: **BREAKING**: Split out the hook for both lifecycle services so that the first parameter of `addShutdownHook` is the hook function, and the second is the options. +- 0ff03319be: **BREAKING**: The plugin ID option passed to `createBackendPlugin` is now `pluginId`, rather than just `id`. This is to make it match `createBackendModule` more closely. +- 71a5ec0f06: **BREAKING**: Switched out `LogMeta` type for `JsonObject`. +- 610d65e143: Switched `BackendFeature` to be an opaque type. + +### Patch Changes + +- 9c9456fd33: Removed the unused `TypesToServiceRef` type +- 181c03edb5: Aligned opaque type markers to all use a `$type` property with namespacing. +- Updated dependencies + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/catalog-model@1.2.0-next.1 + +### Minor Changes + +- d51668882d: Adds the tRPC API type to the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/eslint-plugin@0.1.0-next.0 + +### Minor Changes + +- 179d301518: Added a new ESLint plugin with common rules for Backstage projects. See the [README](https://github.com/import-js/eslint-plugin-import/blob/main/packages/eslint-plugin/README.md) for more details. + +## @backstage/plugin-adr@0.4.0-next.2 + +### Minor Changes + +- ec34b535c0: The `AdrSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- ec34b535c0: Support displaying an icon on `AdrSearchResultListItem` +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-adr-common@0.2.6-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-api-docs@0.9.0-next.2 + +### Minor Changes + +- 9ed53218a5: Adds a new tRPC API definition widget which users can utilize to integrate their tRPC API definitions into Backstage. + +### Patch Changes + +- 6856ab98f4: Updated dependency `@asyncapi/react-component` to `1.0.0-next.47`. +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.0-next.2 + +### Minor Changes + +- fb568e2683: Improve performance when loading users via group membership. + Users data is now loaded from a paged query, rather than having to make an extra call per user to load each user's profiles. + + Note, there are still additional per user calls made to load user avatars + +### Patch Changes + +- 28f9883440: Fixed a bug reading the `user.select` field expected from the `app-config.yaml` configuration +- c5b119ad9c: Increased default page size to 999 (from 100) to reduce the number of calls made to the Microsoft Graph API. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-entity-validation@0.1.0-next.0 + +### Minor Changes + +- d34b3267f9: First implementation for the entity validation UI. For more information refer to its `README.md`. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-graphql-voyager@0.1.0-next.0 + +### Minor Changes + +- d1fb4b7bf1: Add the new GraphQL Voyager tool as a plugin for backstage, expose necessary API and components needed for it. + + For more information on how to use this plugin and configure it, please navigate to the [README](https://github.com/backstage/backstage/tree/master/plugins/graphql-voyager/README.md) of the plugin. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-lighthouse@0.4.0-next.2 + +### Minor Changes + +- eef62546ce: Require @backstage/plugin-lighthouse-common package where API implementation moved to. + + **BREAKING**: the following types have been moved to @backstage/plugin-lighthouse-common: + + - `Audit` + - `AuditBase` + - `AuditCompleted` + - `AuditFailed` + - `AuditRunning` + - `FetchError` + - `LASListRequest` + - `LASListResponse` + - `LighthouseApi` + - `LighthouseCategoryAbbr` + - `LighthouseCategoryId` + - `LighthouseConfigSettings` + - `LighthouseRestApi` + - `TriggerAuditPayload` + - `Website` + - `WebsiteListResponse` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-common@0.1.0-next.0 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-lighthouse-backend@0.1.0-next.0 + +### Minor Changes + +- eef62546ce: Introduce Lighthouse Backend Plugin to run scheduled Lighthouse Audits + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-common@0.1.0-next.0 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## @backstage/plugin-lighthouse-common@0.1.0-next.0 + +### Minor Changes + +- eef62546ce: Introduce @backstage/plugin-lighthouse-common with the API implementation + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + +## @backstage/plugin-scaffolder-react@1.1.0-next.2 + +### Minor Changes + +- 5555e17313: refactor `createAsyncValidators` to be recursive to ensure validators are called in nested schemas. + +### Patch Changes + +- b46f385eff: scaffolder/next: Implementing a simple `OngoingTask` page +- ccbf91051b: bump `@rjsf` `v5` dependencies to 5.1.0 +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + +## @backstage/plugin-sentry@0.5.0-next.2 + +### Minor Changes + +- 6a8d6b9a0c: Add option to filter issues based on the time it was triggered + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/app-defaults@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-permission-react@0.4.9 + +## @backstage/backend-common@0.18.2-next.2 + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- d31d8e00b3: Updated to work with the new `type: 'pem'` with `createHttpServer` from `@backstage/backend-app-api` +- 0ff03319be: Updated usage of `createBackendPlugin`. +- f60cca9da1: The `DatabaseManager.forPlugin` method now accepts additional service dependencies. There is no need to update existing code to pass these dependencies. +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-dev-utils@0.1.0-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.7-next.2 + +### Patch Changes + +- e412d33025: Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + +## @backstage/backend-tasks@0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/backend-test-utils@0.1.34-next.2 + +### Patch Changes + +- baf6e4c96a: Removed unnecessary `@backstage/cli` dependency. +- 1835311713: Added explicit return type signature for `mockServices.config()`. +- e716946103: Updated usage of the lifecycle service. +- 7e7557a2be: Updated the `mockServices.rootLogger` options to accept a single level option instead. +- 610d65e143: Updates to match new `BackendFeature` type. +- e412d33025: Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` +- f1adb2e36b: Removed the `ref` from all `mockServices`. +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## @backstage/catalog-client@1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/errors@1.1.4 + +## @backstage/cli@0.22.2-next.1 + +### Patch Changes + +- dd8a9afe66: Replaced several monorepo lint rules with new rules from `@backstage/eslint-plugin`. See the [README](https://github.com/import-js/eslint-plugin-import/blob/main/packages/eslint-plugin/README.md) for a full list of rules. +- 90616df9a8: Added an experimental mode for the `package start` command for backend packages. Enabled by setting `EXPERIMENTAL_BACKEND_START`. +- Updated dependencies + - @backstage/eslint-plugin@0.1.0-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/release-manifests@0.0.8 + - @backstage/types@1.0.2 + +## @backstage/codemods@0.1.43-next.0 + +### Patch Changes + +- 02f1316e57: Moved `commander` to being a regular dependency. +- Updated dependencies + - @backstage/cli-common@0.1.11 + +## @backstage/core-components@0.12.4-next.1 + +### Patch Changes + +- 66e2aab4c4: Navigation items in mobile sidebar now have aria label. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/version-bridge@1.0.3 + +## @backstage/create-app@0.4.37-next.2 + +### Patch Changes + +- 02f1316e57: Updated `packages/app/cypress/.eslintrc.json` to remove the unnecessary `import/no-extraneous-dependencies` rule. +- Updated dependencies + - @backstage/cli-common@0.1.11 + +## @backstage/dev-utils@1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/integration-react@1.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @backstage/repo-tools@0.1.2-next.0 + +### Patch Changes + +- ff63acf30a: Packages without a declared `backstage.role` are now ignored. +- Updated dependencies + - @backstage/cli-common@0.1.11 + - @backstage/errors@1.1.4 + +## @techdocs/cli@1.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/plugin-techdocs-node@1.4.6-next.2 + +## @backstage/plugin-adr-backend@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-common@0.2.6-next.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-adr-common@0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/integration@1.4.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-airbrake@0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/dev-utils@1.0.12-next.2 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-airbrake-backend@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-allure@0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-analytics-module-ga@0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-apache-airflow@0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + +## @backstage/plugin-apollo-explorer@0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-app-backend@0.3.42-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.17.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-node@0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-azure-devops@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-devops-common@0.3.0 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-azure-devops-backend@0.3.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.4-next.2 + +### Patch Changes + +- 98a00a09d5: Fixed `AzureSites` plugin start and stop issue #15904 + Fixed `AzureSites` UI load issue #15907 +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-sites-common@0.1.0 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-azure-sites-backend@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-badges-backend@0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-bazaar@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-bazaar-backend@0.2.5-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-bitrise@0.1.42-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-catalog@1.8.0-next.2 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-catalog-backend@1.7.2-next.2 + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-catalog-backend-module-aws@0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-azure@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + - @backstage/plugin-catalog-common@1.0.11-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## @backstage/plugin-catalog-backend-module-github@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.13-next.2 + +### Patch Changes + +- 49948f644f: The config now consistently uses the term 'instance' to refer to a single GitLab API host. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.2.0-next.2 + +### Patch Changes + +- 407dc01fc9: Removing extra imports for `run` script as `TestBackend` auto loads the default factories +- 77c41b6924: Updated README to include newer API options for incremental entity providers +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-common@1.0.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-catalog-graph@0.2.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-catalog-graphql@0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-import@0.9.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-catalog-node@1.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + +## @backstage/plugin-catalog-react@1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + +## @backstage/plugin-cicd-statistics@0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-cicd-statistics@0.1.17-next.2 + +## @backstage/plugin-circleci@0.3.15-next.2 + +### Patch Changes + +- 1616e06047: Making workflow a link +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-cloudbuild@0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-code-climate@0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-code-coverage@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-code-coverage-backend@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## @backstage/plugin-codescene@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-config-schema@0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@2.0.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-events-backend@0.2.3-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## @backstage/plugin-events-backend-module-azure@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + +## @backstage/plugin-events-backend-module-gerrit@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + +## @backstage/plugin-events-backend-module-github@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-events-backend-module-gitlab@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-events-backend-test-utils@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.3-next.2 + +## @backstage/plugin-events-node@0.2.3-next.2 + +### Patch Changes + +- 19d4abf72c: Make `EventParams` typed for implementing tidier event handling. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + +## @backstage/plugin-explore@0.4.0-next.2 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-explore-backend@0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-firehydrant@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-fossa@0.2.47-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-gcalendar@0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## @backstage/plugin-gcp-projects@0.3.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-git-release-manager@0.3.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + +## @backstage/plugin-github-actions@0.5.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-github-deployments@0.1.46-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-github-issues@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-github-pull-requests-board@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-gitops-profiles@0.3.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-gocd@0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-graphiql@0.2.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-graphql-backend@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-graphql@0.3.18-next.1 + +## @backstage/plugin-home@0.4.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-ilert@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-jenkins@0.7.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-jenkins-common@0.1.13-next.1 + +## @backstage/plugin-jenkins-backend@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-jenkins-common@0.1.13-next.1 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-jenkins-common@0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-kafka@0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-kafka-backend@0.2.35-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-kubernetes@0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-kubernetes-common@0.6.0-next.2 + +## @backstage/plugin-kubernetes-backend@0.9.3-next.2 + +### Patch Changes + +- 7ff81f7692: Kubernetes proxy endpoint now accepts content types that are not json +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-kubernetes-common@0.6.0-next.2 + +## @backstage/plugin-kubernetes-common@0.6.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + +## @backstage/plugin-newrelic@0.3.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-newrelic-dashboard@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-org@0.6.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-org-react@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-pagerduty@0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-periskop@0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-periskop-backend@0.1.13-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-permission-backend@0.5.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-permission-node@0.7.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + +## @backstage/plugin-playlist@0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist-common@0.1.4 + +## @backstage/plugin-playlist-backend@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-playlist-common@0.1.4 + +## @backstage/plugin-proxy-backend@0.2.36-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-rollbar@0.4.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-rollbar-backend@0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + +## @backstage/plugin-scaffolder@1.11.0-next.2 + +### Patch Changes + +- b46f385eff: scaffolder/next: Implementing a simple `OngoingTask` page +- ccbf91051b: bump `@rjsf` `v5` dependencies to 5.1.0 +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + +## @backstage/plugin-scaffolder-backend@1.11.0-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-common@1.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + +## @backstage/plugin-search@1.1.0-next.2 + +### Patch Changes + +- 66e2aab4c4: Updated colors for each tab used on search modal, to improve color contrast. Aria label added to tabs wrapper component. `disableRipple` property on the `Tab` component removed to improve keyboard navigation indicator. +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend@1.2.3-next.2 + +### Patch Changes + +- 1b30c9a0f7: Change the router's response to include the error message instead of its object type in case it fails during a search query because the messages have more info. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend-module-pg@0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-backend-node@1.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-search-react@1.5.0-next.1 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-shortcuts@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-sonarqube-react@0.1.2-next.1 + +## @backstage/plugin-sonarqube-backend@0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-sonarqube-react@0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-plugin-api@1.3.0 + +## @backstage/plugin-splunk-on-call@0.4.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-stack-overflow@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-home@0.4.31-next.2 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-stack-overflow-backend@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-tech-insights@0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + +## @backstage/plugin-tech-insights-backend@0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + +## @backstage/plugin-tech-insights-node@0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + +## @backstage/plugin-tech-radar@0.6.1-next.1 + +### Patch Changes + +- acf6c8c10b: Deprecate `RadarEntry.url` - use `RadarEntry.links` instead + + ```diff + - url: 'https://www.javascript.com/', + key: 'javascript', + id: 'javascript', + title: 'JavaScript', + quadrant: 'languages', + links: [ + + { + + url: 'https://www.javascript.com/', + + title: 'Learn more', + + }, + ], + ``` + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @backstage/plugin-techdocs@1.5.0-next.2 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + +## @backstage/plugin-techdocs-backend@1.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-node@1.4.6-next.2 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + +## @backstage/plugin-techdocs-node@1.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-aws-node@0.1.1 + - @backstage/plugin-search-common@1.2.1 + +## @backstage/plugin-techdocs-react@1.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/version-bridge@1.0.3 + +## @backstage/plugin-todo@0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-todo-backend@0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + +## @backstage/plugin-user-settings@0.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-user-settings-backend@0.1.6-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-vault@0.1.9-next.2 + +### Patch Changes + +- fd7a77b9c4: Surface additional context and details to the Backstage UI when the Vault plugin encounters non-successful HTTP responses from the Vault API. +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @backstage/plugin-vault-backend@0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## @backstage/plugin-xcmetrics@0.2.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + +## example-app@0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.2 + - @backstage/plugin-scaffolder@1.11.0-next.2 + - @backstage/cli@0.22.2-next.1 + - @backstage/plugin-api-docs@0.9.0-next.2 + - @backstage/plugin-tech-radar@0.6.1-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-explore@0.4.0-next.2 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/plugin-sentry@0.5.0-next.2 + - @backstage/plugin-circleci@0.3.15-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/plugin-azure-sites@0.1.4-next.2 + - @backstage/plugin-search@1.1.0-next.2 + - @backstage/plugin-lighthouse@0.4.0-next.2 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.15-next.2 + - @backstage/plugin-apache-airflow@0.2.8-next.1 + - @backstage/plugin-azure-devops@0.2.6-next.2 + - @backstage/plugin-badges@0.2.39-next.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-graph@0.2.27-next.2 + - @backstage/plugin-catalog-import@0.9.5-next.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-cloudbuild@0.3.15-next.2 + - @backstage/plugin-code-coverage@0.2.8-next.2 + - @backstage/plugin-cost-insights@0.12.4-next.2 + - @backstage/plugin-dynatrace@2.0.0-next.2 + - @backstage/plugin-gcalendar@0.3.11-next.1 + - @backstage/plugin-gcp-projects@0.3.34-next.1 + - @backstage/plugin-github-actions@0.5.15-next.2 + - @backstage/plugin-gocd@0.1.21-next.2 + - @backstage/plugin-graphiql@0.2.47-next.1 + - @backstage/plugin-home@0.4.31-next.2 + - @backstage/plugin-jenkins@0.7.14-next.2 + - @backstage/plugin-kafka@0.3.15-next.2 + - @backstage/plugin-kubernetes@0.7.8-next.2 + - @backstage/plugin-newrelic@0.3.33-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.2 + - @backstage/plugin-org@0.6.5-next.2 + - @backstage/plugin-pagerduty@0.5.8-next.2 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist@0.1.6-next.2 + - @backstage/plugin-rollbar@0.4.15-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-shortcuts@0.3.7-next.1 + - @backstage/plugin-stack-overflow@0.1.11-next.2 + - @backstage/plugin-tech-insights@0.3.7-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.2 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + - @backstage/plugin-todo@0.2.17-next.2 + - @backstage/plugin-user-settings@0.6.3-next.2 + - @internal/plugin-catalog-customized@0.0.7-next.2 + +## example-backend@0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-backend@0.1.0-next.0 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/plugin-search-backend@1.2.3-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-events-backend@0.2.3-next.2 + - @backstage/plugin-kafka-backend@0.2.35-next.2 + - @backstage/plugin-proxy-backend@0.2.36-next.2 + - @backstage/plugin-app-backend@0.3.42-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-kubernetes-backend@0.9.3-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.17.5-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/plugin-playlist-backend@0.2.5-next.2 + - @backstage/plugin-rollbar-backend@0.1.39-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.2 + - @backstage/plugin-tech-insights-backend@0.5.8-next.2 + - @backstage/plugin-techdocs-backend@1.5.3-next.2 + - example-app@0.2.80-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-backend@0.2.7-next.2 + - @backstage/plugin-azure-devops-backend@0.3.21-next.2 + - @backstage/plugin-azure-sites-backend@0.1.4-next.2 + - @backstage/plugin-badges-backend@0.1.36-next.2 + - @backstage/plugin-code-coverage-backend@0.2.8-next.2 + - @backstage/plugin-explore-backend@0.0.4-next.2 + - @backstage/plugin-graphql-backend@0.1.32-next.2 + - @backstage/plugin-jenkins-backend@0.1.32-next.2 + - @backstage/plugin-permission-backend@0.5.17-next.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.2 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.2 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + - @backstage/plugin-todo-backend@0.1.39-next.2 + +## example-backend-next@0.0.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-app-backend@0.3.42-next.2 + - @backstage/backend-defaults@0.1.7-next.2 + +## techdocs-cli-embedded-app@0.2.79-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + +## @internal/plugin-catalog-customized@0.0.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + +## @internal/plugin-todo-list@1.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + +## @internal/plugin-todo-list-backend@1.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 diff --git a/package.json b/package.json index e08ca3adfd..286e750f29 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.11.0-next.1", + "version": "1.11.0-next.2", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index ecd6c448d5..e785ffe05a 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-permission-react@0.4.9 + ## 1.1.1-next.0 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 793baff253..8ffdfd60bc 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.1.1-next.0", + "version": "1.1.1-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index a541927bf4..818d21840d 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,69 @@ # example-app +## 0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.2 + - @backstage/plugin-scaffolder@1.11.0-next.2 + - @backstage/cli@0.22.2-next.1 + - @backstage/plugin-api-docs@0.9.0-next.2 + - @backstage/plugin-tech-radar@0.6.1-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-explore@0.4.0-next.2 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/plugin-sentry@0.5.0-next.2 + - @backstage/plugin-circleci@0.3.15-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/plugin-azure-sites@0.1.4-next.2 + - @backstage/plugin-search@1.1.0-next.2 + - @backstage/plugin-lighthouse@0.4.0-next.2 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.15-next.2 + - @backstage/plugin-apache-airflow@0.2.8-next.1 + - @backstage/plugin-azure-devops@0.2.6-next.2 + - @backstage/plugin-badges@0.2.39-next.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-graph@0.2.27-next.2 + - @backstage/plugin-catalog-import@0.9.5-next.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-cloudbuild@0.3.15-next.2 + - @backstage/plugin-code-coverage@0.2.8-next.2 + - @backstage/plugin-cost-insights@0.12.4-next.2 + - @backstage/plugin-dynatrace@2.0.0-next.2 + - @backstage/plugin-gcalendar@0.3.11-next.1 + - @backstage/plugin-gcp-projects@0.3.34-next.1 + - @backstage/plugin-github-actions@0.5.15-next.2 + - @backstage/plugin-gocd@0.1.21-next.2 + - @backstage/plugin-graphiql@0.2.47-next.1 + - @backstage/plugin-home@0.4.31-next.2 + - @backstage/plugin-jenkins@0.7.14-next.2 + - @backstage/plugin-kafka@0.3.15-next.2 + - @backstage/plugin-kubernetes@0.7.8-next.2 + - @backstage/plugin-newrelic@0.3.33-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.2 + - @backstage/plugin-org@0.6.5-next.2 + - @backstage/plugin-pagerduty@0.5.8-next.2 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist@0.1.6-next.2 + - @backstage/plugin-rollbar@0.4.15-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-shortcuts@0.3.7-next.1 + - @backstage/plugin-stack-overflow@0.1.11-next.2 + - @backstage/plugin-tech-insights@0.3.7-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.2 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + - @backstage/plugin-todo@0.2.17-next.2 + - @backstage/plugin-user-settings@0.6.3-next.2 + - @internal/plugin-catalog-customized@0.0.7-next.2 + ## 0.2.80-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index f6631ed05b..1b3841ceae 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.80-next.1", + "version": "0.2.80-next.2", "private": true, "backstage": { "role": "frontend" diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 6e7dcbfde5..daae24c717 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/backend-app-api +## 0.4.0-next.2 + +### Minor Changes + +- 01a075ec1d: **BREAKING**: Renamed `RootHttpRouterConfigureOptions` to `RootHttpRouterConfigureContext`, and removed the unused type `ServiceOrExtensionPoint`. +- 4ae71b7f2e: **BREAKING** Renaming `*Factory` exports to `*ServiceFactory` instead. For example `configFactory` now is exported as `configServiceFactory`. +- d31d8e00b3: **BREAKING** `HttpServerCertificateOptions` when specified with a `key` and `cert` should also have the `type: 'pem'` instead of `type: 'plain'` + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- f60cca9da1: Updated database factory to pass service deps required for restoring database state during development. +- 610d65e143: Updates to match new `BackendFeature` type. +- ab22515647: The shutdown signal handlers are now installed as part of the backend instance rather than the lifecycle service, and explicitly cause the process to exit. +- b729f9f31f: Moved the options of the `config` and `rootHttpRouter` services out to the factories themselves, where they belong +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.3.2-next.1 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 0bd4eab227..3bbae1f7fe 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.3.2-next.1", + "version": "0.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index f8090ae971..1a495ff771 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/backend-common +## 0.18.2-next.2 + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- d31d8e00b3: Updated to work with the new `type: 'pem'` with `createHttpServer` from `@backstage/backend-app-api` +- 0ff03319be: Updated usage of `createBackendPlugin`. +- f60cca9da1: The `DatabaseManager.forPlugin` method now accepts additional service dependencies. There is no need to update existing code to pass these dependencies. +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-dev-utils@0.1.0-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.18.2-next.1 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 9ec68e5531..3152cd0b28 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.18.2-next.1", + "version": "0.18.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 0824ee5655..89f3ee25c6 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-defaults +## 0.1.7-next.2 + +### Patch Changes + +- e412d33025: Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + ## 0.1.7-next.1 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 6b1b173205..2d92d15ab8 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.7-next.1", + "version": "0.1.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-dev-utils/CHANGELOG.md b/packages/backend-dev-utils/CHANGELOG.md new file mode 100644 index 0000000000..9acf8cf15f --- /dev/null +++ b/packages/backend-dev-utils/CHANGELOG.md @@ -0,0 +1,7 @@ +# @backstage/backend-dev-utils + +## 0.1.0-next.0 + +### Minor Changes + +- 9d9cdea117: Introduced a new package for backend development utilities. Similar to how `@backstage/dev-utils` is used in the frontend. diff --git a/packages/backend-dev-utils/package.json b/packages/backend-dev-utils/package.json index 735185e37f..6e1cf7d3b0 100644 --- a/packages/backend-dev-utils/package.json +++ b/packages/backend-dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dev-utils", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 914835b1c4..9e8f7a2d83 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,15 @@ # example-backend-next +## 0.0.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-app-backend@0.3.42-next.2 + - @backstage/backend-defaults@0.1.7-next.2 + ## 0.0.8-next.1 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index fb821e19eb..8f007dc7ea 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.8-next.1", + "version": "0.0.8-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 3ad0715538..f5aa2dd9fc 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/backend-plugin-api +## 0.4.0-next.2 + +### Minor Changes + +- e716946103: **BREAKING**: Split out the hook for both lifecycle services so that the first parameter of `addShutdownHook` is the hook function, and the second is the options. +- 0ff03319be: **BREAKING**: The plugin ID option passed to `createBackendPlugin` is now `pluginId`, rather than just `id`. This is to make it match `createBackendModule` more closely. +- 71a5ec0f06: **BREAKING**: Switched out `LogMeta` type for `JsonObject`. +- 610d65e143: Switched `BackendFeature` to be an opaque type. + +### Patch Changes + +- 9c9456fd33: Removed the unused `TypesToServiceRef` type +- 181c03edb5: Aligned opaque type markers to all use a `$type` property with namespacing. +- Updated dependencies + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + ## 0.3.2-next.1 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 954112bc2d..7243f3485c 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.3.2-next.1", + "version": "0.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 04ce4e9c3b..1e32f34978 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/backend-tasks +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.4.3-next.1 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 574f3dc812..ee7d7d6e67 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.4.3-next.1", + "version": "0.4.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index f532e08d81..bf7b6c6713 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/backend-test-utils +## 0.1.34-next.2 + +### Patch Changes + +- baf6e4c96a: Removed unnecessary `@backstage/cli` dependency. +- 1835311713: Added explicit return type signature for `mockServices.config()`. +- e716946103: Updated usage of the lifecycle service. +- 7e7557a2be: Updated the `mockServices.rootLogger` options to accept a single level option instead. +- 610d65e143: Updates to match new `BackendFeature` type. +- e412d33025: Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` +- f1adb2e36b: Removed the `ref` from all `mockServices`. +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + ## 0.1.34-next.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index d1f0a86d43..08e00e1c5e 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.34-next.1", + "version": "0.1.34-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 24b00f192c..7053244da9 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,54 @@ # example-backend +## 0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-backend@0.1.0-next.0 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/plugin-search-backend@1.2.3-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-events-backend@0.2.3-next.2 + - @backstage/plugin-kafka-backend@0.2.35-next.2 + - @backstage/plugin-proxy-backend@0.2.36-next.2 + - @backstage/plugin-app-backend@0.3.42-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-kubernetes-backend@0.9.3-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-backend@0.17.5-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/plugin-playlist-backend@0.2.5-next.2 + - @backstage/plugin-rollbar-backend@0.1.39-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.3-next.2 + - @backstage/plugin-tech-insights-backend@0.5.8-next.2 + - @backstage/plugin-techdocs-backend@1.5.3-next.2 + - example-app@0.2.80-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-backend@0.2.7-next.2 + - @backstage/plugin-azure-devops-backend@0.3.21-next.2 + - @backstage/plugin-azure-sites-backend@0.1.4-next.2 + - @backstage/plugin-badges-backend@0.1.36-next.2 + - @backstage/plugin-code-coverage-backend@0.2.8-next.2 + - @backstage/plugin-explore-backend@0.0.4-next.2 + - @backstage/plugin-graphql-backend@0.1.32-next.2 + - @backstage/plugin-jenkins-backend@0.1.32-next.2 + - @backstage/plugin-permission-backend@0.5.17-next.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.10-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.3-next.2 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.26-next.2 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + - @backstage/plugin-todo-backend@0.1.39-next.2 + ## 0.2.80-next.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index e554036ede..3678c1f9ae 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.80-next.1", + "version": "0.2.80-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index cf61dee463..1602dfbb79 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/catalog-client +## 1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/errors@1.1.4 + ## 1.3.1-next.0 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 8b7c09d2ef..ac233e293a 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.3.1-next.0", + "version": "1.3.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 5bb6033940..1f14aba820 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/catalog-model +## 1.2.0-next.1 + +### Minor Changes + +- d51668882d: Adds the tRPC API type to the catalog. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 1.1.6-next.0 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 5dba193a61..117035a82e 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.1.6-next.0", + "version": "1.2.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index caf890a14f..09e7f44eb4 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/cli +## 0.22.2-next.1 + +### Patch Changes + +- dd8a9afe66: Replaced several monorepo lint rules with new rules from `@backstage/eslint-plugin`. See the [README](https://github.com/import-js/eslint-plugin-import/blob/main/packages/eslint-plugin/README.md) for a full list of rules. +- 90616df9a8: Added an experimental mode for the `package start` command for backend packages. Enabled by setting `EXPERIMENTAL_BACKEND_START`. +- Updated dependencies + - @backstage/eslint-plugin@0.1.0-next.0 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/errors@1.1.4 + - @backstage/release-manifests@0.0.8 + - @backstage/types@1.0.2 + ## 0.22.2-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 587c91ce5e..a3020de1da 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.2-next.0", + "version": "0.22.2-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 2481aff8b1..5dc610d5c1 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/codemods +## 0.1.43-next.0 + +### Patch Changes + +- 02f1316e57: Moved `commander` to being a regular dependency. +- Updated dependencies + - @backstage/cli-common@0.1.11 + ## 0.1.42 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 1ae4d04485..7c6af890b0 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/codemods", "description": "A collection of codemods for Backstage projects", - "version": "0.1.42", + "version": "0.1.43-next.0", "publishConfig": { "access": "public", "main": "dist/index.cjs.js" diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index efded8f3c1..30c4e92173 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-components +## 0.12.4-next.1 + +### Patch Changes + +- 66e2aab4c4: Navigation items in mobile sidebar now have aria label. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/version-bridge@1.0.3 + ## 0.12.4-next.0 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index dc65108d4a..7eedac93ac 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.12.4-next.0", + "version": "0.12.4-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 4b757a47c9..198d4d92a9 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.4.37-next.2 + +### Patch Changes + +- 02f1316e57: Updated `packages/app/cypress/.eslintrc.json` to remove the unnecessary `import/no-extraneous-dependencies` rule. +- Updated dependencies + - @backstage/cli-common@0.1.11 + ## 0.4.37-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index e87dc7b0ac..cfdccc5a2b 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.37-next.1", + "version": "0.4.37-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 0b66dd3019..6996180db5 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.0.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 1.0.12-next.1 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index b00f5e58a2..773dc3cac0 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.12-next.1", + "version": "1.0.12-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md new file mode 100644 index 0000000000..35e3c8f0ea --- /dev/null +++ b/packages/eslint-plugin/CHANGELOG.md @@ -0,0 +1,7 @@ +# @backstage/eslint-plugin + +## 0.1.0-next.0 + +### Minor Changes + +- 179d301518: Added a new ESLint plugin with common rules for Backstage projects. See the [README](https://github.com/import-js/eslint-plugin-import/blob/main/packages/eslint-plugin/README.md) for more details. diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 84fc16b98f..0aea11d370 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/eslint-plugin", "description": "Backstage ESLint plugin", - "version": "0.0.0", + "version": "0.1.0-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 5e880265f8..8813458f86 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/integration-react +## 1.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 1.1.10-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 8fdc8d4841..b287f88f87 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.10-next.0", + "version": "1.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 5969521581..2875d54fef 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/repo-tools +## 0.1.2-next.0 + +### Patch Changes + +- ff63acf30a: Packages without a declared `backstage.role` are now ignored. +- Updated dependencies + - @backstage/cli-common@0.1.11 + - @backstage/errors@1.1.4 + ## 0.1.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index dd70575433..5ea26060c4 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.1.1", + "version": "0.1.2-next.0", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index f82207ff06..55d39a6ee5 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.79-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + ## 0.2.79-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 68d443db99..acee2e8cb3 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.79-next.1", + "version": "0.2.79-next.2", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 8e0bc02dca..54bf7d2e8c 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/cli-common@0.1.11 + - @backstage/config@1.0.6 + - @backstage/plugin-techdocs-node@1.4.6-next.2 + ## 1.3.2-next.1 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 5f2e7db65d..092bd687bc 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.3.2-next.1", + "version": "1.3.2-next.2", "publishConfig": { "access": "public" }, diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index c791947589..11f11a19b9 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-adr-backend +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-adr-common@0.2.6-next.1 + - @backstage/plugin-search-common@1.2.1 + ## 0.2.7-next.1 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index 0c74df5cf2..33679a00dc 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.2.7-next.1", + "version": "0.2.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 4ee9e2fd8e..7ed77717a1 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-adr-common +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/integration@1.4.2 + - @backstage/plugin-search-common@1.2.1 + ## 0.2.6-next.0 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index a34cf5497c..7bae7294bb 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.6-next.0", + "version": "0.2.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index 6f9a6b4be6..cea1b59deb 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-adr +## 0.4.0-next.2 + +### Minor Changes + +- ec34b535c0: The `AdrSearchResultListItem` component is now a search result extension. This means that when rendered as a child of components that render search extensions, the `result`, `rank`, and `highlight` properties are optional. See the [documentation](https://backstage.io/docs/features/search/how-to-guides#how-to-render-search-results-using-extensions) for more details. + +### Patch Changes + +- ec34b535c0: Support displaying an icon on `AdrSearchResultListItem` +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-adr-common@0.2.6-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 0.3.1-next.1 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 5f3d3ba12a..085729f86f 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.3.1-next.1", + "version": "0.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index 81a9eb4ae1..16ad4db685 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-airbrake-backend +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 9d56c6defa..4d8cde9678 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index 4132257d2e..0d7ccc3e7e 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-airbrake +## 0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/dev-utils@1.0.12-next.2 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.3.15-next.1 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index d87b734674..c16cccd171 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.15-next.1", + "version": "0.3.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 4bc73ee469..02c249120e 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-allure +## 0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.31-next.1 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index a36762e5ac..cdd0b6c71f 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.31-next.1", + "version": "0.1.31-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index 0114443617..61cd39fcb8 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-analytics-module-ga +## 0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.26-next.0 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 17ee33eea9..e98aa30b4b 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.26-next.0", + "version": "0.1.26-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index e597c164a0..1434589d01 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-apache-airflow +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + ## 0.2.8-next.0 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index c589a58557..45116f3171 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.8-next.0", + "version": "0.2.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index b002e4c373..39796b3231 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-api-docs +## 0.9.0-next.2 + +### Minor Changes + +- 9ed53218a5: Adds a new tRPC API definition widget which users can utilize to integrate their tRPC API definitions into Backstage. + +### Patch Changes + +- 6856ab98f4: Updated dependency `@asyncapi/react-component` to `1.0.0-next.47`. +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.8.15-next.1 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index a23a123dc3..ee3e88fe11 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.8.15-next.1", + "version": "0.9.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index df9c9d8270..8903d504a9 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apollo-explorer +## 0.1.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 713ad945ad..7917f5a417 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index a8a9ca7edf..617d74217b 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-app-backend +## 0.3.42-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/config-loader@1.1.8 + - @backstage/types@1.0.2 + ## 0.3.42-next.1 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index d434749619..ff9cd8fe5f 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.42-next.1", + "version": "0.3.42-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index a1bee43423..f76848cb94 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-auth-backend +## 0.17.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.17.5-next.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index a95465dbad..7a855e62a8 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.17.5-next.1", + "version": "0.17.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index d569650cd5..7f9e0f8a33 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-node +## 0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.11-next.1 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 5d0748cdee..fe7adb300d 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.11-next.1", + "version": "0.2.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index 2c7f39f8b3..7488628b80 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-devops-backend +## 0.3.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.21-next.1 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index c62602a8f5..2103acf8fc 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.21-next.1", + "version": "0.3.21-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index e6ab23c37c..cb4be6f908 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-azure-devops +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-devops-common@0.3.0 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 71ff024078..bfb09aff1d 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 30e29db0ae..e3680abddb 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-sites-backend +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index fbc98b0d5e..c053435161 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 32c55b424c..8c44d24ff3 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-azure-sites +## 0.1.4-next.2 + +### Patch Changes + +- 98a00a09d5: Fixed `AzureSites` plugin start and stop issue #15904 + Fixed `AzureSites` UI load issue #15907 +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-azure-sites-common@0.1.0 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index a2032f9292..3cfe1ea9c3 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index c3ed18ac63..ca5bbb859d 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-badges-backend +## 0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.1.36-next.1 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 33e945bfd0..25beed0238 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.36-next.1", + "version": "0.1.36-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index c58757b38d..cefd2f8ccd 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-badges +## 0.2.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.39-next.1 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 8e6eb3c88d..4c8edbd09f 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.39-next.1", + "version": "0.2.39-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 6fc165aebc..5a7107312e 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-bazaar-backend +## 0.2.5-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 0d21223078..d67bba4eb5 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index a24a4164ce..d3b9cc6a71 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-bazaar +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index d4d88176d8..7558aaf2ec 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.4-next.1", + "version": "0.2.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index be81c9f7af..65cef85765 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bitrise +## 0.1.42-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.42-next.1 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 3f064430cc..13cc29fd06 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.42-next.1", + "version": "0.1.42-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index bea397e7b5..d0eeb5702c 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.1.15-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 083ed52fab..0c9d9af8bb 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.15-next.1", + "version": "0.1.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index c71b691a7a..05e48690d7 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index da7d1f5aa3..9552fe1e98 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.13-next.1", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 4cd4b6565c..261a192dfa 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + - @backstage/plugin-catalog-common@1.0.11-next.1 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 1e1f94ac38..78e1e15653 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.9-next.1", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index ef7755cf0d..b3b825bbc6 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + ## 0.1.7-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index eba6a276ad..edd1fbf0e6 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.7-next.1", + "version": "0.1.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 455abd3f2b..b07c7a92bb 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-bitbucket-cloud-common@0.2.3 + ## 0.2.9-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 646f9af81e..7df64bbc87 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.9-next.1", + "version": "0.2.9-next.2", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index f048780bb7..9efd73aac5 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index f2327ed216..4e8d389c9c 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 430615eabd..089cd237e2 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index d72d520f6a..36cd96274a 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 9da2c77fdf..1f5fc26f38 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.1.13-next.2 + +### Patch Changes + +- 49948f644f: The config now consistently uses the term 'instance' to refer to a single GitLab API host. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 44aadec29b..6668e2f45d 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.1.13-next.1", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index b52760e185..1953885783 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.2.0-next.2 + +### Patch Changes + +- 407dc01fc9: Removing extra imports for `run` script as `TestBackend` auto loads the default factories +- 77c41b6924: Updated README to include newer API options for incremental entity providers +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + ## 0.2.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index ec50c44311..b29771c74d 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.2.0-next.1", + "version": "0.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index f64a4460ea..50245d20ae 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.5.9-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index aed68ebdf9..6a5e1426f7 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.9-next.1", + "version": "0.5.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index e53d159d1d..0ee67c7a3c 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.0-next.2 + +### Minor Changes + +- fb568e2683: Improve performance when loading users via group membership. + Users data is now loaded from a paged query, rather than having to make an extra call per user to load each user's profiles. + + Note, there are still additional per user calls made to load user avatars + +### Patch Changes + +- 28f9883440: Fixed a bug reading the `user.select` field expected from the `app-config.yaml` configuration +- c5b119ad9c: Increased default page size to 999 (from 100) to reduce the number of calls made to the Microsoft Graph API. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + ## 0.4.8-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 7be2678bc6..7ae0af0bea 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.4.8-next.1", + "version": "0.5.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 5dd91ecd63..496221964e 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/config@1.0.6 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 6ccc4971b0..8f08f4b183 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 1ee436c075..329f641c78 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-backend +## 1.7.2-next.2 + +### Patch Changes + +- e716946103: Updated usage of the lifecycle service. +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + - @backstage/plugin-search-common@1.2.1 + ## 1.7.2-next.1 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 2bf0429932..cebd91932b 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.7.2-next.1", + "version": "1.7.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 7ea2f35c98..b5dc4e29e8 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-common +## 1.0.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + ## 1.0.11-next.0 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index f5c91f3697..2ba16c3d2a 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.11-next.0", + "version": "1.0.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index 13b1364d66..f8ff5a85b8 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.0.7-next.1 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index e72331539d..9f1e310508 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.7-next.1", + "version": "0.0.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index dcdbe96b91..d45fa8f234 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-graph +## 0.2.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.27-next.1 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 9ff0c8e92a..aee919241c 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.27-next.1", + "version": "0.2.27-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 5d4581212a..ee49cb0c3e 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-graphql +## 0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + ## 0.3.18-next.0 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 2f68052900..e66e0e0db2 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.18-next.0", + "version": "0.3.18-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 3f0711c721..9c74c13c88 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-import +## 0.9.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.9.5-next.1 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 36351746e5..a128aedfd8 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.5-next.1", + "version": "0.9.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index b01d88ae26..8d5667e4a6 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-node +## 1.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + ## 1.3.3-next.1 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 7874e36072..70071dcaea 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.3-next.1", + "version": "1.3.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 7f657f418f..662b57550a 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-react +## 1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + ## 1.3.0-next.1 ### Minor Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 705c1b544a..c3e6cdda46 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.3.0-next.1", + "version": "1.3.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 588bfd40cd..204df92577 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog +## 1.8.0-next.2 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 1.8.0-next.1 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 333d621d40..c5e2c675c9 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.8.0-next.1", + "version": "1.8.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 811df4adcb..6516506197 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-cicd-statistics@0.1.17-next.2 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 32c33e207a..2c79050e98 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.11-next.1", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index a09c2b3339..5dcd054002 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cicd-statistics +## 0.1.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.17-next.1 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 09ff03a4c7..795d8a6c8f 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.17-next.1", + "version": "0.1.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index c3b50931e8..701b6f5a86 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-circleci +## 0.3.15-next.2 + +### Patch Changes + +- 1616e06047: Making workflow a link +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.3.15-next.1 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 6e370c5def..b72b344eeb 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.15-next.1", + "version": "0.3.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index e69f59d9bf..2b2c262778 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-cloudbuild +## 0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.3.15-next.1 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index f80944b683..c1ac873f30 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.15-next.1", + "version": "0.3.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 84c51e3f43..5264e35a96 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-code-climate +## 0.1.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.15-next.1 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 9783ee7583..9146f3e118 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.15-next.1", + "version": "0.1.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 4d6a69c494..a5e6acae94 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-code-coverage-backend +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 1d3ae89cc3..f9bcefbd5d 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.8-next.1", + "version": "0.2.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index f787ac85aa..5064067470 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-code-coverage +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index d336d9324f..fd15272e38 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.8-next.1", + "version": "0.2.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index a89f49dc62..d07630cadf 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-codescene +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 6f763d529c..4249e11064 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index a8b4640584..21f079f591 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-config-schema +## 0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + ## 0.1.38-next.0 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index f7bb416f22..95221632e6 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.38-next.0", + "version": "0.1.38-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 7c69958dde..05d55f3bfe 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-cost-insights +## 0.12.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-cost-insights-common@0.1.1 + ## 0.12.4-next.1 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index 6e2bb01ef9..02a86793b0 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.4-next.1", + "version": "0.12.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 60be881c47..e403cf500c 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-dynatrace +## 2.0.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 2.0.0-next.1 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index c7656c52de..4cf4a84c33 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "2.0.0-next.1", + "version": "2.0.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md new file mode 100644 index 0000000000..aa1e41a299 --- /dev/null +++ b/plugins/entity-validation/CHANGELOG.md @@ -0,0 +1,19 @@ +# @backstage/plugin-entity-validation + +## 0.1.0-next.0 + +### Minor Changes + +- d34b3267f9: First implementation for the entity validation UI. For more information refer to its `README.md`. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index 3ff4f0ad5c..6a00e4ad16 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index b3431b3510..31596ba402 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 1925781020..bf06d46648 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 12bc4a0798..83fadeba7b 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 6520ed83ca..12420646ae 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 182d5633ed..6808429921 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 6a18b548e8..04e6248a5f 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 4d1857f4d6..e05890268c 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 8765f7777d..59cded8497 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index d15c3c82ce..88fe36262b 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-github +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/config@1.0.6 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index aa2f6b26fb..6d1fb5b412 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 4e7598b084..4265fa2c71 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/config@1.0.6 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index bfca24f6bc..ad0b497421 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index d495725662..713df91935 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.3-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 8032c98031..9df1f423e1 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 1d5927c387..1d3ae288b4 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend +## 0.2.3-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-events-node@0.2.3-next.2 + - @backstage/config@1.0.6 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index d120ae892b..1154fc0633 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index ef0d97ad18..99423d1f4a 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-node +## 0.2.3-next.2 + +### Patch Changes + +- 19d4abf72c: Make `EventParams` typed for implementing tidier event handling. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + ## 0.2.3-next.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 2cfff749e3..e1b784c6c4 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.3-next.1", + "version": "0.2.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index e3379a0082..d2212665fd 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @internal/plugin-todo-list-backend +## 1.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 1.0.10-next.1 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 11973d8f2a..5cda8b5f52 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.10-next.1", + "version": "1.0.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 17c56cc5d1..6b0da992bc 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/plugin-todo-list +## 1.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 1.0.10-next.0 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index fe4ac8d1c3..7d4378b51f 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.10-next.0", + "version": "1.0.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index e9a25933de..80503f396a 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-explore-backend +## 0.0.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.1 + ## 0.0.4-next.1 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 8356240641..77b6b05374 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.4-next.1", + "version": "0.0.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index dfa262e63d..58f14ca14d 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-explore +## 0.4.0-next.2 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-explore-react@0.0.25 + - @backstage/plugin-search-common@1.2.1 + ## 0.4.0-next.1 ### Minor Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 8a6b856262..888040e1cb 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.0-next.1", + "version": "0.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 73f7de642f..c4660e5479 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-firehydrant +## 0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.32-next.1 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 4b40c86c3c..8edcade92b 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.32-next.1", + "version": "0.1.32-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index c0987cd461..1e906085e4 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-fossa +## 0.2.47-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.47-next.1 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 444471315c..a93d3b3922 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.47-next.1", + "version": "0.2.47-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index a1f2b5a0c7..5134ae8c3f 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gcalendar +## 0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.3.11-next.0 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 48e78f175a..5c84ebe6cb 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.11-next.0", + "version": "0.3.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index 0a8693a233..405a344b28 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gcp-projects +## 0.3.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.34-next.0 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index a3894760cf..54bfc85dd2 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.34-next.0", + "version": "0.3.34-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 707f7be510..3fee0c167b 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-git-release-manager +## 0.3.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + ## 0.3.28-next.0 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 7ec7d5806c..171a909b74 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.28-next.0", + "version": "0.3.28-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 160a0f8a22..5ae3bafb5d 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-github-actions +## 0.5.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.5.15-next.1 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 509255d343..5165820d62 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.15-next.1", + "version": "0.5.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 68156abda2..9c3d9c85e4 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-github-deployments +## 0.1.46-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.46-next.1 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index ec596194c7..17d6239b90 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.46-next.1", + "version": "0.1.46-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 38c0387429..35aa080016 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-issues +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 284518bad3..574968d61a 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.4-next.1", + "version": "0.2.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index fa4123887b..8dd45cd956 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index e947557825..163b7a1967 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.9-next.1", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index fa835e2131..4ade8515ff 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gitops-profiles +## 0.3.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.33-next.0 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index 3f0f3614cd..f43e7bb14b 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.33-next.0", + "version": "0.3.33-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index adecc5b5f1..01037953b0 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-gocd +## 0.1.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.21-next.1 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index f659fe4525..f89a11047d 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.21-next.1", + "version": "0.1.21-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 1be4fe30b5..68d6fa8e25 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphiql +## 0.2.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.2.47-next.0 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index b5c868d86d..15d15a38ca 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.47-next.0", + "version": "0.2.47-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 4686d4b103..28efff9546 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-backend +## 0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-catalog-graphql@0.3.18-next.1 + ## 0.1.32-next.1 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index d3b4fc8707..0f44248997 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.32-next.1", + "version": "0.1.32-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md new file mode 100644 index 0000000000..3712169ea1 --- /dev/null +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -0,0 +1,16 @@ +# @backstage/plugin-graphql-voyager + +## 0.1.0-next.0 + +### Minor Changes + +- d1fb4b7bf1: Add the new GraphQL Voyager tool as a plugin for backstage, expose necessary API and components needed for it. + + For more information on how to use this plugin and configure it, please navigate to the [README](https://github.com/backstage/backstage/tree/master/plugins/graphql-voyager/README.md) of the plugin. + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 02e8ec95ca..b20d045640 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index e9698a5cde..400ca51ae9 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-home +## 0.4.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.4.31-next.1 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 8f6a4f755f..6923b87c83 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.31-next.1", + "version": "0.4.31-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index d0edef70c6..a12bd0a010 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-ilert +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 459f823255..757b91f78e 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.4-next.1", + "version": "0.2.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 9cbcc43f5f..00f1cdfe1b 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-jenkins-backend +## 0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-jenkins-common@0.1.13-next.1 + - @backstage/plugin-permission-common@0.7.3 + ## 0.1.32-next.1 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 43614edea2..d3107cba77 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.32-next.1", + "version": "0.1.32-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 71719e20e2..75a1470ed0 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-jenkins-common +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index c2d15a7da6..b37d1cfb8d 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 045236e8aa..291f175013 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-jenkins +## 0.7.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-jenkins-common@0.1.13-next.1 + ## 0.7.14-next.1 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 2fc0ed67ca..d2c629136b 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.14-next.1", + "version": "0.7.14-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index a07fb79fae..262cca0397 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kafka-backend +## 0.2.35-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.35-next.1 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 623764c147..f0c8d10bde 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.35-next.1", + "version": "0.2.35-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 573a28a957..74d5b82c97 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kafka +## 0.3.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.3.15-next.1 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 7583fd06b5..546cf976d5 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.15-next.1", + "version": "0.3.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index fe00c7f8a1..a8726b238a 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-kubernetes-backend +## 0.9.3-next.2 + +### Patch Changes + +- 7ff81f7692: Kubernetes proxy endpoint now accepts content types that are not json +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-kubernetes-common@0.6.0-next.2 + ## 0.9.3-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 68225c489a..5b49d18543 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.9.3-next.1", + "version": "0.9.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 4f369bf289..cd4df4d54a 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-kubernetes-common +## 0.6.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + ## 0.6.0-next.1 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index 21f6480aa1..4a4e2a30bf 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.0-next.1", + "version": "0.6.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 2c375b8d0a..e30b168693 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kubernetes +## 0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-kubernetes-common@0.6.0-next.2 + ## 0.7.8-next.1 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 6c9c56db09..e51726b296 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.8-next.1", + "version": "0.7.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index e69de29bb2..d64d035fa3 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -0,0 +1,18 @@ +# @backstage/plugin-lighthouse-backend + +## 0.1.0-next.0 + +### Minor Changes + +- eef62546ce: Introduce Lighthouse Backend Plugin to run scheduled Lighthouse Audits + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-common@0.1.0-next.0 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index 560ed4e8f7..60b8570481 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-common/CHANGELOG.md b/plugins/lighthouse-common/CHANGELOG.md index e69de29bb2..189507371a 100644 --- a/plugins/lighthouse-common/CHANGELOG.md +++ b/plugins/lighthouse-common/CHANGELOG.md @@ -0,0 +1,12 @@ +# @backstage/plugin-lighthouse-common + +## 0.1.0-next.0 + +### Minor Changes + +- eef62546ce: Introduce @backstage/plugin-lighthouse-common with the API implementation + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 diff --git a/plugins/lighthouse-common/package.json b/plugins/lighthouse-common/package.json index 8dcc00960d..50281e17ba 100644 --- a/plugins/lighthouse-common/package.json +++ b/plugins/lighthouse-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-common", "description": "Common functionalities for lighthouse, to be shared between lighthouse and lighthouse-backend plugin", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index 1c54959f18..a79e4795e2 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-lighthouse +## 0.4.0-next.2 + +### Minor Changes + +- eef62546ce: Require @backstage/plugin-lighthouse-common package where API implementation moved to. + + **BREAKING**: the following types have been moved to @backstage/plugin-lighthouse-common: + + - `Audit` + - `AuditBase` + - `AuditCompleted` + - `AuditFailed` + - `AuditRunning` + - `FetchError` + - `LASListRequest` + - `LASListResponse` + - `LighthouseApi` + - `LighthouseCategoryAbbr` + - `LighthouseCategoryId` + - `LighthouseConfigSettings` + - `LighthouseRestApi` + - `TriggerAuditPayload` + - `Website` + - `WebsiteListResponse` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-lighthouse-common@0.1.0-next.0 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.3.15-next.1 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index bee2b66a54..c52858b666 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.3.15-next.1", + "version": "0.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 3f9352d0d2..78aadfc390 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 09d4afcd93..5fe39fd8a3 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.8-next.1", + "version": "0.2.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index 10a7d6131b..8858555c7c 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-newrelic +## 0.3.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.3.33-next.0 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 60f6019ccf..e02c690eff 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.33-next.0", + "version": "0.3.33-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 6400654730..6af5e01b9b 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-org-react +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index bf3fbe4050..6e939b1954 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index c4cd46928b..31c7843fa4 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org +## 0.6.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.6.5-next.1 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index ef9106808b..240e473b88 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.5-next.1", + "version": "0.6.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index c10c36ee38..f9424baaea 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-pagerduty +## 0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.5.8-next.1 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index a26ac1137f..df20b498ed 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.5.8-next.1", + "version": "0.5.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index afeec402d4..1e6ff6f307 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-periskop-backend +## 0.1.13-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index dc29122b8e..419d430fac 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.13-next.1", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 5d093e566f..eeabe21052 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-periskop +## 0.1.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.13-next.1 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index a35c7332b2..08d875e51f 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.13-next.1", + "version": "0.1.13-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 475ec1fa67..f8cb24795b 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-backend +## 0.5.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + ## 0.5.17-next.1 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index ef319d2e4b..b0b54f6b6e 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.17-next.1", + "version": "0.5.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 2c56e28584..51c27671db 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-permission-node +## 0.7.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + ## 0.7.5-next.1 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index e2de41927f..c43904fd00 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.5-next.1", + "version": "0.7.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index ee9c9940b1..c634e3c2e0 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-playlist-backend +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-playlist-common@0.1.4 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 211ef7f3c9..5cbce033b4 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index 8651137680..ea27ee40f3 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-playlist +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist-common@0.1.4 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 9954d9b45c..624fdbcd75 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.6-next.1", + "version": "0.1.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 1ccb8ba717..ad235f36e8 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-proxy-backend +## 0.2.36-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + ## 0.2.36-next.1 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 1d93d0eb4f..76440ce0a9 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.36-next.1", + "version": "0.2.36-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index 0995c42725..9e6955c033 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-rollbar-backend +## 0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + ## 0.1.39-next.1 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 8aadcde236..876c797a78 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.39-next.1", + "version": "0.1.39-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 8fab9cd0c6..1fe3b3d6ba 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-rollbar +## 0.4.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.4.15-next.1 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index e33ed45d20..2d65565015 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.15-next.1", + "version": "0.4.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 2ca4243b25..65121ebda8 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.2.17-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 6f2868d2f6..669f498c1e 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.17-next.1", + "version": "0.2.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 8fc899ef79..51a6a9b796 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-scaffolder-backend@1.11.0-next.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + ## 0.4.10-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 21e9c1f31c..1e4d881ef0 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.10-next.1", + "version": "0.4.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 7ad3b35da6..9a7df7e14b 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.1.2-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 2136a9055e..903ad54dc1 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.2-next.1", + "version": "0.1.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index d736daf17e..5c4acbd85c 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + ## 0.2.15-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index eb8598ac8f..7ae88b60e6 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.15-next.1", + "version": "0.2.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index b43edb7c73..d6db10f4ae 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder-backend +## 1.11.0-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-catalog-backend@1.7.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-catalog-node@1.3.3-next.2 + - @backstage/plugin-scaffolder-node@0.1.0-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + ## 1.11.0-next.1 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index e50ebba1b8..ccc586f55b 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.11.0-next.1", + "version": "1.11.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 4b7444994a..e1936292f9 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-common +## 1.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/types@1.0.2 + ## 1.2.5-next.0 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index bf8c32d5d1..3ec3528427 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.2.5-next.0", + "version": "1.2.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 19e00ac8b4..cd2ef0259e 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + ## 0.1.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index dc93306107..ce82f57f5f 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.0-next.1", + "version": "0.1.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 384680c672..51fa1abc63 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder-react +## 1.1.0-next.2 + +### Minor Changes + +- 5555e17313: refactor `createAsyncValidators` to be recursive to ensure validators are called in nested schemas. + +### Patch Changes + +- b46f385eff: scaffolder/next: Implementing a simple `OngoingTask` page +- ccbf91051b: bump `@rjsf` `v5` dependencies to 5.1.0 +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + ## 1.1.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 844dc97e95..e26bd973d5 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.1.0-next.1", + "version": "1.1.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 9fc78b0416..37da3b63e1 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder +## 1.11.0-next.2 + +### Patch Changes + +- b46f385eff: scaffolder/next: Implementing a simple `OngoingTask` page +- ccbf91051b: bump `@rjsf` `v5` dependencies to 5.1.0 +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-scaffolder-common@1.2.5-next.1 + ## 1.11.0-next.1 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index d52e8e332a..86f9100deb 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.11.0-next.1", + "version": "1.11.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index dddb776afc..71dccfef4f 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 1.1.3-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 05395fbdb2..2eb85f5f2c 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.3-next.1", + "version": "1.1.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 907235f958..1d17c6707c 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 0.5.3-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 299c66a0bd..7883475f34 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.3-next.1", + "version": "0.5.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 9a5b76131d..bf9306cb1d 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-node +## 1.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + ## 1.1.3-next.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 9c4f3842ed..1bf73971d1 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.3-next.1", + "version": "1.1.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 33fa09cb39..c31930c867 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend +## 1.2.3-next.2 + +### Patch Changes + +- 1b30c9a0f7: Change the router's response to include the error message instead of its object type in case it fails during a search query because the messages have more info. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 1.2.3-next.1 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index cc903a5b8d..31594bc8af 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.3-next.1", + "version": "1.2.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index f5074bee18..fa58979796 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-react +## 1.5.0-next.1 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.1 + ## 1.5.0-next.0 ### Minor Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 4e9dd292ba..d353189add 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.5.0-next.0", + "version": "1.5.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 4e4d5de406..7853a44abb 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-search +## 1.1.0-next.2 + +### Patch Changes + +- 66e2aab4c4: Updated colors for each tab used on search modal, to improve color contrast. Aria label added to tabs wrapper component. `disableRipple` property on the `Tab` component removed to improve keyboard navigation indicator. +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 1.1.0-next.1 ### Minor Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 6acb85af9b..c2f635f762 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.1.0-next.1", + "version": "1.1.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index b19a4b29d9..922b06c8d8 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-sentry +## 0.5.0-next.2 + +### Minor Changes + +- 6a8d6b9a0c: Add option to filter issues based on the time it was triggered + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.4.8-next.1 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index f9b5dad4b8..e757ff25a4 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.4.8-next.1", + "version": "0.5.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 224ad0a78d..94baec18aa 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-shortcuts +## 0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + ## 0.3.7-next.0 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 3a955b95e0..61b48b1c55 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.7-next.0", + "version": "0.3.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 4f568d7442..6fb7414acb 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube-backend +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.1.7-next.1 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 785911f6c0..99c0a8b486 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.7-next.1", + "version": "0.1.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index 41b5d5b371..b938ce8b37 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-sonarqube-react +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-plugin-api@1.3.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index ebf75572ec..53837a47cf 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.2-next.0", + "version": "0.1.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index a419f321e3..e51e0a65ac 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-sonarqube +## 0.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-sonarqube-react@0.1.2-next.1 + ## 0.6.3-next.1 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 8c5d706db2..80dd578523 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.3-next.1", + "version": "0.6.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 401f927bd9..c5de65a3d3 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-splunk-on-call +## 0.4.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.4.4-next.1 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 0700dacf92..097cc1c6fd 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.4-next.1", + "version": "0.4.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index 5a8f26be5f..aac07808c9 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/plugin-search-common@1.2.1 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index ca8e4a2a55..e40e3e846a 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.11-next.1", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 00ed8a363c..f80e350a03 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-stack-overflow +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-home@0.4.31-next.2 + - @backstage/plugin-search-common@1.2.1 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index d073d519c1..c9fbe7e7a3 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.11-next.1", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 64ceb662d2..28a8ae4e05 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.26-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + ## 0.1.26-next.1 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index f7c1b6563b..d3a3260f87 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.26-next.1", + "version": "0.1.26-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 42e4c273a0..bef4e4c472 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-tech-insights-backend +## 0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + - @backstage/plugin-tech-insights-node@0.4.0-next.2 + ## 0.5.8-next.1 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index c04ce8f483..2b32f72763 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.8-next.1", + "version": "0.5.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index 867a242826..aa058fdc3b 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-node +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + ## 0.4.0-next.1 ### Minor Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 79f8846f51..7f49679030 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.0-next.1", + "version": "0.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 907fc50495..37e46a4b5a 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-tech-insights +## 0.3.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-tech-insights-common@0.2.10-next.0 + ## 0.3.7-next.1 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index f4515d94b0..e874d2ba30 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.7-next.1", + "version": "0.3.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index f6983f4875..37aa1e8336 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-tech-radar +## 0.6.1-next.1 + +### Patch Changes + +- acf6c8c10b: Deprecate `RadarEntry.url` - use `RadarEntry.links` instead + + ```diff + - url: 'https://www.javascript.com/', + key: 'javascript', + id: 'javascript', + title: 'JavaScript', + quadrant: 'languages', + links: [ + + { + + url: 'https://www.javascript.com/', + + title: 'Learn more', + + }, + ], + ``` + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/theme@0.2.16 + ## 0.6.1-next.0 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 78b0afd963..2aad00f224 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.1-next.0", + "version": "0.6.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index bba46a23c2..9afcf3aace 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-catalog@1.8.0-next.2 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/test-utils@1.2.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + ## 1.0.10-next.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 82d5913a2e..1ad762a09d 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.10-next.1", + "version": "1.0.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 04c7a54f20..dbad0b17b1 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-backend +## 1.5.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-node@1.4.6-next.2 + ## 1.5.3-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index dd16050e5d..9c8ce22bef 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.3-next.1", + "version": "1.5.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index aab943c78f..22630158f1 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + ## 1.0.10-next.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 1b92e15c16..154832f3fd 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.10-next.1", + "version": "1.0.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 6547d5db59..a6d32d8d9f 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-node +## 1.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-aws-node@0.1.1 + - @backstage/plugin-search-common@1.2.1 + ## 1.4.6-next.1 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index d9b7b72d91..0a6ffd721b 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.4.6-next.1", + "version": "1.4.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 0403406407..34617eb3f5 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-react +## 1.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/version-bridge@1.0.3 + ## 1.1.3-next.1 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 01bf2ceec4..29587c3e1e 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.3-next.1", + "version": "1.1.3-next.2", "publishConfig": { "access": "public", "alphaTypes": "dist/index.alpha.d.ts", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 01ad074f1c..352114d77d 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-techdocs +## 1.5.0-next.2 + +### Patch Changes + +- 66e2aab4c4: `ListItem` wrapper component moved to `SearchResultListItemExtension` for all `*SearchResultListItems` that are exported as extensions. This is to make sure the list only contains list elements. + + Note: If you have implemented a custom result list item, we recommend you to remove the list item wrapper to avoid nested `
  • ` elements. + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + ## 1.5.0-next.1 ### Minor Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 788b82cfa5..5e113f3e7f 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.5.0-next.1", + "version": "1.5.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 5009bb66b1..9f44d33d18 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-todo-backend +## 0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/catalog-client@1.3.1-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/integration@1.4.2 + ## 0.1.39-next.1 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index b7eae2bf52..6120e76a5e 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.39-next.1", + "version": "0.1.39-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index c5ef6bddfa..49a8241e30 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-todo +## 0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.2.17-next.1 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index a6ed7e591e..d337834872 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.17-next.1", + "version": "0.2.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 25d3b6b935..20a7f0c6e5 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-user-settings-backend +## 0.1.6-next.2 + +### Patch Changes + +- 0ff03319be: Updated usage of `createBackendPlugin`. +- 4a6f38a535: Added a Backend System plugin feature +- Updated dependencies + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + ## 0.1.6-next.1 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 97570989f6..b77050a5af 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.6-next.1", + "version": "0.1.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 51de164e53..478b60b6da 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-user-settings +## 0.6.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/types@1.0.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.6.3-next.1 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index ad046124c4..319ce98fee 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.6.3-next.1", + "version": "0.6.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index d81f582d2c..2c7715cd73 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-vault-backend +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@0.1.34-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/backend-tasks@0.4.3-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + ## 0.2.8-next.1 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 58a16853e6..88545aaeb1 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.8-next.1", + "version": "0.2.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index 7e661f0a8a..60fe5c4c8b 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-vault +## 0.1.9-next.2 + +### Patch Changes + +- fd7a77b9c4: Surface additional context and details to the Backstage UI when the Vault plugin encounters non-successful HTTP responses from the Vault API. +- Updated dependencies + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-react@1.3.0-next.2 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 9d59cba50a..15bae8c3ad 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.9-next.1", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index e73dbc7e64..af4665e980 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-xcmetrics +## 0.2.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.4-next.1 + - @backstage/core-plugin-api@1.3.0 + - @backstage/errors@1.1.4 + - @backstage/theme@0.2.16 + ## 0.2.35-next.0 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index fc85d7b050..775e884f4b 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.35-next.0", + "version": "0.2.35-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", From 30966a2f3e1d6f2f399d8988f4b3bba3329d7798 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 7 Feb 2023 21:28:26 +0100 Subject: [PATCH 71/98] chore: fix the triple-beam workaround Signed-off-by: blam --- packages/backend-common/package.json | 1 - packages/repo-tools/src/commands/type-deps/type-deps.ts | 8 -------- yarn.lock | 8 -------- 3 files changed, 17 deletions(-) diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 3152cd0b28..9619ef25f8 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -53,7 +53,6 @@ "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", - "@types/triple-beam": "^1.3.2", "@types/webpack-env": "^1.15.2", "archiver": "^5.0.2", "aws-sdk": "^2.840.0", diff --git a/packages/repo-tools/src/commands/type-deps/type-deps.ts b/packages/repo-tools/src/commands/type-deps/type-deps.ts index 852cec34d2..4f8e5e5529 100644 --- a/packages/repo-tools/src/commands/type-deps/type-deps.ts +++ b/packages/repo-tools/src/commands/type-deps/type-deps.ts @@ -196,14 +196,6 @@ function findTypeDepErrors(typeDeps: string[], pkg: Package) { } for (const dep of deps) { - // Remove this once the logform issue has been fixed. - // https://github.com/winstonjs/logform/issues/242 - if ( - pkg.packageJson.name === '@backstage/backend-common' && - dep === '@types/triple-beam' - ) { - continue; - } errors.push( mkErr('WrongDepError', `Should be dev dep ${dep}`, { dep, diff --git a/yarn.lock b/yarn.lock index 1621cdc5b1..7261a68b88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3457,7 +3457,6 @@ __metadata: "@types/stoppable": ^1.1.0 "@types/supertest": ^2.0.8 "@types/tar": ^6.1.1 - "@types/triple-beam": ^1.3.2 "@types/webpack-env": ^1.15.2 "@types/yauzl": ^2.10.0 archiver: ^5.0.2 @@ -15482,13 +15481,6 @@ __metadata: languageName: node linkType: hard -"@types/triple-beam@npm:^1.3.2": - version: 1.3.2 - resolution: "@types/triple-beam@npm:1.3.2" - checksum: dd7b4a563fb710abc992e5d59eac481bed9e303fada2e276e37b00be31c392e03300ee468e57761e616512872e77935f92472877d0704a19688d15a726cee17b - languageName: node - linkType: hard - "@types/trusted-types@npm:*": version: 2.0.2 resolution: "@types/trusted-types@npm:2.0.2" From 8ab66746c899379c4cc591263e205fb140988539 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Tue, 7 Feb 2023 17:16:31 -0500 Subject: [PATCH 72/98] Add yaml spec. Signed-off-by: Aramis Sennyey --- plugins/catalog-backend/openapi.yaml | 755 +++++++++++++++++++++++++++ 1 file changed, 755 insertions(+) create mode 100644 plugins/catalog-backend/openapi.yaml diff --git a/plugins/catalog-backend/openapi.yaml b/plugins/catalog-backend/openapi.yaml new file mode 100644 index 0000000000..a058831d55 --- /dev/null +++ b/plugins/catalog-backend/openapi.yaml @@ -0,0 +1,755 @@ +components: + examples: {} + headers: {} + parameters: {} + requestBodies: {} + responses: {} + schemas: + RefreshOptions: + properties: + authorizationToken: + type: string + entityRef: + type: string + description: The reference to a single entity that should be refreshed + required: + - entityRef + type: object + description: Options for requesting a refresh of entities in the catalog. + JsonObject: + properties: {} + type: object + description: A type representing all allowed JSON object values. + MapStringString: + properties: {} + type: object + additionalProperties: + type: string + description: Construct a type with a set of properties K of type T + EntityLink: + properties: + type: + type: string + description: An optional value to categorize links into specific groups + icon: + type: string + description: An optional semantic key that represents a visual icon. + title: + type: string + description: An optional descriptive title for the link. + url: + type: string + description: The url to the external site, document, etc. + required: + - url + type: object + description: A link to external information that is related to the entity. + EntityMeta: + allOf: + - $ref: '#/components/schemas/JsonObject' + - properties: + links: + items: + $ref: '#/components/schemas/EntityLink' + type: array + description: A list of external hyperlinks related to the entity. + tags: + items: + type: string + type: array + description: |- + A list of single-valued strings, to for example classify catalog entities in + various ways. + annotations: + $ref: '#/components/schemas/MapStringString' + labels: + $ref: '#/components/schemas/MapStringString' + description: + type: string + description: |- + A short (typically relatively few words, on one line) description of the + entity. + title: + type: string + description: |- + A display name of the entity, to be presented in user interfaces instead + of the `name` property above, when available. + This field is sometimes useful when the `name` is cumbersome or ends up + being perceived as overly technical. The title generally does not have + as stringent format requirements on it, so it may contain special + characters and be more explanatory. Do keep it very short though, and + avoid situations where a title can be confused with the name of another + entity, or where two entities share a title. + Note that this is only for display purposes, and may be ignored by some + parts of the code. Entity references still always make use of the `name` + property, not the title. + namespace: + type: string + description: The namespace that the entity belongs to. + name: + type: string + description: |- + The name of the entity. + Must be unique within the catalog at any given point in time, for any + given namespace + kind pair. This value is part of the technical + identifier of the entity, and as such it will appear in URLs, database + tables, entity references, and similar. It is subject to restrictions + regarding what characters are allowed. + If you want to use a different, more human readable string with fewer + restrictions on it in user interfaces, see the `title` field below. + etag: + type: string + description: |- + An opaque string that changes for each update operation to any part of + the entity, including metadata. + This field can not be set by the user at creation time, and the server + will reject an attempt to do so. The field will be populated in read + operations. The field can (optionally) be specified when performing + update or delete operations, and the server will then reject the + operation if it does not match the current stored value. + uid: + type: string + description: |- + A globally unique ID for the entity. + This field can not be set by the user at creation time, and the server + will reject an attempt to do so. The field will be populated in read + operations. The field can (optionally) be specified when performing + update or delete operations, but the server is free to reject requests + that do so in such a way that it breaks semantics. + required: + - name + type: object + description: Metadata fields common to all versions/kinds of entity. + EntityRelation: + properties: + targetRef: + type: string + description: The entity ref of the target of this relation. + type: + type: string + description: The type of the relation. + required: + - targetRef + - type + type: object + description: A relation of a specific type to another entity in the catalog. + Entity: + properties: + relations: + items: + $ref: '#/components/schemas/EntityRelation' + type: array + description: The relations that this entity has with other entities. + spec: + $ref: '#/components/schemas/JsonObject' + metadata: + $ref: '#/components/schemas/EntityMeta' + kind: + type: string + description: The high level entity type being described. + apiVersion: + type: string + description: |- + The version of specification format for this particular entity that + this is written against. + required: + - metadata + - kind + - apiVersion + type: object + description: The parts of the format that's common to all versions/kinds of entity. + EntityAncestryResponse: + properties: + items: + items: + properties: + parentEntityRefs: + items: + type: string + type: array + entity: + $ref: '#/components/schemas/Entity' + required: + - parentEntityRefs + - entity + type: object + type: array + rootEntityRef: + type: string + required: + - items + - rootEntityRef + type: object + EntitiesBatchResponse: + properties: + items: + items: + allOf: + - $ref: '#/components/schemas/Entity' + nullable: true + type: array + description: |- + The list of entities, in the same order as the refs in the request. Entries + that are null signify that no entity existed with that ref. + required: + - items + type: object + EntityFacets: + type: object + properties: + value: + type: string + count: + type: number + description: Construct a type with a set of properties K of type T + EntityFacetsResponse: + properties: {} + type: object + additionalProperties: + $ref: '#/components/schemas/EntityFacets' + required: + - facets + Location: + properties: + target: + type: string + type: + type: string + id: + type: string + required: + - target + - type + - id + type: object + description: Entity location for a specific entity. + LocationSpec: + properties: + presence: + type: string + enum: + - optional + - required + target: + type: string + type: + type: string + required: + - target + - type + type: object + description: Holds the entity location information. + AnalyzeLocationExistingEntity: + properties: + entity: + $ref: '#/components/schemas/Entity' + isRegistered: + type: boolean + location: + $ref: '#/components/schemas/LocationSpec' + required: + - entity + - isRegistered + - location + type: object + description: |- + If the folder pointed to already contained catalog info yaml files, they are + read and emitted like this so that the frontend can inform the user that it + located them and can make sure to register them as well if they weren't + already + RecursivePartial_Entity_: + properties: + apiVersion: + type: string + description: |- + The version of specification format for this particular entity that + this is written against. + kind: + type: string + description: The high level entity type being described. + metadata: + $ref: '#/components/schemas/EntityMeta' + spec: + $ref: '#/components/schemas/JsonObject' + relations: + items: + $ref: '#/components/schemas/EntityRelation' + type: array + description: The relations that this entity has with other entities. + type: object + description: Makes all keys of an entire hierarchy optional. + AnalyzeLocationEntityField: + properties: + description: + type: string + description: |- + A text to show to the user to inform about the choices made. Like, it could say + "Found a CODEOWNERS file that covers this target, so we suggest leaving this + field empty; which would currently make it owned by X" where X is taken from the + codeowners file. + value: + type: string + nullable: true + state: + type: string + enum: + - analysisSuggestedValue + - analysisSuggestedNoValue + - needsUserInput + description: The outcome of the analysis for this particular field + field: + type: string + description: |- + e.g. "spec.owner"? The frontend needs to know how to "inject" the field into the + entity again if the user wants to change it + required: + - description + - value + - state + - field + type: object + AnalyzeLocationGenerateEntity: + properties: + fields: + items: + $ref: '#/components/schemas/AnalyzeLocationEntityField' + type: array + entity: + $ref: '#/components/schemas/RecursivePartial_Entity_' + required: + - fields + - entity + type: object + description: |- + This is some form of representation of what the analyzer could deduce. + We should probably have a chat about how this can best be conveyed to + the frontend. It'll probably contain a (possibly incomplete) entity, plus + enough info for the frontend to know what form data to show to the user + for overriding/completing the info. + AnalyzeLocationResponse: + properties: + generateEntities: + items: + $ref: '#/components/schemas/AnalyzeLocationGenerateEntity' + type: array + existingEntityFiles: + items: + $ref: '#/components/schemas/AnalyzeLocationExistingEntity' + type: array + required: + - generateEntities + - existingEntityFiles + type: object + LocationInput: + properties: + type: + type: string + target: + type: string + presence: + type: string + enum: + - optional + - required + required: + - type + - target + - presence + type: object + SerializedError: + allOf: + - $ref: '#/components/schemas/JsonObject' + - properties: + code: + type: string + description: A custom code (not necessarily the same as an HTTP response code); may not be present + stack: + type: string + description: A stringified stack trace; may not be present + message: + type: string + description: The message of the exception that was thrown + name: + type: string + description: The name of the exception that was thrown + required: + - message + - name + type: object + description: The serialized form of an Error. + securitySchemes: + JWT: + type: http + scheme: bearer + bearerFormat: JWT +info: + title: '@backstage/plugin-catalog-backend' + version: 1.6.0-next.1 + description: The Backstage backend plugin that provides the Backstage catalog + license: + name: Apache-2.0 + contact: {} +openapi: 3.0.3 +paths: + /refresh: + post: + operationId: RefreshEntity + responses: + '200': + description: Refreshed + security: + - JWT: [] + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RefreshOptions' + /entities: + get: + operationId: GetEntities + responses: + '200': + description: '' + content: + application/json: + schema: + items: + $ref: '#/components/schemas/Entity' + type: array + security: + - JWT: [] + parameters: + - in: query + name: filter + required: false + schema: + type: string + - in: query + name: fields + required: false + schema: + type: string + - in: query + name: offset + required: false + schema: + type: string + - in: query + name: limit + required: false + schema: + type: string + - in: query + name: after + required: false + schema: + type: string + /entities/by-uid/{uid}: + get: + operationId: GetEntityByUid + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + security: + - JWT: [] + parameters: + - in: path + name: uid + required: true + schema: + type: string + delete: + operationId: DeleteEntityByUid + responses: + '204': + description: Deleted successfully. + security: + - JWT: [] + parameters: + - in: path + name: uid + required: true + schema: + type: string + + /entities/by-name/{kind}/{namespace}/{name}: + get: + operationId: GetEntityByName + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + security: + - JWT: [] + parameters: + - in: path + name: kind + required: true + schema: + type: string + - in: path + name: namespace + required: true + schema: + type: string + - in: path + name: name + required: true + schema: + type: string + /entities/by-name/{kind}/{namespace}/{name}/ancestry: + get: + operationId: GetEntityAncestryByName + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntityAncestryResponse' + security: + - JWT: [] + parameters: + - in: path + name: kind + required: true + schema: + type: string + - in: path + name: namespace + required: true + schema: + type: string + - in: path + name: name + required: true + schema: + type: string + /entities/by-refs: + post: + operationId: GetEntitiesByRefs + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntitiesBatchResponse' + security: + - JWT: [] + parameters: + - in: query + name: fields + required: false + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + items: + type: string + type: array + /entity-facets: + get: + operationId: GetEntityFacets + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntityFacetsResponse' + security: + - JWT: [] + parameters: + - in: query + name: facet + required: true + schema: + type: string + - in: query + name: filter + required: false + schema: + type: string + /locations: + post: + operationId: CreateLocation + responses: + '200': + description: Ok + content: + application/json: + schema: + properties: + exists: + type: boolean + entities: + items: + $ref: '#/components/schemas/Entity' + type: array + location: + $ref: '#/components/schemas/Location' + required: + - entities + - location + type: object + security: + - JWT: [] + parameters: + - in: query + name: dryRun + required: false + schema: + type: boolean + requestBody: + required: true + content: + application/json: + schema: + properties: + presence: + type: string + enum: + - required + - optional + target: + type: string + type: + type: string + required: + - presence + - target + - type + type: object + get: + operationId: GetLocations + responses: + '200': + description: Ok + content: + application/json: + schema: + items: + properties: + data: + $ref: '#/components/schemas/Location' + required: + - data + type: object + type: array + security: + - JWT: [] + parameters: [] + /locations/{id}: + get: + operationId: GetLocation + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + security: + - JWT: [] + parameters: + - in: path + name: id + required: true + schema: + type: string + delete: + operationId: DeleteLocation + responses: + '204': + description: No content + security: + - JWT: [] + parameters: + - in: path + name: id + required: true + schema: + type: string + /analyze-location: + post: + operationId: AnalyzeLocation + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeLocationResponse' + security: + - JWT: [] + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + properties: + catalogFileName: + type: string + location: + $ref: '#/components/schemas/LocationInput' + required: + - catalogFileName + - location + type: object + /validate-entity: + post: + operationId: ValidateEntity + responses: + '200': + description: Ok + content: + application/json: + schema: + anyOf: + - properties: + errors: + $ref: '#/components/schemas/SerializedError' + required: + - errors + type: object + - properties: + errors: + items: + $ref: '#/components/schemas/SerializedError' + type: array + required: + - errors + type: object + security: + - JWT: [] + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + properties: + location: + type: string + entity: + $ref: '#/components/schemas/Entity' + required: + - location + - entity + type: object +servers: + - url: / From 3951fa0b31a09d20d959768450c0bc1e3bf1e00f Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Tue, 7 Feb 2023 17:37:56 -0500 Subject: [PATCH 73/98] Use 3.1 Signed-off-by: Aramis Sennyey --- plugins/catalog-backend/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/openapi.yaml b/plugins/catalog-backend/openapi.yaml index a058831d55..fdd1532f89 100644 --- a/plugins/catalog-backend/openapi.yaml +++ b/plugins/catalog-backend/openapi.yaml @@ -389,7 +389,7 @@ info: license: name: Apache-2.0 contact: {} -openapi: 3.0.3 +openapi: 3.1.0 paths: /refresh: post: From 1fd29bffc72cf4984af87af5e3a8406226c7f8ac Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Tue, 7 Feb 2023 17:42:40 -0500 Subject: [PATCH 74/98] Formatting and make security optional Signed-off-by: Aramis Sennyey --- plugins/catalog-backend/openapi.yaml | 31 +++++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/plugins/catalog-backend/openapi.yaml b/plugins/catalog-backend/openapi.yaml index fdd1532f89..beef95b0b7 100644 --- a/plugins/catalog-backend/openapi.yaml +++ b/plugins/catalog-backend/openapi.yaml @@ -1,3 +1,11 @@ +openapi: 3.1.0 +info: + title: '@backstage/plugin-catalog-backend' + version: '1' + description: The Backstage backend plugin that provides the Backstage catalog + license: + name: Apache-2.0 + contact: {} components: examples: {} headers: {} @@ -382,14 +390,7 @@ components: type: http scheme: bearer bearerFormat: JWT -info: - title: '@backstage/plugin-catalog-backend' - version: 1.6.0-next.1 - description: The Backstage backend plugin that provides the Backstage catalog - license: - name: Apache-2.0 - contact: {} -openapi: 3.1.0 + paths: /refresh: post: @@ -398,6 +399,7 @@ paths: '200': description: Refreshed security: + - {} - JWT: [] parameters: [] requestBody: @@ -419,6 +421,7 @@ paths: $ref: '#/components/schemas/Entity' type: array security: + - {} - JWT: [] parameters: - in: query @@ -457,6 +460,7 @@ paths: schema: $ref: '#/components/schemas/Entity' security: + - {} - JWT: [] parameters: - in: path @@ -470,6 +474,7 @@ paths: '204': description: Deleted successfully. security: + - {} - JWT: [] parameters: - in: path @@ -489,6 +494,7 @@ paths: schema: $ref: '#/components/schemas/Entity' security: + - {} - JWT: [] parameters: - in: path @@ -517,6 +523,7 @@ paths: schema: $ref: '#/components/schemas/EntityAncestryResponse' security: + - {} - JWT: [] parameters: - in: path @@ -545,6 +552,7 @@ paths: schema: $ref: '#/components/schemas/EntitiesBatchResponse' security: + - {} - JWT: [] parameters: - in: query @@ -571,6 +579,7 @@ paths: schema: $ref: '#/components/schemas/EntityFacetsResponse' security: + - {} - JWT: [] parameters: - in: query @@ -606,6 +615,7 @@ paths: - location type: object security: + - {} - JWT: [] parameters: - in: query @@ -650,6 +660,7 @@ paths: type: object type: array security: + - {} - JWT: [] parameters: [] /locations/{id}: @@ -663,6 +674,7 @@ paths: schema: $ref: '#/components/schemas/Location' security: + - {} - JWT: [] parameters: - in: path @@ -676,6 +688,7 @@ paths: '204': description: No content security: + - {} - JWT: [] parameters: - in: path @@ -694,6 +707,7 @@ paths: schema: $ref: '#/components/schemas/AnalyzeLocationResponse' security: + - {} - JWT: [] parameters: [] requestBody: @@ -735,6 +749,7 @@ paths: - errors type: object security: + - {} - JWT: [] parameters: [] requestBody: From 5cc2a75994ad92cfa3ef835a71775146bf6a9059 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Tue, 7 Feb 2023 17:44:30 -0500 Subject: [PATCH 75/98] Add comment to yaml Signed-off-by: Aramis Sennyey --- plugins/catalog-backend/openapi.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog-backend/openapi.yaml b/plugins/catalog-backend/openapi.yaml index beef95b0b7..9215f562f5 100644 --- a/plugins/catalog-backend/openapi.yaml +++ b/plugins/catalog-backend/openapi.yaml @@ -399,6 +399,7 @@ paths: '200': description: Refreshed security: + # From https://stackoverflow.com/questions/47659324/how-to-specify-an-endpoints-authorization-is-optional-in-openapi-v3 - {} - JWT: [] parameters: [] From 8c5abb388ac8770ed61edcc9189f0b44e373f788 Mon Sep 17 00:00:00 2001 From: Jen Evans Date: Tue, 7 Feb 2023 16:58:16 -0800 Subject: [PATCH 76/98] Check for empty costs array and allow title override Signed-off-by: Jen Evans --- .../src/components/CostInsightsLayout/CostInsightsLayout.tsx | 3 ++- .../cost-insights/src/components/EntityCosts/EntityCosts.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx b/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx index 0a583aae0d..55d5668189 100644 --- a/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx +++ b/plugins/cost-insights/src/components/CostInsightsLayout/CostInsightsLayout.tsx @@ -37,6 +37,7 @@ type CostInsightsLayoutProps = { }; export const CostInsightsLayout = ({ + title = 'Cost Insights', groups, children, }: PropsWithChildren) => { @@ -46,7 +47,7 @@ export const CostInsightsLayout = ({
    diff --git a/plugins/cost-insights/src/components/EntityCosts/EntityCosts.tsx b/plugins/cost-insights/src/components/EntityCosts/EntityCosts.tsx index 9dda1c65e3..69bf8885e7 100644 --- a/plugins/cost-insights/src/components/EntityCosts/EntityCosts.tsx +++ b/plugins/cost-insights/src/components/EntityCosts/EntityCosts.tsx @@ -120,7 +120,7 @@ export const EntityCostsCard = () => { return {error.message}; } - if (!dailyCost) { + if (!dailyCost || !dailyCost.aggregation.length) { return No daily costs; } From dfa0bb737ee4cd579c2117843b5f309d58e0c4a0 Mon Sep 17 00:00:00 2001 From: Jen Evans Date: Tue, 7 Feb 2023 17:04:26 -0800 Subject: [PATCH 77/98] Add changeset Signed-off-by: Jen Evans --- .changeset/sweet-yaks-taste.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/sweet-yaks-taste.md diff --git a/.changeset/sweet-yaks-taste.md b/.changeset/sweet-yaks-taste.md new file mode 100644 index 0000000000..cbbbaea497 --- /dev/null +++ b/.changeset/sweet-yaks-taste.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-cost-insights': patch +--- + +Fix bug in EntityCostsCard if cost aggregation array is empty. Allow title override on the Cost Insights Page From 111f5d475b018411cd8e0e0a2c074917746584d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 8 Feb 2023 09:45:30 +0100 Subject: [PATCH 78/98] prettier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/catalog-backend/openapi.yaml | 108 +++++++++++++++------------ 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/plugins/catalog-backend/openapi.yaml b/plugins/catalog-backend/openapi.yaml index 9215f562f5..ea09f5da10 100644 --- a/plugins/catalog-backend/openapi.yaml +++ b/plugins/catalog-backend/openapi.yaml @@ -1,4 +1,5 @@ openapi: 3.1.0 + info: title: '@backstage/plugin-catalog-backend' version: '1' @@ -6,6 +7,10 @@ info: license: name: Apache-2.0 contact: {} + +servers: + - url: / + components: examples: {} headers: {} @@ -14,6 +19,7 @@ components: responses: {} schemas: RefreshOptions: + type: object properties: authorizationToken: type: string @@ -22,19 +28,19 @@ components: description: The reference to a single entity that should be refreshed required: - entityRef - type: object description: Options for requesting a refresh of entities in the catalog. JsonObject: - properties: {} type: object + properties: {} description: A type representing all allowed JSON object values. MapStringString: - properties: {} type: object + properties: {} additionalProperties: type: string description: Construct a type with a set of properties K of type T EntityLink: + type: object properties: type: type: string @@ -50,21 +56,21 @@ components: description: The url to the external site, document, etc. required: - url - type: object description: A link to external information that is related to the entity. EntityMeta: allOf: - $ref: '#/components/schemas/JsonObject' - - properties: + - type: object + properties: links: + type: array items: $ref: '#/components/schemas/EntityLink' - type: array description: A list of external hyperlinks related to the entity. tags: + type: array items: type: string - type: array description: |- A list of single-valued strings, to for example classify catalog entities in various ways. @@ -126,9 +132,9 @@ components: that do so in such a way that it breaks semantics. required: - name - type: object description: Metadata fields common to all versions/kinds of entity. EntityRelation: + type: object properties: targetRef: type: string @@ -139,14 +145,14 @@ components: required: - targetRef - type - type: object description: A relation of a specific type to another entity in the catalog. Entity: + type: object properties: relations: + type: array items: $ref: '#/components/schemas/EntityRelation' - type: array description: The relations that this entity has with other entities. spec: $ref: '#/components/schemas/JsonObject' @@ -164,12 +170,14 @@ components: - metadata - kind - apiVersion - type: object description: The parts of the format that's common to all versions/kinds of entity. EntityAncestryResponse: + type: object properties: items: + type: array items: + type: object properties: parentEntityRefs: items: @@ -180,44 +188,42 @@ components: required: - parentEntityRefs - entity - type: object - type: array rootEntityRef: type: string required: - items - rootEntityRef - type: object EntitiesBatchResponse: + type: object properties: items: + type: array items: allOf: - $ref: '#/components/schemas/Entity' nullable: true - type: array description: |- The list of entities, in the same order as the refs in the request. Entries that are null signify that no entity existed with that ref. required: - items - type: object EntityFacets: type: object - properties: - value: + properties: + value: type: string - count: + count: type: number description: Construct a type with a set of properties K of type T EntityFacetsResponse: - properties: {} type: object + properties: {} additionalProperties: - $ref: '#/components/schemas/EntityFacets' + $ref: '#/components/schemas/EntityFacets' required: - facets Location: + type: object properties: target: type: string @@ -229,9 +235,9 @@ components: - target - type - id - type: object description: Entity location for a specific entity. LocationSpec: + type: object properties: presence: type: string @@ -245,9 +251,9 @@ components: required: - target - type - type: object description: Holds the entity location information. AnalyzeLocationExistingEntity: + type: object properties: entity: $ref: '#/components/schemas/Entity' @@ -259,13 +265,13 @@ components: - entity - isRegistered - location - type: object description: |- If the folder pointed to already contained catalog info yaml files, they are read and emitted like this so that the frontend can inform the user that it located them and can make sure to register them as well if they weren't already RecursivePartial_Entity_: + type: object properties: apiVersion: type: string @@ -280,13 +286,13 @@ components: spec: $ref: '#/components/schemas/JsonObject' relations: + type: array items: $ref: '#/components/schemas/EntityRelation' - type: array description: The relations that this entity has with other entities. - type: object description: Makes all keys of an entire hierarchy optional. AnalyzeLocationEntityField: + type: object properties: description: type: string @@ -315,19 +321,18 @@ components: - value - state - field - type: object AnalyzeLocationGenerateEntity: + type: object properties: fields: + type: array items: $ref: '#/components/schemas/AnalyzeLocationEntityField' - type: array entity: $ref: '#/components/schemas/RecursivePartial_Entity_' required: - fields - entity - type: object description: |- This is some form of representation of what the analyzer could deduce. We should probably have a chat about how this can best be conveyed to @@ -335,6 +340,7 @@ components: enough info for the frontend to know what form data to show to the user for overriding/completing the info. AnalyzeLocationResponse: + type: object properties: generateEntities: items: @@ -347,8 +353,8 @@ components: required: - generateEntities - existingEntityFiles - type: object LocationInput: + type: object properties: type: type: string @@ -363,11 +369,11 @@ components: - type - target - presence - type: object SerializedError: allOf: - $ref: '#/components/schemas/JsonObject' - - properties: + - type: object + properties: code: type: string description: A custom code (not necessarily the same as an HTTP response code); may not be present @@ -383,7 +389,6 @@ components: required: - message - name - type: object description: The serialized form of an Error. securitySchemes: JWT: @@ -409,6 +414,7 @@ paths: application/json: schema: $ref: '#/components/schemas/RefreshOptions' + /entities: get: operationId: GetEntities @@ -418,9 +424,9 @@ paths: content: application/json: schema: + type: array items: $ref: '#/components/schemas/Entity' - type: array security: - {} - JWT: [] @@ -450,6 +456,7 @@ paths: required: false schema: type: string + /entities/by-uid/{uid}: get: operationId: GetEntityByUid @@ -513,6 +520,7 @@ paths: required: true schema: type: string + /entities/by-name/{kind}/{namespace}/{name}/ancestry: get: operationId: GetEntityAncestryByName @@ -542,6 +550,7 @@ paths: required: true schema: type: string + /entities/by-refs: post: operationId: GetEntitiesByRefs @@ -566,9 +575,10 @@ paths: content: application/json: schema: + type: array items: type: string - type: array + /entity-facets: get: operationId: GetEntityFacets @@ -593,6 +603,7 @@ paths: required: false schema: type: string + /locations: post: operationId: CreateLocation @@ -602,6 +613,7 @@ paths: content: application/json: schema: + type: object properties: exists: type: boolean @@ -614,7 +626,6 @@ paths: required: - entities - location - type: object security: - {} - JWT: [] @@ -629,6 +640,7 @@ paths: content: application/json: schema: + type: object properties: presence: type: string @@ -643,7 +655,6 @@ paths: - presence - target - type - type: object get: operationId: GetLocations responses: @@ -652,18 +663,19 @@ paths: content: application/json: schema: + type: array items: + type: object properties: data: $ref: '#/components/schemas/Location' required: - data - type: object - type: array security: - {} - JWT: [] parameters: [] + /locations/{id}: get: operationId: GetLocation @@ -697,6 +709,7 @@ paths: required: true schema: type: string + /analyze-location: post: operationId: AnalyzeLocation @@ -716,6 +729,7 @@ paths: content: application/json: schema: + type: object properties: catalogFileName: type: string @@ -724,7 +738,7 @@ paths: required: - catalogFileName - location - type: object + /validate-entity: post: operationId: ValidateEntity @@ -735,20 +749,20 @@ paths: application/json: schema: anyOf: - - properties: + - type: object + properties: errors: $ref: '#/components/schemas/SerializedError' required: - errors - type: object - - properties: + - type: object + properties: errors: + type: array items: $ref: '#/components/schemas/SerializedError' - type: array required: - errors - type: object security: - {} - JWT: [] @@ -758,6 +772,7 @@ paths: content: application/json: schema: + type: object properties: location: type: string @@ -766,6 +781,3 @@ paths: required: - location - entity - type: object -servers: - - url: / From 7a414a855cfbe24c1ca07bae8d29f68f143b4e15 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 10:24:12 +0000 Subject: [PATCH 79/98] chore(deps): update dependency lint-staged to v13.1.1 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 336efa3f38..2153506078 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27675,8 +27675,8 @@ __metadata: linkType: hard "lint-staged@npm:^13.0.0": - version: 13.1.0 - resolution: "lint-staged@npm:13.1.0" + version: 13.1.1 + resolution: "lint-staged@npm:13.1.1" dependencies: cli-truncate: ^3.1.0 colorette: ^2.0.19 @@ -27693,7 +27693,7 @@ __metadata: yaml: ^2.1.3 bin: lint-staged: bin/lint-staged.js - checksum: adf20c4ca9285c4a93b06598b970d71b04cfe58a1a4c9006f753b83e02c1c622d1866c32a4f1e7e29a98091c501eac3345f7678af247b4f97d5be88b3d8727c1 + checksum: 8e5093c7e982a2f6d6449927a40156a812644479df1d2760aee8bf05df3a314e022d8f7e275e57fd61769ee57e3cf7b062ed3c6e4934a63848300b877e269daa languageName: node linkType: hard From b88182e22605919700d1806c90c92203da8ff649 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 11:07:18 +0000 Subject: [PATCH 80/98] chore(deps): update dependency prettier to v2.8.4 Signed-off-by: Renovate Bot --- microsite-next/yarn.lock | 6 +++--- microsite/yarn.lock | 6 +++--- yarn.lock | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/microsite-next/yarn.lock b/microsite-next/yarn.lock index d81c348bc3..e03c6d93c5 100644 --- a/microsite-next/yarn.lock +++ b/microsite-next/yarn.lock @@ -8361,11 +8361,11 @@ __metadata: linkType: hard "prettier@npm:^2.6.2": - version: 2.8.2 - resolution: "prettier@npm:2.8.2" + version: 2.8.4 + resolution: "prettier@npm:2.8.4" bin: prettier: bin-prettier.js - checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 + checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e languageName: node linkType: hard diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 34ed76e9e4..95b0c2885b 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -7369,11 +7369,11 @@ __metadata: linkType: hard "prettier@npm:^2.6.2": - version: 2.8.2 - resolution: "prettier@npm:2.8.2" + version: 2.8.4 + resolution: "prettier@npm:2.8.4" bin: prettier: bin-prettier.js - checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 + checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 2153506078..0e02029c72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32113,11 +32113,11 @@ __metadata: linkType: hard "prettier@npm:^2.2.1, prettier@npm:^2.7.1": - version: 2.8.2 - resolution: "prettier@npm:2.8.2" + version: 2.8.4 + resolution: "prettier@npm:2.8.4" bin: prettier: bin-prettier.js - checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 + checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e languageName: node linkType: hard From aef888fc8bd76a40a64bdd78997986456bd4b4d6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 12:16:30 +0000 Subject: [PATCH 81/98] fix(deps): update dependency jose to v4.11.4 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0e02029c72..3072ac7386 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26586,9 +26586,9 @@ __metadata: linkType: hard "jose@npm:^4.10.0, jose@npm:^4.6.0": - version: 4.11.2 - resolution: "jose@npm:4.11.2" - checksum: bc9b2271c31683603857b2fd2903afa29f826fffd4bcefc0845355ed86995def87eaadf502033207996109d76698c912e5a986e279326d9629321a50504fe466 + version: 4.11.4 + resolution: "jose@npm:4.11.4" + checksum: ab870d61e3721cfa1059b1a79cfc2fce06586c8afd4164362e1725934a635191bd938893ebdfac55a0811efbe9b6fd650bbf82d36d87e8a0b7cb4b0379328dab languageName: node linkType: hard From 3ff9581a3fb2876cadd214798f9ab4337ff3dcc1 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 8 Feb 2023 14:04:25 +0100 Subject: [PATCH 82/98] chore: turn off the auto assign functionality of our workflows Signed-off-by: blam --- .github/workflows/pr.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 1cde52bfbb..d7ae00d3a9 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -18,12 +18,12 @@ jobs: if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) steps: - name: PR sync - uses: backstage/actions/pr-sync@v0.6.0 + uses: backstage/actions/pr-sync@v0.6.1 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} installation-id: ${{ secrets.BACKSTAGE_GOALIE_INSTALLATION_ID }} project-id: PVT_kwDOBFKqdc02LQ - excluded-users: ${{ secrets.OOO_USERS }} + auto-assign: false owning-teams: '@backstage/techdocs-core' From 3c6636c000a7f8ed4a55e758f9ebff3773aec789 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 13:11:33 +0000 Subject: [PATCH 83/98] fix(deps): update dependency vm2 to v3.9.14 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3072ac7386..7c65c54e5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37849,14 +37849,14 @@ __metadata: linkType: hard "vm2@npm:^3.9.11": - version: 3.9.13 - resolution: "vm2@npm:3.9.13" + version: 3.9.14 + resolution: "vm2@npm:3.9.14" dependencies: acorn: ^8.7.0 acorn-walk: ^8.2.0 bin: vm2: bin/vm2 - checksum: ee82c130a9d1b45558fac4e95133ae022e69fafd4bec8aada44bb2f0aebe6ff8ae9b1176e7cbafceffec35267e009b518c121ad81a5565da06aa7a50ed3a09bc + checksum: 1ed7481e07ce8e03055101b382bfbf0d725a5c9b9bbe8bf75f71501cb43a6bd22f6a0a151975ff7cea8cad136d47e66d64f0a3248913f6d3ca3c405db12bacc0 languageName: node linkType: hard From b86efa2d04a4e8475aeca0845beafdd9bd4ddd71 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 8 Feb 2023 11:13:58 +0100 Subject: [PATCH 84/98] backend-plugin-api: make ServiceFactory opaque Signed-off-by: Patrik Oldsberg --- .changeset/quiet-pets-count.md | 6 ++ .changeset/wild-melons-shout.md | 5 + packages/backend-app-api/api-report.md | 60 +++++++++--- .../httpRouterServiceFactory.test.ts | 11 +-- .../tokenManagerServiceFactory.test.ts | 11 +-- .../src/wiring/ServiceRegistry.ts | 82 +++++++++++------ packages/backend-plugin-api/api-report.md | 54 ++++------- .../src/services/system/types.ts | 91 ++++++++++++------- packages/backend-test-utils/api-report.md | 30 +++--- .../src/next/services/mockServices.ts | 12 ++- 10 files changed, 212 insertions(+), 150 deletions(-) create mode 100644 .changeset/quiet-pets-count.md create mode 100644 .changeset/wild-melons-shout.md diff --git a/.changeset/quiet-pets-count.md b/.changeset/quiet-pets-count.md new file mode 100644 index 0000000000..bc7da8f3e7 --- /dev/null +++ b/.changeset/quiet-pets-count.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-test-utils': patch +'@backstage/backend-app-api': patch +--- + +Updated usage of `ServiceFactory`. diff --git a/.changeset/wild-melons-shout.md b/.changeset/wild-melons-shout.md new file mode 100644 index 0000000000..5a79612f22 --- /dev/null +++ b/.changeset/wild-melons-shout.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': minor +--- + +Switch `ServiceFactory` to be an opaque type, keeping only the `service` field as public API, but also adding a type parameter for the service scope. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index e4c3e34751..9329610a4c 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -48,7 +48,10 @@ export interface Backend { } // @public (undocumented) -export const cacheServiceFactory: () => ServiceFactory; +export const cacheServiceFactory: () => ServiceFactory< + PluginCacheManager, + 'plugin' +>; // @public (undocumented) export interface ConfigFactoryOptions { @@ -59,7 +62,7 @@ export interface ConfigFactoryOptions { // @public (undocumented) export const configServiceFactory: ( options?: ConfigFactoryOptions | undefined, -) => ServiceFactory; +) => ServiceFactory; // @public (undocumented) export function createConfigSecretEnumerator(options: { @@ -88,7 +91,10 @@ export interface CreateSpecializedBackendOptions { } // @public (undocumented) -export const databaseServiceFactory: () => ServiceFactory; +export const databaseServiceFactory: () => ServiceFactory< + PluginDatabaseManager, + 'plugin' +>; // @public export class DefaultRootHttpRouter implements RootHttpRouterService { @@ -106,7 +112,10 @@ export interface DefaultRootHttpRouterOptions { } // @public (undocumented) -export const discoveryServiceFactory: () => ServiceFactory; +export const discoveryServiceFactory: () => ServiceFactory< + PluginEndpointDiscovery, + 'plugin' +>; // @public export interface ExtendedHttpServer extends http.Server { @@ -126,7 +135,7 @@ export interface HttpRouterFactoryOptions { // @public (undocumented) export const httpRouterServiceFactory: ( options?: HttpRouterFactoryOptions | undefined, -) => ServiceFactory; +) => ServiceFactory; // @public export type HttpServerCertificateOptions = @@ -160,10 +169,13 @@ export type IdentityFactoryOptions = { // @public (undocumented) export const identityServiceFactory: ( options?: IdentityFactoryOptions | undefined, -) => ServiceFactory; +) => ServiceFactory; // @public -export const lifecycleServiceFactory: () => ServiceFactory; +export const lifecycleServiceFactory: () => ServiceFactory< + LifecycleService, + 'plugin' +>; // @public export function loadBackendConfig(options: { @@ -174,7 +186,10 @@ export function loadBackendConfig(options: { }>; // @public (undocumented) -export const loggerServiceFactory: () => ServiceFactory; +export const loggerServiceFactory: () => ServiceFactory< + LoggerService, + 'plugin' +>; // @public export class MiddlewareFactory { @@ -202,7 +217,10 @@ export interface MiddlewareFactoryOptions { } // @public (undocumented) -export const permissionsServiceFactory: () => ServiceFactory; +export const permissionsServiceFactory: () => ServiceFactory< + PermissionsService, + 'plugin' +>; // @public export function readCorsOptions(config?: Config): CorsOptions; @@ -238,22 +256,34 @@ export type RootHttpRouterFactoryOptions = { // @public (undocumented) export const rootHttpRouterServiceFactory: ( options?: RootHttpRouterFactoryOptions | undefined, -) => ServiceFactory; +) => ServiceFactory; // @public -export const rootLifecycleServiceFactory: () => ServiceFactory; +export const rootLifecycleServiceFactory: () => ServiceFactory< + RootLifecycleService, + 'root' +>; // @public (undocumented) -export const rootLoggerServiceFactory: () => ServiceFactory; +export const rootLoggerServiceFactory: () => ServiceFactory< + RootLoggerService, + 'root' +>; // @public (undocumented) -export const schedulerServiceFactory: () => ServiceFactory; +export const schedulerServiceFactory: () => ServiceFactory< + SchedulerService, + 'plugin' +>; // @public (undocumented) -export const tokenManagerServiceFactory: () => ServiceFactory; +export const tokenManagerServiceFactory: () => ServiceFactory< + TokenManagerService, + 'plugin' +>; // @public (undocumented) -export const urlReaderServiceFactory: () => ServiceFactory; +export const urlReaderServiceFactory: () => ServiceFactory; // @public export class WinstonLogger implements RootLoggerService { diff --git a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts index 2e124c98b6..e52b4c9a36 100644 --- a/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/httpRouter/httpRouterServiceFactory.test.ts @@ -14,19 +14,12 @@ * limitations under the License. */ -import { - HttpRouterService, - ServiceFactory, -} from '@backstage/backend-plugin-api'; import { httpRouterServiceFactory } from './httpRouterServiceFactory'; describe('httpRouterFactory', () => { it('should register plugin paths', async () => { const rootHttpRouter = { use: jest.fn() }; - const factory = httpRouterServiceFactory() as Exclude< - ServiceFactory, - { scope: 'root' } - >; + const factory = httpRouterServiceFactory() as any; const handler1 = () => {}; const router1 = await factory.factory( @@ -57,7 +50,7 @@ describe('httpRouterFactory', () => { const rootHttpRouter = { use: jest.fn() }; const factory = httpRouterServiceFactory({ getPath: id => `/some/${id}/path`, - }) as Exclude, { scope: 'root' }>; + }) as any; const handler1 = () => {}; const router1 = await factory.factory( diff --git a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts index 6c33829967..aca5211e2e 100644 --- a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts +++ b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.test.ts @@ -14,11 +14,7 @@ * limitations under the License. */ -import { - LoggerService, - ServiceFactory, - TokenManagerService, -} from '@backstage/backend-plugin-api'; +import { LoggerService } from '@backstage/backend-plugin-api'; import { ConfigReader } from '@backstage/config'; import { tokenManagerServiceFactory } from './tokenManagerServiceFactory'; @@ -26,10 +22,7 @@ describe('tokenManagerFactory', () => { it('should create managers that can share tokens in development', async () => { (process.env as { NODE_ENV?: string }).NODE_ENV = 'development'; - const factory = tokenManagerServiceFactory() as Exclude< - ServiceFactory, - { scope: 'root' } - >; + const factory = tokenManagerServiceFactory() as any; const deps = { config: new ConfigReader({}), logger: { warn() {} } as unknown as LoggerService, diff --git a/packages/backend-app-api/src/wiring/ServiceRegistry.ts b/packages/backend-app-api/src/wiring/ServiceRegistry.ts index 68dff3f7c3..b5b55f67cf 100644 --- a/packages/backend-app-api/src/wiring/ServiceRegistry.ts +++ b/packages/backend-app-api/src/wiring/ServiceRegistry.ts @@ -18,36 +18,66 @@ import { ServiceFactory, ServiceRef, coreServices, + createServiceFactory, } from '@backstage/backend-plugin-api'; import { stringifyError } from '@backstage/errors'; import { EnumerableServiceHolder } from './types'; +// Direct internal import to avoid duplication +// eslint-disable-next-line @backstage/no-forbidden-package-imports +import { InternalServiceFactory } from '@backstage/backend-plugin-api/src/services/system/types'; /** * Keep in sync with `@backstage/backend-plugin-api/src/services/system/types.ts` * @internal */ -export type InternalServiceRef = ServiceRef & { +export type InternalServiceRef = ServiceRef & { __defaultFactory?: ( - service: ServiceRef, - ) => Promise | (() => ServiceFactory)>; + service: ServiceRef, + ) => Promise ServiceFactory)>; }; +function toInternalServiceFactory( + factory: ServiceFactory, +): InternalServiceFactory { + const f = factory as InternalServiceFactory; + if (f.$$type !== '@backstage/ServiceFactory') { + throw new Error(`Invalid service factory, bad type '${f.$$type}'`); + } + if (f.version !== 'v1') { + throw new Error(`Invalid service factory, bad version '${f.version}'`); + } + return f; +} + +const pluginMetadataServiceFactory = createServiceFactory( + (options: { pluginId: string }) => ({ + service: coreServices.pluginMetadata, + deps: {}, + factory: async () => ({ getId: () => options.pluginId }), + }), +); + export class ServiceRegistry implements EnumerableServiceHolder { - readonly #providedFactories: Map; - readonly #loadedDefaultFactories: Map>; + readonly #providedFactories: Map; + readonly #loadedDefaultFactories: Map< + Function, + Promise + >; readonly #implementations: Map< - ServiceFactory, + InternalServiceFactory, { context: Promise; byPlugin: Map>; } >; readonly #rootServiceImplementations = new Map< - ServiceFactory, + InternalServiceFactory, Promise >(); - constructor(factories: Array>) { - this.#providedFactories = new Map(factories.map(f => [f.service.id, f])); + constructor(factories: Array) { + this.#providedFactories = new Map( + factories.map(sf => [sf.service.id, toInternalServiceFactory(sf)]), + ); this.#loadedDefaultFactories = new Map(); this.#implementations = new Map(); } @@ -55,23 +85,19 @@ export class ServiceRegistry implements EnumerableServiceHolder { #resolveFactory( ref: ServiceRef, pluginId: string, - ): Promise | undefined { + ): Promise | undefined { // Special case handling of the plugin metadata service, generating a custom factory for it each time if (ref.id === coreServices.pluginMetadata.id) { - return Promise.resolve< - ServiceFactory - >({ - scope: 'plugin', - service: coreServices.pluginMetadata, - deps: {}, - factory: async () => ({ getId: () => pluginId }), - }); + return Promise.resolve( + toInternalServiceFactory(pluginMetadataServiceFactory({ pluginId })), + ); } - let resolvedFactory: Promise | ServiceFactory | undefined = - this.#providedFactories.get(ref.id); - const { __defaultFactory: defaultFactory } = - ref as InternalServiceRef; + let resolvedFactory: + | Promise + | InternalServiceFactory + | undefined = this.#providedFactories.get(ref.id); + const { __defaultFactory: defaultFactory } = ref as InternalServiceRef; if (!resolvedFactory && !defaultFactory) { return undefined; } @@ -82,8 +108,8 @@ export class ServiceRegistry implements EnumerableServiceHolder { loadedFactory = Promise.resolve() .then(() => defaultFactory!(ref)) .then(f => - typeof f === 'function' ? f() : f, - ) as Promise; + toInternalServiceFactory(typeof f === 'function' ? f() : f), + ); this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory); } resolvedFactory = loadedFactory.catch(error => { @@ -100,7 +126,7 @@ export class ServiceRegistry implements EnumerableServiceHolder { return Promise.resolve(resolvedFactory); } - #checkForMissingDeps(factory: ServiceFactory, pluginId: string) { + #checkForMissingDeps(factory: InternalServiceFactory, pluginId: string) { const missingDeps = Object.values(factory.deps).filter(ref => { if (ref.id === coreServices.pluginMetadata.id) { return false; @@ -109,7 +135,7 @@ export class ServiceRegistry implements EnumerableServiceHolder { return false; } - return !(ref as InternalServiceRef).__defaultFactory; + return !(ref as InternalServiceRef).__defaultFactory; }); if (missingDeps.length) { @@ -126,7 +152,7 @@ export class ServiceRegistry implements EnumerableServiceHolder { get(ref: ServiceRef, pluginId: string): Promise | undefined { return this.#resolveFactory(ref, pluginId)?.then(factory => { - if (factory.scope === 'root') { + if (factory.service.scope === 'root') { let existing = this.#rootServiceImplementations.get(factory); if (!existing) { this.#checkForMissingDeps(factory, pluginId); @@ -143,7 +169,7 @@ export class ServiceRegistry implements EnumerableServiceHolder { } existing = Promise.all(rootDeps).then(entries => - factory.factory(Object.fromEntries(entries)), + factory.factory(Object.fromEntries(entries), undefined), ); this.#rootServiceImplementations.set(factory, existing); } diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 1219bdaf3f..6a0b5e51e7 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -145,7 +145,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: RootServiceFactoryConfig, -): () => ServiceFactory; +): () => ServiceFactory; // @public export function createServiceFactory< @@ -157,7 +157,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: (options?: TOpts) => RootServiceFactoryConfig, -): (options?: TOpts) => ServiceFactory; +): (options?: TOpts) => ServiceFactory; // @public export function createServiceFactory< @@ -169,7 +169,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: (options: TOpts) => RootServiceFactoryConfig, -): (options: TOpts) => ServiceFactory; +): (options: TOpts) => ServiceFactory; // @public export function createServiceFactory< @@ -182,7 +182,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: PluginServiceFactoryConfig, -): () => ServiceFactory; +): () => ServiceFactory; // @public export function createServiceFactory< @@ -197,7 +197,7 @@ export function createServiceFactory< config: ( options?: TOpts, ) => PluginServiceFactoryConfig, -): (options?: TOpts) => ServiceFactory; +): (options?: TOpts) => ServiceFactory; // @public export function createServiceFactory< @@ -214,7 +214,7 @@ export function createServiceFactory< | (( options: TOpts, ) => PluginServiceFactoryConfig), -): (options: TOpts) => ServiceFactory; +): (options: TOpts) => ServiceFactory; // @public export function createServiceRef( @@ -427,38 +427,18 @@ export type SearchResponseFile = { }; // @public (undocumented) -export type ServiceFactory = - | { - scope: 'root'; - service: ServiceRef; - deps: { - [key in string]: ServiceRef; - }; - factory(deps: { - [key in string]: unknown; - }): Promise; - } - | { - scope: 'plugin'; - service: ServiceRef; - deps: { - [key in string]: ServiceRef; - }; - createRootContext?(deps: { - [key in string]: unknown; - }): Promise; - factory( - deps: { - [key in string]: unknown; - }, - context: unknown, - ): Promise; - }; +export interface ServiceFactory< + TService = unknown, + TScope extends 'plugin' | 'root' = 'plugin' | 'root', +> { + // (undocumented) + $$type: '@backstage/ServiceFactory'; + // (undocumented) + service: ServiceRef; +} // @public -export type ServiceFactoryOrFunction = - | ServiceFactory - | (() => ServiceFactory); +export type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory); // @public export type ServiceRef< @@ -477,7 +457,7 @@ export interface ServiceRefConfig { // (undocumented) defaultFactory?: ( service: ServiceRef, - ) => Promise>; + ) => Promise; // (undocumented) id: string; // (undocumented) diff --git a/packages/backend-plugin-api/src/services/system/types.ts b/packages/backend-plugin-api/src/services/system/types.ts index ea151e00b9..190ef7c13e 100644 --- a/packages/backend-plugin-api/src/services/system/types.ts +++ b/packages/backend-plugin-api/src/services/system/types.ts @@ -48,34 +48,35 @@ export type ServiceRef< }; /** @public */ -export type ServiceFactory = - | { - // This scope prop is needed in addition to the service ref, as TypeScript - // can't properly discriminate the two factory types otherwise. - scope: 'root'; - service: ServiceRef; - deps: { [key in string]: ServiceRef }; - factory(deps: { [key in string]: unknown }): Promise; - } - | { - scope: 'plugin'; - service: ServiceRef; - deps: { [key in string]: ServiceRef }; - createRootContext?(deps: { [key in string]: unknown }): Promise; - factory( - deps: { [key in string]: unknown }, - context: unknown, - ): Promise; - }; +export interface ServiceFactory< + TService = unknown, + TScope extends 'plugin' | 'root' = 'plugin' | 'root', +> { + $$type: '@backstage/ServiceFactory'; + + service: ServiceRef; +} + +/** @internal */ +export interface InternalServiceFactory< + TService = unknown, + TScope extends 'plugin' | 'root' = 'plugin' | 'root', +> extends ServiceFactory { + version: 'v1'; + deps: { [key in string]: ServiceRef }; + createRootContext?(deps: { [key in string]: unknown }): Promise; + factory( + deps: { [key in string]: unknown }, + context: unknown, + ): Promise; +} /** * Represents either a {@link ServiceFactory} or a function that returns one. * * @public */ -export type ServiceFactoryOrFunction = - | ServiceFactory - | (() => ServiceFactory); +export type ServiceFactoryOrFunction = ServiceFactory | (() => ServiceFactory); /** @public */ export interface ServiceRefConfig { @@ -83,7 +84,7 @@ export interface ServiceRefConfig { scope?: TScope; defaultFactory?: ( service: ServiceRef, - ) => Promise>; + ) => Promise; } /** @@ -175,7 +176,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: RootServiceFactoryConfig, -): () => ServiceFactory; +): () => ServiceFactory; /** * Creates a root scoped service factory with optional options. * @@ -189,7 +190,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: (options?: TOpts) => RootServiceFactoryConfig, -): (options?: TOpts) => ServiceFactory; +): (options?: TOpts) => ServiceFactory; /** * Creates a root scoped service factory with required options. * @@ -203,7 +204,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: (options: TOpts) => RootServiceFactoryConfig, -): (options: TOpts) => ServiceFactory; +): (options: TOpts) => ServiceFactory; /** * Creates a plugin scoped service factory without options. * @@ -218,7 +219,7 @@ export function createServiceFactory< TOpts extends object | undefined = undefined, >( config: PluginServiceFactoryConfig, -): () => ServiceFactory; +): () => ServiceFactory; /** * Creates a plugin scoped service factory with optional options. * @@ -235,7 +236,7 @@ export function createServiceFactory< config: ( options?: TOpts, ) => PluginServiceFactoryConfig, -): (options?: TOpts) => ServiceFactory; +): (options?: TOpts) => ServiceFactory; /** * Creates a plugin scoped service factory with required options. * @@ -254,7 +255,7 @@ export function createServiceFactory< | (( options: TOpts, ) => PluginServiceFactoryConfig), -): (options: TOpts) => ServiceFactory; +): (options: TOpts) => ServiceFactory; export function createServiceFactory< TService, TImpl extends TService, @@ -271,20 +272,40 @@ export function createServiceFactory< ) => PluginServiceFactoryConfig) | (() => RootServiceFactoryConfig) | (() => PluginServiceFactoryConfig), -): (options: TOpts) => ServiceFactory { +): (options: TOpts) => ServiceFactory { const configCallback = typeof config === 'function' ? config : () => config; - return (options: TOpts) => { - const c = configCallback(options); + return ( + options: TOpts, + ): InternalServiceFactory => { + const anyConf = configCallback(options); + if (anyConf.service.scope === 'root') { + const c = anyConf as RootServiceFactoryConfig; + return { + $$type: '@backstage/ServiceFactory', + version: 'v1', + service: c.service, + deps: c.deps, + factory: async (deps: TDeps) => c.factory(deps), + }; + } + const c = anyConf as PluginServiceFactoryConfig< + TService, + TContext, + TImpl, + TDeps + >; return { - ...c, + $$type: '@backstage/ServiceFactory', + version: 'v1', + service: c.service, ...('createRootContext' in c ? { createRootContext: async (deps: TDeps) => c?.createRootContext?.(deps), } : {}), + deps: c.deps, factory: async (deps: TDeps, ctx: TContext) => c.factory(deps, ctx), - scope: c.service.scope, - } as ServiceFactory; + }; }; } diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index d99cf51866..0b3d7dd843 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -33,7 +33,7 @@ export namespace mockServices { // (undocumented) export namespace cache { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export function config(options?: config.Options): ConfigService; @@ -44,46 +44,48 @@ export namespace mockServices { data?: JsonObject; }; const // (undocumented) - factory: (options?: Options | undefined) => ServiceFactory; + factory: ( + options?: Options | undefined, + ) => ServiceFactory; } // (undocumented) export namespace database { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export namespace httpRouter { const // (undocumented) factory: ( options?: HttpRouterFactoryOptions | undefined, - ) => ServiceFactory; + ) => ServiceFactory; } // (undocumented) export function identity(): IdentityService; // (undocumented) export namespace identity { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export namespace lifecycle { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export namespace logger { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export namespace permissions { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export namespace rootLifecycle { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export function rootLogger(options?: rootLogger.Options): LoggerService; @@ -94,24 +96,26 @@ export namespace mockServices { level?: 'none' | 'error' | 'warn' | 'info' | 'debug'; }; const // (undocumented) - factory: (options?: Options | undefined) => ServiceFactory; + factory: ( + options?: Options | undefined, + ) => ServiceFactory; } // (undocumented) export namespace scheduler { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export function tokenManager(): TokenManagerService; // (undocumented) export namespace tokenManager { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } // (undocumented) export namespace urlReader { const // (undocumented) - factory: () => ServiceFactory; + factory: () => ServiceFactory; } } diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index e5b3b32be7..2e97cc63fb 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -40,17 +40,21 @@ import { JsonObject } from '@backstage/types'; import { MockIdentityService } from './MockIdentityService'; import { MockRootLoggerService } from './MockRootLoggerService'; -function simpleFactory( - ref: ServiceRef, +function simpleFactory< + TService, + TScope extends 'root' | 'plugin', + TOptions extends [options?: object] = [], +>( + ref: ServiceRef, factory: (...options: TOptions) => TService, -): (...options: TOptions) => ServiceFactory { +): (...options: TOptions) => ServiceFactory { return createServiceFactory((options: unknown) => ({ service: ref as ServiceRef, deps: {}, async factory() { return (factory as any)(options); }, - })); + })) as (...options: TOptions) => ServiceFactory; } /** From a32da1e3811e7617ef6c4e74004f82af6023c846 Mon Sep 17 00:00:00 2001 From: Harry Hogg Date: Wed, 8 Feb 2023 13:43:39 +0000 Subject: [PATCH 85/98] Updated permission rule descriptions with a couple of fixes, grammar improvements and consistency Signed-off-by: Harry Hogg --- .../src/permissions/rules/createPropertyRule.ts | 2 +- .../catalog-backend/src/permissions/rules/hasAnnotation.ts | 3 +-- plugins/catalog-backend/src/permissions/rules/hasLabel.ts | 4 ++-- .../catalog-backend/src/permissions/rules/isEntityKind.ts | 2 +- .../catalog-backend/src/permissions/rules/isEntityOwner.ts | 2 +- plugins/playlist-backend/src/permissions/rules.ts | 6 +++--- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/plugins/catalog-backend/src/permissions/rules/createPropertyRule.ts b/plugins/catalog-backend/src/permissions/rules/createPropertyRule.ts index 19a4423846..fd51a1a060 100644 --- a/plugins/catalog-backend/src/permissions/rules/createPropertyRule.ts +++ b/plugins/catalog-backend/src/permissions/rules/createPropertyRule.ts @@ -22,7 +22,7 @@ import { z } from 'zod'; export const createPropertyRule = (propertyType: 'metadata' | 'spec') => createCatalogPermissionRule({ name: `HAS_${propertyType.toUpperCase()}`, - description: `Allow entities which have the specified ${propertyType} subfield.`, + description: `Allow entities with the specified ${propertyType} subfield`, resourceType: RESOURCE_TYPE_CATALOG_ENTITY, paramsSchema: z.object({ key: z diff --git a/plugins/catalog-backend/src/permissions/rules/hasAnnotation.ts b/plugins/catalog-backend/src/permissions/rules/hasAnnotation.ts index c24620f41c..ae9b1c3963 100644 --- a/plugins/catalog-backend/src/permissions/rules/hasAnnotation.ts +++ b/plugins/catalog-backend/src/permissions/rules/hasAnnotation.ts @@ -28,8 +28,7 @@ import { createCatalogPermissionRule } from './util'; */ export const hasAnnotation = createCatalogPermissionRule({ name: 'HAS_ANNOTATION', - description: - 'Allow entities which are annotated with the specified annotation', + description: 'Allow entities with the specified annotation', resourceType: RESOURCE_TYPE_CATALOG_ENTITY, paramsSchema: z.object({ annotation: z.string().describe('Name of the annotation to match on'), diff --git a/plugins/catalog-backend/src/permissions/rules/hasLabel.ts b/plugins/catalog-backend/src/permissions/rules/hasLabel.ts index 376534ca6f..16c5917585 100644 --- a/plugins/catalog-backend/src/permissions/rules/hasLabel.ts +++ b/plugins/catalog-backend/src/permissions/rules/hasLabel.ts @@ -25,10 +25,10 @@ import { createCatalogPermissionRule } from './util'; */ export const hasLabel = createCatalogPermissionRule({ name: 'HAS_LABEL', - description: 'Allow entities which have the specified label metadata.', + description: 'Allow entities with the specified label', resourceType: RESOURCE_TYPE_CATALOG_ENTITY, paramsSchema: z.object({ - label: z.string().describe('Name of the label to match one'), + label: z.string().describe('Name of the label to match on'), }), apply: (resource, { label }) => !!resource.metadata.labels?.hasOwnProperty(label), diff --git a/plugins/catalog-backend/src/permissions/rules/isEntityKind.ts b/plugins/catalog-backend/src/permissions/rules/isEntityKind.ts index eee7a790b2..94aaa63567 100644 --- a/plugins/catalog-backend/src/permissions/rules/isEntityKind.ts +++ b/plugins/catalog-backend/src/permissions/rules/isEntityKind.ts @@ -25,7 +25,7 @@ import { createCatalogPermissionRule } from './util'; */ export const isEntityKind = createCatalogPermissionRule({ name: 'IS_ENTITY_KIND', - description: 'Allow entities with the specified kind', + description: 'Allow entities matching a specified kind', resourceType: RESOURCE_TYPE_CATALOG_ENTITY, paramsSchema: z.object({ kinds: z diff --git a/plugins/catalog-backend/src/permissions/rules/isEntityOwner.ts b/plugins/catalog-backend/src/permissions/rules/isEntityOwner.ts index c3bfff5c2e..d0cc1d9280 100644 --- a/plugins/catalog-backend/src/permissions/rules/isEntityOwner.ts +++ b/plugins/catalog-backend/src/permissions/rules/isEntityOwner.ts @@ -27,7 +27,7 @@ import { createCatalogPermissionRule } from './util'; */ export const isEntityOwner = createCatalogPermissionRule({ name: 'IS_ENTITY_OWNER', - description: 'Allow entities owned by the current user', + description: 'Allow entities owned by a specified claim', resourceType: RESOURCE_TYPE_CATALOG_ENTITY, paramsSchema: z.object({ claims: z diff --git a/plugins/playlist-backend/src/permissions/rules.ts b/plugins/playlist-backend/src/permissions/rules.ts index 99f4725972..e29465ed0f 100644 --- a/plugins/playlist-backend/src/permissions/rules.ts +++ b/plugins/playlist-backend/src/permissions/rules.ts @@ -31,10 +31,10 @@ const createPlaylistPermissionRule = makeCreatePermissionRule< const isOwner = createPlaylistPermissionRule({ name: 'IS_OWNER', - description: 'Should allow only if the playlist belongs to the user', + description: 'Allow playlists owned by the given entity refs', resourceType: PLAYLIST_LIST_RESOURCE_TYPE, paramsSchema: z.object({ - owners: z.array(z.string()).describe('List of owner entity refs'), + owners: z.array(z.string()).describe('List of entity refs to match on'), }), apply: (list: PlaylistMetadata, { owners }) => owners.includes(list.owner), toQuery: ({ owners }) => ({ @@ -45,7 +45,7 @@ const isOwner = createPlaylistPermissionRule({ const isPublic = createPlaylistPermissionRule({ name: 'IS_PUBLIC', - description: 'Should allow only if the playlist is public', + description: 'Allow playlists that are set as public', resourceType: PLAYLIST_LIST_RESOURCE_TYPE, apply: (list: PlaylistMetadata) => list.public, toQuery: () => ({ key: 'public', values: [true] }), From b977c2e69ffa4b5c5ce53083fefbb94854521c7d Mon Sep 17 00:00:00 2001 From: Harry Hogg Date: Wed, 8 Feb 2023 13:46:27 +0000 Subject: [PATCH 86/98] Added changeset Signed-off-by: Harry Hogg --- .changeset/brave-lemons-chew.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/brave-lemons-chew.md diff --git a/.changeset/brave-lemons-chew.md b/.changeset/brave-lemons-chew.md new file mode 100644 index 0000000000..61bf7cc6af --- /dev/null +++ b/.changeset/brave-lemons-chew.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-playlist-backend': patch +'@backstage/plugin-catalog-backend': patch +--- + +Minor improvements to the descriptions provided with permission rules schemas From 418bd9234f69fdad46125a698efa0d0a9111ef07 Mon Sep 17 00:00:00 2001 From: Harry Hogg Date: Wed, 8 Feb 2023 13:49:43 +0000 Subject: [PATCH 87/98] Updated tests Signed-off-by: Harry Hogg --- .../src/permissions/rules/createPropertyRule.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/permissions/rules/createPropertyRule.test.ts b/plugins/catalog-backend/src/permissions/rules/createPropertyRule.test.ts index 5b34c98ca6..b2630f0f73 100644 --- a/plugins/catalog-backend/src/permissions/rules/createPropertyRule.test.ts +++ b/plugins/catalog-backend/src/permissions/rules/createPropertyRule.test.ts @@ -25,7 +25,7 @@ describe('createPropertyRule', () => { it('formats the rule description correctly', () => { expect(description).toBe( - 'Allow entities which have the specified metadata subfield.', + 'Allow entities with the specified metadata subfield', ); }); From 339d9a5b5cbc9d05ffd14b5e502be33729e5a050 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Fri, 23 Dec 2022 13:04:41 -0600 Subject: [PATCH 88/98] Use default when no mkdocs config found Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .changeset/perfect-pears-care.md | 6 +++ .../src/DocsBuilder/builder.ts | 1 + plugins/techdocs-node/api-report.md | 1 + .../generate/__fixtures__/mkdocs_default.yml | 4 ++ .../src/stages/generate/helpers.test.ts | 31 ++++++++++++--- .../src/stages/generate/helpers.ts | 39 ++++++++++++++----- .../src/stages/generate/techdocs.ts | 6 ++- .../src/stages/generate/types.ts | 1 + 8 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 .changeset/perfect-pears-care.md create mode 100644 plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml diff --git a/.changeset/perfect-pears-care.md b/.changeset/perfect-pears-care.md new file mode 100644 index 0000000000..13db9ad0c1 --- /dev/null +++ b/.changeset/perfect-pears-care.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs-node': patch +--- + +Added support for using a default `mkdocs.yml` configuration file when none is provided diff --git a/plugins/techdocs-backend/src/DocsBuilder/builder.ts b/plugins/techdocs-backend/src/DocsBuilder/builder.ts index 09eee1fc12..2ae1462ad9 100644 --- a/plugins/techdocs-backend/src/DocsBuilder/builder.ts +++ b/plugins/techdocs-backend/src/DocsBuilder/builder.ts @@ -186,6 +186,7 @@ export class DocsBuilder { etag: newEtag, logger: this.logger, logStream: this.logStream, + entity: this.entity, }); // Remove Prepared directory since it is no longer needed. diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index e27b406478..253f1c29fa 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -54,6 +54,7 @@ export type GeneratorRunOptions = { etag?: string; logger: Logger; logStream?: Writable; + entity: Entity; }; // @public diff --git a/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml b/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml new file mode 100644 index 0000000000..f6d2b01ce4 --- /dev/null +++ b/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml @@ -0,0 +1,4 @@ +site_name: Test site name +docs_dir: docs +plugins: + - techdocs-core \ No newline at end of file diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index e894b0602e..fb21643e46 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -42,12 +42,16 @@ const mockEntity = { kind: 'TestKind', metadata: { name: 'testName', + title: 'Test site name', }, }; const mkdocsYml = fs.readFileSync( resolvePath(__filename, '../__fixtures__/mkdocs.yml'), ); +const mkdocsDefaultYml = fs.readFileSync( + resolvePath(__filename, '../__fixtures__/mkdocs_default.yml'), +); const mkdocsYmlWithExtensions = fs.readFileSync( resolvePath(__filename, '../__fixtures__/mkdocs_with_extensions.yml'), ); @@ -518,7 +522,10 @@ describe('helpers', () => { it('returns expected contents when .yml file is present', async () => { const key = path.join(inputDir, 'mkdocs.yml'); mockFs({ [key]: mkdocsYml }); - const { path: mkdocsPath, content } = await getMkdocsYml(inputDir); + const { path: mkdocsPath, content } = await getMkdocsYml( + inputDir, + mockEntity, + ); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); @@ -527,15 +534,29 @@ describe('helpers', () => { it('returns expected contents when .yaml file is present', async () => { const key = path.join(inputDir, 'mkdocs.yaml'); mockFs({ [key]: mkdocsYml }); - const { path: mkdocsPath, content } = await getMkdocsYml(inputDir); + const { path: mkdocsPath, content } = await getMkdocsYml( + inputDir, + mockEntity, + ); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); }); - it('throws when neither .yml nor .yaml file is present', async () => { + it('returns expected contents when default file is present', async () => { + const key = path.join(inputDir, 'mkdocs.yml'); + mockFs({ [key]: mkdocsDefaultYml }); + const { path: mkdocsPath, content } = await getMkdocsYml( + inputDir, + mockEntity, + ); + expect(mkdocsPath).toBe(key); + expect(content).toBe(mkdocsDefaultYml.toString()); + }); + + it('throws when neither .yml nor .yaml nor default file is present', async () => { const invalidInputDir = resolvePath(__filename); - await expect(getMkdocsYml(invalidInputDir)).rejects.toThrow( - /Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml for validation/, + await expect(getMkdocsYml(invalidInputDir, mockEntity)).rejects.toThrow( + /Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml or default for validation/, ); }); }); diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index 50db0eb86a..ebb72c420c 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -159,22 +159,43 @@ export const MKDOCS_SCHEMA = DEFAULT_SCHEMA.extend([ */ export const getMkdocsYml = async ( inputDir: string, + entity: Entity, ): Promise<{ path: string; content: string }> => { let mkdocsYmlPath: string; let mkdocsYmlFileString: string; try { mkdocsYmlPath = path.join(inputDir, 'mkdocs.yaml'); - mkdocsYmlFileString = await fs.readFile(mkdocsYmlPath, 'utf8'); - } catch { - try { - mkdocsYmlPath = path.join(inputDir, 'mkdocs.yml'); + if (await fs.pathExists(mkdocsYmlPath)) { mkdocsYmlFileString = await fs.readFile(mkdocsYmlPath, 'utf8'); - } catch (error) { - throw new ForwardedError( - 'Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml for validation', - error, - ); + return { + path: mkdocsYmlPath, + content: mkdocsYmlFileString, + }; } + + mkdocsYmlPath = path.join(inputDir, 'mkdocs.yml'); + if (await fs.pathExists(mkdocsYmlPath)) { + mkdocsYmlFileString = await fs.readFile(mkdocsYmlPath, 'utf8'); + return { + path: mkdocsYmlPath, + content: mkdocsYmlFileString, + }; + } + + // No mkdocs file, use default + const defaultMkdocsContent = + `site_name: ${entity.metadata.title ?? entity.metadata.name}\n` + + 'docs_dir: docs\n' + + 'plugins:\n' + + ' - techdocs-core\n'; + + await fs.writeFile(mkdocsYmlPath, defaultMkdocsContent); + mkdocsYmlFileString = await fs.readFile(mkdocsYmlPath, 'utf8'); + } catch (error) { + throw new ForwardedError( + 'Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml or default for validation', + error, + ); } return { diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index 9bbc58ebdc..45b2f9689e 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -96,10 +96,14 @@ export class TechdocsGenerator implements GeneratorBase { etag, logger: childLogger, logStream, + entity, } = options; // Do some updates to mkdocs.yml before generating docs e.g. adding repo_url - const { path: mkdocsYmlPath, content } = await getMkdocsYml(inputDir); + const { path: mkdocsYmlPath, content } = await getMkdocsYml( + inputDir, + entity, + ); // validate the docs_dir first const docsDir = await validateMkdocsYaml(inputDir, content); diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index 2b2bbb21c9..26c26f4410 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -61,6 +61,7 @@ export type GeneratorRunOptions = { etag?: string; logger: Logger; logStream?: Writable; + entity: Entity; }; /** From 15b6eaf533169062c79470f87b2a71bf515c3a29 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 27 Dec 2022 10:43:36 -0600 Subject: [PATCH 89/98] Large refactor Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .changeset/perfect-pears-care.md | 1 + packages/techdocs-cli/cli-report.md | 3 ++ .../src/commands/generate/generate.ts | 1 + packages/techdocs-cli/src/commands/index.ts | 15 ++++++ .../techdocs-cli/src/commands/serve/mkdocs.ts | 4 ++ .../techdocs-cli/src/commands/serve/serve.ts | 3 ++ .../src/DocsBuilder/builder.ts | 2 +- plugins/techdocs-node/api-report.md | 11 ++++- .../generate/__fixtures__/mkdocs_default.yml | 2 +- .../src/stages/generate/helpers.test.ts | 10 ++-- .../src/stages/generate/helpers.ts | 46 +++++++++++++++---- .../src/stages/generate/index.ts | 1 + .../src/stages/generate/techdocs.ts | 4 +- .../src/stages/generate/types.ts | 3 +- 14 files changed, 87 insertions(+), 19 deletions(-) diff --git a/.changeset/perfect-pears-care.md b/.changeset/perfect-pears-care.md index 13db9ad0c1..2ea9f54a7f 100644 --- a/.changeset/perfect-pears-care.md +++ b/.changeset/perfect-pears-care.md @@ -1,6 +1,7 @@ --- '@backstage/plugin-techdocs-backend': patch '@backstage/plugin-techdocs-node': patch +'@techdocs/cli': patch --- Added support for using a default `mkdocs.yml` configuration file when none is provided diff --git a/packages/techdocs-cli/cli-report.md b/packages/techdocs-cli/cli-report.md index 861dad4605..846ccc88ca 100644 --- a/packages/techdocs-cli/cli-report.md +++ b/packages/techdocs-cli/cli-report.md @@ -33,6 +33,7 @@ Options: --no-docker --techdocs-ref --etag + --site-name -v --verbose --omitTechdocsCoreMkdocsPlugin --legacyCopyReadmeMdToIndexMd @@ -98,6 +99,7 @@ Options: --docker-entrypoint --docker-option --no-docker + --site-name --mkdocs-port -v --verbose --preview-app-bundle-path @@ -115,6 +117,7 @@ Options: --docker-entrypoint --docker-option --no-docker + --site-name -p, --port -v --verbose -h, --help diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index 874b904d86..c409992050 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -106,6 +106,7 @@ export default async function generate(opts: OptionValues) { logger, etag: opts.etag, ...(process.env.LOG_LEVEL === 'debug' ? { logStream: stdout } : {}), + siteName: opts.siteName, }); logger.info('Done!'); diff --git a/packages/techdocs-cli/src/commands/index.ts b/packages/techdocs-cli/src/commands/index.ts index caa7d8efbd..0ff52eee36 100644 --- a/packages/techdocs-cli/src/commands/index.ts +++ b/packages/techdocs-cli/src/commands/index.ts @@ -54,6 +54,11 @@ export function registerCommands(program: Command) { '--etag ', 'A unique identifier for the prepared tree e.g. commit SHA. If provided it will be stored in techdocs_metadata.json.', ) + .option( + '--site-name', + 'Name for site when using default MkDocs config', + 'Table of Contents', + ) .option('-v --verbose', 'Enable verbose output.', false) .option( '--omitTechdocsCoreMkdocsPlugin', @@ -224,6 +229,11 @@ export function registerCommands(program: Command) { '--no-docker', 'Do not use Docker, run `mkdocs serve` in current user environment.', ) + .option( + '--site-name', + 'Name for site when using default MkDocs config', + 'Table of Contents', + ) .option('-p, --port ', 'Port to serve documentation locally', '8000') .option('-v --verbose', 'Enable verbose output.', false) .action(lazy(() => import('./serve/mkdocs').then(m => m.default))); @@ -250,6 +260,11 @@ export function registerCommands(program: Command) { '--no-docker', 'Do not use Docker, use MkDocs executable in current user environment.', ) + .option( + '--site-name', + 'Name for site when using default MkDocs config', + 'Table of Contents', + ) .option('--mkdocs-port ', 'Port for MkDocs server to use', '8000') .option('-v --verbose', 'Enable verbose output.', false) .option( diff --git a/packages/techdocs-cli/src/commands/serve/mkdocs.ts b/packages/techdocs-cli/src/commands/serve/mkdocs.ts index 9cc0aef3be..6c84298c2b 100644 --- a/packages/techdocs-cli/src/commands/serve/mkdocs.ts +++ b/packages/techdocs-cli/src/commands/serve/mkdocs.ts @@ -19,6 +19,7 @@ import openBrowser from 'react-dev-utils/openBrowser'; import { createLogger } from '../../lib/utility'; import { runMkdocsServer } from '../../lib/mkdocsServer'; import { LogFunc, waitForSignal } from '../../lib/run'; +import { getMkdocsYml } from '@backstage/plugin-techdocs-node'; export default async function serveMkdocs(opts: OptionValues) { const logger = createLogger({ verbose: opts.verbose }); @@ -26,6 +27,9 @@ export default async function serveMkdocs(opts: OptionValues) { const dockerAddr = `http://0.0.0.0:${opts.port}`; const localAddr = `http://127.0.0.1:${opts.port}`; const expectedDevAddr = opts.docker ? dockerAddr : localAddr; + + await getMkdocsYml('./', opts.siteName); + // We want to open browser only once based on a log. let boolOpenBrowserTriggered = false; diff --git a/packages/techdocs-cli/src/commands/serve/serve.ts b/packages/techdocs-cli/src/commands/serve/serve.ts index d46c70678a..1e835c2c8d 100644 --- a/packages/techdocs-cli/src/commands/serve/serve.ts +++ b/packages/techdocs-cli/src/commands/serve/serve.ts @@ -22,6 +22,7 @@ import HTTPServer from '../../lib/httpServer'; import { runMkdocsServer } from '../../lib/mkdocsServer'; import { LogFunc, waitForSignal } from '../../lib/run'; import { createLogger } from '../../lib/utility'; +import { getMkdocsYml } from '@backstage/plugin-techdocs-node'; function findPreviewBundlePath(): string { try { @@ -64,6 +65,8 @@ export default async function serve(opts: OptionValues) { ? mkdocsDockerAddr : mkdocsLocalAddr; + await getMkdocsYml('./', opts.siteName); + let mkdocsServerHasStarted = false; const mkdocsLogFunc: LogFunc = data => { // Sometimes the lines contain an unnecessary extra new line diff --git a/plugins/techdocs-backend/src/DocsBuilder/builder.ts b/plugins/techdocs-backend/src/DocsBuilder/builder.ts index 2ae1462ad9..43d05f7b6f 100644 --- a/plugins/techdocs-backend/src/DocsBuilder/builder.ts +++ b/plugins/techdocs-backend/src/DocsBuilder/builder.ts @@ -186,7 +186,7 @@ export class DocsBuilder { etag: newEtag, logger: this.logger, logStream: this.logStream, - entity: this.entity, + siteName: this.entity.metadata.title ?? this.entity.metadata.name, }); // Remove Prepared directory since it is no longer needed. diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index 253f1c29fa..68a7b80152 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -54,7 +54,7 @@ export type GeneratorRunOptions = { etag?: string; logger: Logger; logStream?: Writable; - entity: Entity; + siteName?: string; }; // @public @@ -86,6 +86,15 @@ export const getLocationForEntity: ( scmIntegration: ScmIntegrationRegistry, ) => ParsedLocationAnnotation; +// @public +export const getMkdocsYml: ( + inputDir: string, + siteName?: string, +) => Promise<{ + path: string; + content: string; +}>; + // @public export type MigrateRequest = { removeOriginal?: boolean; diff --git a/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml b/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml index f6d2b01ce4..c0c5a203df 100644 --- a/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml +++ b/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml @@ -1,4 +1,4 @@ site_name: Test site name docs_dir: docs plugins: - - techdocs-core \ No newline at end of file + - techdocs-core diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index fb21643e46..158e8710f2 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -524,7 +524,7 @@ describe('helpers', () => { mockFs({ [key]: mkdocsYml }); const { path: mkdocsPath, content } = await getMkdocsYml( inputDir, - mockEntity, + mockEntity.metadata.title, ); expect(mkdocsPath).toBe(key); @@ -536,7 +536,7 @@ describe('helpers', () => { mockFs({ [key]: mkdocsYml }); const { path: mkdocsPath, content } = await getMkdocsYml( inputDir, - mockEntity, + mockEntity.metadata.title, ); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); @@ -547,7 +547,7 @@ describe('helpers', () => { mockFs({ [key]: mkdocsDefaultYml }); const { path: mkdocsPath, content } = await getMkdocsYml( inputDir, - mockEntity, + mockEntity.metadata.title, ); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsDefaultYml.toString()); @@ -555,7 +555,9 @@ describe('helpers', () => { it('throws when neither .yml nor .yaml nor default file is present', async () => { const invalidInputDir = resolvePath(__filename); - await expect(getMkdocsYml(invalidInputDir, mockEntity)).rejects.toThrow( + await expect( + getMkdocsYml(invalidInputDir, mockEntity.metadata.title), + ).rejects.toThrow( /Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml or default for validation/, ); }); diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index ebb72c420c..198b48cf00 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -150,16 +150,50 @@ export const MKDOCS_SCHEMA = DEFAULT_SCHEMA.extend([ }), ]); +/** + * Generates a mkdocs.yml configuration file + * + * @param inputDir - base dir to where the mkdocs.yml file will be created + * @param siteName - name of site to be used in mkdocs.yml for the + * required `site_name` property, default value is "Table of Contents" + */ +export const generateMkdocsYml = async ( + inputDir: string, + siteName?: string, +) => { + try { + // TODO(awanlin): Use a provided default mkdocs.yml + // from config or some specified location. If this is + // not provided then fall back to generating bare + // minimum mkdocs.yml file + + const mkdocsYmlPath = path.join(inputDir, 'mkdocs.yml'); + const defaultSiteName = siteName ?? 'Table of Contents'; + const defaultMkdocsContent = + `site_name: ${defaultSiteName}\n` + + 'docs_dir: docs\n' + + 'plugins:\n' + + ' - techdocs-core\n'; + + await fs.writeFile(mkdocsYmlPath, defaultMkdocsContent); + } catch (error) { + throw new ForwardedError('Could not generate mkdocs.yml file', error); + } +}; + /** * Finds and loads the contents of either an mkdocs.yml or mkdocs.yaml file, * depending on which is present (MkDocs supports both as of v1.2.2). + * @public * * @param inputDir - base dir to be searched for either an mkdocs.yml or * mkdocs.yaml file. + * @param siteName - name of site to be used in mkdocs.yml for the + * required `site_name` property, default value is "Table of Contents" */ export const getMkdocsYml = async ( inputDir: string, - entity: Entity, + siteName?: string, ): Promise<{ path: string; content: string }> => { let mkdocsYmlPath: string; let mkdocsYmlFileString: string; @@ -182,14 +216,8 @@ export const getMkdocsYml = async ( }; } - // No mkdocs file, use default - const defaultMkdocsContent = - `site_name: ${entity.metadata.title ?? entity.metadata.name}\n` + - 'docs_dir: docs\n' + - 'plugins:\n' + - ' - techdocs-core\n'; - - await fs.writeFile(mkdocsYmlPath, defaultMkdocsContent); + // No mkdocs file, generate it + await generateMkdocsYml(inputDir, siteName); mkdocsYmlFileString = await fs.readFile(mkdocsYmlPath, 'utf8'); } catch (error) { throw new ForwardedError( diff --git a/plugins/techdocs-node/src/stages/generate/index.ts b/plugins/techdocs-node/src/stages/generate/index.ts index 1c20c58887..3bd42643c1 100644 --- a/plugins/techdocs-node/src/stages/generate/index.ts +++ b/plugins/techdocs-node/src/stages/generate/index.ts @@ -15,6 +15,7 @@ */ export { TechdocsGenerator } from './techdocs'; export { Generators } from './generators'; +export { getMkdocsYml } from './helpers'; export type { GeneratorBase, GeneratorOptions, diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index 45b2f9689e..82857e9f73 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -96,13 +96,13 @@ export class TechdocsGenerator implements GeneratorBase { etag, logger: childLogger, logStream, - entity, + siteName, } = options; // Do some updates to mkdocs.yml before generating docs e.g. adding repo_url const { path: mkdocsYmlPath, content } = await getMkdocsYml( inputDir, - entity, + siteName, ); // validate the docs_dir first diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index 26c26f4410..86f8f96d44 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -53,6 +53,7 @@ export type GeneratorConfig = { * @param etag - A unique identifier for the prepared tree e.g. commit SHA. If provided it will be stored in techdocs_metadata.json. * @param logger - A logger that forwards the messages to the caller to be displayed outside of the backend. * @param logStream - A log stream that can send raw log messages to the caller to be displayed outside of the backend. + * @param siteName - Name of the site to be used in mkdocs.yml for the required `site_name` property, default value is "Table of Contents" */ export type GeneratorRunOptions = { inputDir: string; @@ -61,7 +62,7 @@ export type GeneratorRunOptions = { etag?: string; logger: Logger; logStream?: Writable; - entity: Entity; + siteName?: string; }; /** From 943c245b6f05bd499028cfd79c0d36579c948faa Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 10 Jan 2023 13:54:02 -0600 Subject: [PATCH 90/98] Updated to use siteOptions object Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .../techdocs-cli/src/commands/generate/generate.ts | 2 +- plugins/techdocs-backend/src/DocsBuilder/builder.ts | 4 +++- .../src/stages/generate/helpers.test.ts | 13 +++++++------ .../techdocs-node/src/stages/generate/helpers.ts | 8 ++++---- .../techdocs-node/src/stages/generate/techdocs.ts | 4 ++-- plugins/techdocs-node/src/stages/generate/types.ts | 2 +- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index c409992050..53735d628a 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -106,7 +106,7 @@ export default async function generate(opts: OptionValues) { logger, etag: opts.etag, ...(process.env.LOG_LEVEL === 'debug' ? { logStream: stdout } : {}), - siteName: opts.siteName, + siteOptions: { name: opts.siteName }, }); logger.info('Done!'); diff --git a/plugins/techdocs-backend/src/DocsBuilder/builder.ts b/plugins/techdocs-backend/src/DocsBuilder/builder.ts index 43d05f7b6f..b4c2d2ee26 100644 --- a/plugins/techdocs-backend/src/DocsBuilder/builder.ts +++ b/plugins/techdocs-backend/src/DocsBuilder/builder.ts @@ -186,7 +186,9 @@ export class DocsBuilder { etag: newEtag, logger: this.logger, logStream: this.logStream, - siteName: this.entity.metadata.title ?? this.entity.metadata.name, + siteOptions: { + name: this.entity.metadata.title ?? this.entity.metadata.name, + }, }); // Remove Prepared directory since it is no longer needed. diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index 158e8710f2..a7fa11f3fd 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -518,13 +518,16 @@ describe('helpers', () => { describe('getMkdocsYml', () => { const inputDir = resolvePath(__filename, '../__fixtures__/'); + const siteOptions = { + name: mockEntity.metadata.title, + }; it('returns expected contents when .yml file is present', async () => { const key = path.join(inputDir, 'mkdocs.yml'); mockFs({ [key]: mkdocsYml }); const { path: mkdocsPath, content } = await getMkdocsYml( inputDir, - mockEntity.metadata.title, + siteOptions, ); expect(mkdocsPath).toBe(key); @@ -536,7 +539,7 @@ describe('helpers', () => { mockFs({ [key]: mkdocsYml }); const { path: mkdocsPath, content } = await getMkdocsYml( inputDir, - mockEntity.metadata.title, + siteOptions, ); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); @@ -547,7 +550,7 @@ describe('helpers', () => { mockFs({ [key]: mkdocsDefaultYml }); const { path: mkdocsPath, content } = await getMkdocsYml( inputDir, - mockEntity.metadata.title, + siteOptions, ); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsDefaultYml.toString()); @@ -555,9 +558,7 @@ describe('helpers', () => { it('throws when neither .yml nor .yaml nor default file is present', async () => { const invalidInputDir = resolvePath(__filename); - await expect( - getMkdocsYml(invalidInputDir, mockEntity.metadata.title), - ).rejects.toThrow( + await expect(getMkdocsYml(invalidInputDir, siteOptions)).rejects.toThrow( /Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml or default for validation/, ); }); diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index 198b48cf00..ee0ba8b6fd 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -159,7 +159,7 @@ export const MKDOCS_SCHEMA = DEFAULT_SCHEMA.extend([ */ export const generateMkdocsYml = async ( inputDir: string, - siteName?: string, + siteOptions?: { name?: string }, ) => { try { // TODO(awanlin): Use a provided default mkdocs.yml @@ -168,7 +168,7 @@ export const generateMkdocsYml = async ( // minimum mkdocs.yml file const mkdocsYmlPath = path.join(inputDir, 'mkdocs.yml'); - const defaultSiteName = siteName ?? 'Table of Contents'; + const defaultSiteName = siteOptions?.name ?? 'Table of Contents'; const defaultMkdocsContent = `site_name: ${defaultSiteName}\n` + 'docs_dir: docs\n' + @@ -193,7 +193,7 @@ export const generateMkdocsYml = async ( */ export const getMkdocsYml = async ( inputDir: string, - siteName?: string, + siteOptions?: { name?: string }, ): Promise<{ path: string; content: string }> => { let mkdocsYmlPath: string; let mkdocsYmlFileString: string; @@ -217,7 +217,7 @@ export const getMkdocsYml = async ( } // No mkdocs file, generate it - await generateMkdocsYml(inputDir, siteName); + await generateMkdocsYml(inputDir, siteOptions); mkdocsYmlFileString = await fs.readFile(mkdocsYmlPath, 'utf8'); } catch (error) { throw new ForwardedError( diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index 82857e9f73..b71148060e 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -96,13 +96,13 @@ export class TechdocsGenerator implements GeneratorBase { etag, logger: childLogger, logStream, - siteName, + siteOptions, } = options; // Do some updates to mkdocs.yml before generating docs e.g. adding repo_url const { path: mkdocsYmlPath, content } = await getMkdocsYml( inputDir, - siteName, + siteOptions, ); // validate the docs_dir first diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index 86f8f96d44..4c1f074797 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -62,7 +62,7 @@ export type GeneratorRunOptions = { etag?: string; logger: Logger; logStream?: Writable; - siteName?: string; + siteOptions?: { name?: string }; }; /** From 591dc81ff8ae46956b25e38859b6c89e5b02980d Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 10 Jan 2023 13:57:19 -0600 Subject: [PATCH 91/98] Update API Report Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- plugins/techdocs-node/api-report.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index 68a7b80152..12c918a047 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -54,7 +54,9 @@ export type GeneratorRunOptions = { etag?: string; logger: Logger; logStream?: Writable; - siteName?: string; + siteOptions?: { + name?: string; + }; }; // @public @@ -89,7 +91,9 @@ export const getLocationForEntity: ( // @public export const getMkdocsYml: ( inputDir: string, - siteName?: string, + siteOptions?: { + name?: string; + }, ) => Promise<{ path: string; content: string; From c9758fe81ecc0be18d6802d1a35c757eccd0f952 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 10 Jan 2023 14:16:53 -0600 Subject: [PATCH 92/98] Updated default name and params Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- packages/techdocs-cli/src/commands/index.ts | 6 +++--- .../techdocs-node/src/stages/generate/helpers.ts | 13 ++++++------- plugins/techdocs-node/src/stages/generate/types.ts | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/techdocs-cli/src/commands/index.ts b/packages/techdocs-cli/src/commands/index.ts index 0ff52eee36..102e6d87de 100644 --- a/packages/techdocs-cli/src/commands/index.ts +++ b/packages/techdocs-cli/src/commands/index.ts @@ -57,7 +57,7 @@ export function registerCommands(program: Command) { .option( '--site-name', 'Name for site when using default MkDocs config', - 'Table of Contents', + 'Documentation Site', ) .option('-v --verbose', 'Enable verbose output.', false) .option( @@ -232,7 +232,7 @@ export function registerCommands(program: Command) { .option( '--site-name', 'Name for site when using default MkDocs config', - 'Table of Contents', + 'Documentation Site', ) .option('-p, --port ', 'Port to serve documentation locally', '8000') .option('-v --verbose', 'Enable verbose output.', false) @@ -263,7 +263,7 @@ export function registerCommands(program: Command) { .option( '--site-name', 'Name for site when using default MkDocs config', - 'Table of Contents', + 'Documentation Site', ) .option('--mkdocs-port ', 'Port for MkDocs server to use', '8000') .option('-v --verbose', 'Enable verbose output.', false) diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index ee0ba8b6fd..5fc74eafc2 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -154,8 +154,8 @@ export const MKDOCS_SCHEMA = DEFAULT_SCHEMA.extend([ * Generates a mkdocs.yml configuration file * * @param inputDir - base dir to where the mkdocs.yml file will be created - * @param siteName - name of site to be used in mkdocs.yml for the - * required `site_name` property, default value is "Table of Contents" + * @param siteOptions - options for the site: `name` property will be used in mkdocs.yml for the + * required `site_name` property, default value is "Documentation Site" */ export const generateMkdocsYml = async ( inputDir: string, @@ -168,7 +168,7 @@ export const generateMkdocsYml = async ( // minimum mkdocs.yml file const mkdocsYmlPath = path.join(inputDir, 'mkdocs.yml'); - const defaultSiteName = siteOptions?.name ?? 'Table of Contents'; + const defaultSiteName = siteOptions?.name ?? 'Documentation Site'; const defaultMkdocsContent = `site_name: ${defaultSiteName}\n` + 'docs_dir: docs\n' + @@ -186,10 +186,9 @@ export const generateMkdocsYml = async ( * depending on which is present (MkDocs supports both as of v1.2.2). * @public * - * @param inputDir - base dir to be searched for either an mkdocs.yml or - * mkdocs.yaml file. - * @param siteName - name of site to be used in mkdocs.yml for the - * required `site_name` property, default value is "Table of Contents" + * @param inputDir - base dir to be searched for either an mkdocs.yml or mkdocs.yaml file. + * @param siteOptions - options for the site: `name` property will be used in mkdocs.yml for the + * required `site_name` property, default value is "Documentation Site" */ export const getMkdocsYml = async ( inputDir: string, diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index 4c1f074797..1d0c6bb8f2 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -53,7 +53,7 @@ export type GeneratorConfig = { * @param etag - A unique identifier for the prepared tree e.g. commit SHA. If provided it will be stored in techdocs_metadata.json. * @param logger - A logger that forwards the messages to the caller to be displayed outside of the backend. * @param logStream - A log stream that can send raw log messages to the caller to be displayed outside of the backend. - * @param siteName - Name of the site to be used in mkdocs.yml for the required `site_name` property, default value is "Table of Contents" + * @param siteOptions - Options for the site: The `name` property will be used in mkdocs.yml config for the required `site_name` property, default value is "Documentation Site" */ export type GeneratorRunOptions = { inputDir: string; From 248d1242bd27421621fcaed8cf54c28088bcd9c0 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:44:05 -0600 Subject: [PATCH 93/98] Added property to track if config exists already Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .../generate/__fixtures__/mkdocs_default.yml | 2 +- .../src/stages/generate/helpers.test.ts | 37 +++++++++++++------ .../src/stages/generate/helpers.ts | 5 ++- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml b/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml index c0c5a203df..460e5c0e1d 100644 --- a/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml +++ b/plugins/techdocs-node/src/stages/generate/__fixtures__/mkdocs_default.yml @@ -1,4 +1,4 @@ -site_name: Test site name +site_name: Default Test site name docs_dir: docs plugins: - techdocs-core diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index a7fa11f3fd..186a685a90 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -190,6 +190,7 @@ describe('helpers', () => { beforeEach(() => { mockFs({ '/mkdocs.yml': mkdocsYml, + '/mkdocs_default.yml': mkdocsDefaultYml, '/mkdocs_with_repo_url.yml': mkdocsYmlWithRepoUrl, '/mkdocs_with_edit_uri.yml': mkdocsYmlWithEditUri, '/mkdocs_with_extensions.yml': mkdocsYmlWithExtensions, @@ -525,35 +526,47 @@ describe('helpers', () => { it('returns expected contents when .yml file is present', async () => { const key = path.join(inputDir, 'mkdocs.yml'); mockFs({ [key]: mkdocsYml }); - const { path: mkdocsPath, content } = await getMkdocsYml( - inputDir, - siteOptions, - ); + const { + path: mkdocsPath, + content, + configExists, + } = await getMkdocsYml(inputDir, siteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); + expect(configExists).toBe(true); }); it('returns expected contents when .yaml file is present', async () => { const key = path.join(inputDir, 'mkdocs.yaml'); mockFs({ [key]: mkdocsYml }); - const { path: mkdocsPath, content } = await getMkdocsYml( - inputDir, - siteOptions, - ); + const { + path: mkdocsPath, + content, + configExists, + } = await getMkdocsYml(inputDir, siteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); + expect(configExists).toBe(true); }); it('returns expected contents when default file is present', async () => { + const defaultSiteOptions = { + name: 'Default Test site name', + }; const key = path.join(inputDir, 'mkdocs.yml'); + const mockPathExists = jest.spyOn(fs, 'pathExists'); + mockPathExists.mockImplementation(() => Promise.resolve(false)); mockFs({ [key]: mkdocsDefaultYml }); - const { path: mkdocsPath, content } = await getMkdocsYml( - inputDir, - siteOptions, - ); + const { + path: mkdocsPath, + content, + configExists, + } = await getMkdocsYml(inputDir, defaultSiteOptions); + expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsDefaultYml.toString()); + expect(configExists).toBe(false); }); it('throws when neither .yml nor .yaml nor default file is present', async () => { diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index 5fc74eafc2..2f53e125f8 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -193,7 +193,7 @@ export const generateMkdocsYml = async ( export const getMkdocsYml = async ( inputDir: string, siteOptions?: { name?: string }, -): Promise<{ path: string; content: string }> => { +): Promise<{ path: string; content: string; configExists: boolean }> => { let mkdocsYmlPath: string; let mkdocsYmlFileString: string; try { @@ -203,6 +203,7 @@ export const getMkdocsYml = async ( return { path: mkdocsYmlPath, content: mkdocsYmlFileString, + configExists: true, }; } @@ -212,6 +213,7 @@ export const getMkdocsYml = async ( return { path: mkdocsYmlPath, content: mkdocsYmlFileString, + configExists: true, }; } @@ -228,6 +230,7 @@ export const getMkdocsYml = async ( return { path: mkdocsYmlPath, content: mkdocsYmlFileString, + configExists: false, }; }; From 6d612acd95e5fb83ca7163392b54468e016795b7 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 17 Jan 2023 12:53:54 -0600 Subject: [PATCH 94/98] Updated api report Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- plugins/techdocs-node/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index 12c918a047..2aff8e82bb 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -97,6 +97,7 @@ export const getMkdocsYml: ( ) => Promise<{ path: string; content: string; + configExists: boolean; }>; // @public From 8e11504ce346e9e93ca7d5c721523f9d51845b9a Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 17 Jan 2023 13:20:45 -0600 Subject: [PATCH 95/98] Use object for YAML file Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .../src/stages/generate/helpers.ts | 17 ++++++++++------- .../techdocs-node/src/stages/generate/types.ts | 6 ++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index 2f53e125f8..c0a82da510 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -26,7 +26,7 @@ import path, { resolve as resolvePath } from 'path'; import { PassThrough, Writable } from 'stream'; import { Logger } from 'winston'; import { ParsedLocationAnnotation } from '../../helpers'; -import { SupportedGeneratorKey } from './types'; +import { DefaultMkdocsContent, SupportedGeneratorKey } from './types'; import { getFileTreeRecursively } from '../publish/helpers'; // TODO: Implement proper support for more generators. @@ -169,13 +169,16 @@ export const generateMkdocsYml = async ( const mkdocsYmlPath = path.join(inputDir, 'mkdocs.yml'); const defaultSiteName = siteOptions?.name ?? 'Documentation Site'; - const defaultMkdocsContent = - `site_name: ${defaultSiteName}\n` + - 'docs_dir: docs\n' + - 'plugins:\n' + - ' - techdocs-core\n'; + const defaultMkdocsContent: DefaultMkdocsContent = { + site_name: defaultSiteName, + docs_dir: 'docs', + plugins: ['techdocs-core'], + }; - await fs.writeFile(mkdocsYmlPath, defaultMkdocsContent); + await fs.writeFile( + mkdocsYmlPath, + yaml.dump(defaultMkdocsContent, { schema: MKDOCS_SCHEMA }), + ); } catch (error) { throw new ForwardedError('Could not generate mkdocs.yml file', error); } diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index 1d0c6bb8f2..70c332344a 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -91,3 +91,9 @@ export type GeneratorBuilder = { register(protocol: SupportedGeneratorKey, generator: GeneratorBase): void; get(entity: Entity): GeneratorBase; }; + +export type DefaultMkdocsContent = { + site_name: string; + docs_dir: string; + plugins: String[]; +}; From c2bba4affe41c769f3021359236449204f9d41f0 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:58:28 -0600 Subject: [PATCH 96/98] Rename configExists to configIsTemporary Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- plugins/techdocs-node/api-report.md | 2 +- .../src/stages/generate/helpers.test.ts | 12 ++++++------ plugins/techdocs-node/src/stages/generate/helpers.ts | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index 2aff8e82bb..314a46a405 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -97,7 +97,7 @@ export const getMkdocsYml: ( ) => Promise<{ path: string; content: string; - configExists: boolean; + configIsTemporary: boolean; }>; // @public diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index 186a685a90..aad7706ab1 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -529,12 +529,12 @@ describe('helpers', () => { const { path: mkdocsPath, content, - configExists, + configIsTemporary, } = await getMkdocsYml(inputDir, siteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); - expect(configExists).toBe(true); + expect(configIsTemporary).toBe(false); }); it('returns expected contents when .yaml file is present', async () => { @@ -543,11 +543,11 @@ describe('helpers', () => { const { path: mkdocsPath, content, - configExists, + configIsTemporary, } = await getMkdocsYml(inputDir, siteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); - expect(configExists).toBe(true); + expect(configIsTemporary).toBe(false); }); it('returns expected contents when default file is present', async () => { @@ -561,12 +561,12 @@ describe('helpers', () => { const { path: mkdocsPath, content, - configExists, + configIsTemporary, } = await getMkdocsYml(inputDir, defaultSiteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsDefaultYml.toString()); - expect(configExists).toBe(false); + expect(configIsTemporary).toBe(true); }); it('throws when neither .yml nor .yaml nor default file is present', async () => { diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index c0a82da510..e16293f906 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -196,7 +196,7 @@ export const generateMkdocsYml = async ( export const getMkdocsYml = async ( inputDir: string, siteOptions?: { name?: string }, -): Promise<{ path: string; content: string; configExists: boolean }> => { +): Promise<{ path: string; content: string; configIsTemporary: boolean }> => { let mkdocsYmlPath: string; let mkdocsYmlFileString: string; try { @@ -206,7 +206,7 @@ export const getMkdocsYml = async ( return { path: mkdocsYmlPath, content: mkdocsYmlFileString, - configExists: true, + configIsTemporary: false, }; } @@ -216,7 +216,7 @@ export const getMkdocsYml = async ( return { path: mkdocsYmlPath, content: mkdocsYmlFileString, - configExists: true, + configIsTemporary: false, }; } @@ -233,7 +233,7 @@ export const getMkdocsYml = async ( return { path: mkdocsYmlPath, content: mkdocsYmlFileString, - configExists: false, + configIsTemporary: true, }; }; From 37c17ab92c6bfd78e5006206a6b546d042df65c4 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Wed, 25 Jan 2023 14:37:01 -0600 Subject: [PATCH 97/98] Handle deleting temportary mkdocs.yml Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .../techdocs-cli/src/commands/generate/generate.ts | 11 +++++++++++ packages/techdocs-cli/src/commands/serve/mkdocs.ts | 14 ++++++++++++-- packages/techdocs-cli/src/commands/serve/serve.ts | 14 ++++++++++++-- .../src/stages/generate/helpers.test.ts | 12 ++++++------ .../techdocs-node/src/stages/generate/helpers.ts | 2 +- plugins/techdocs-node/src/stages/generate/index.ts | 2 +- .../techdocs-node/src/stages/generate/techdocs.ts | 4 ++-- 7 files changed, 45 insertions(+), 14 deletions(-) diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index 53735d628a..8445dd9ec6 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -21,6 +21,7 @@ import Docker from 'dockerode'; import { TechdocsGenerator, ParsedLocationAnnotation, + getMkDocsYml, } from '@backstage/plugin-techdocs-node'; import { ContainerRunner, @@ -54,6 +55,10 @@ export default async function generate(opts: OptionValues) { await fs.ensureDir(outputDir); + const { path: mkDocsYmlPath, configIsTemporary } = await getMkDocsYml( + sourceDir, + ); + const config = new ConfigReader({ techdocs: { generator: { @@ -109,5 +114,11 @@ export default async function generate(opts: OptionValues) { siteOptions: { name: opts.siteName }, }); + if (configIsTemporary) { + process.on('exit', async () => { + fs.rmSync(mkDocsYmlPath, {}); + }); + } + logger.info('Done!'); } diff --git a/packages/techdocs-cli/src/commands/serve/mkdocs.ts b/packages/techdocs-cli/src/commands/serve/mkdocs.ts index 6c84298c2b..1a471cf1a6 100644 --- a/packages/techdocs-cli/src/commands/serve/mkdocs.ts +++ b/packages/techdocs-cli/src/commands/serve/mkdocs.ts @@ -19,7 +19,8 @@ import openBrowser from 'react-dev-utils/openBrowser'; import { createLogger } from '../../lib/utility'; import { runMkdocsServer } from '../../lib/mkdocsServer'; import { LogFunc, waitForSignal } from '../../lib/run'; -import { getMkdocsYml } from '@backstage/plugin-techdocs-node'; +import { getMkDocsYml } from '@backstage/plugin-techdocs-node'; +import fs from 'fs-extra'; export default async function serveMkdocs(opts: OptionValues) { const logger = createLogger({ verbose: opts.verbose }); @@ -28,7 +29,10 @@ export default async function serveMkdocs(opts: OptionValues) { const localAddr = `http://127.0.0.1:${opts.port}`; const expectedDevAddr = opts.docker ? dockerAddr : localAddr; - await getMkdocsYml('./', opts.siteName); + const { path: mkDocsYmlPath, configIsTemporary } = await getMkDocsYml( + './', + opts.siteName, + ); // We want to open browser only once based on a log. let boolOpenBrowserTriggered = false; @@ -74,4 +78,10 @@ export default async function serveMkdocs(opts: OptionValues) { // Keep waiting for user to cancel the process await waitForSignal([childProcess]); + + if (configIsTemporary) { + process.on('exit', async () => { + fs.rmSync(mkDocsYmlPath, {}); + }); + } } diff --git a/packages/techdocs-cli/src/commands/serve/serve.ts b/packages/techdocs-cli/src/commands/serve/serve.ts index 1e835c2c8d..48e48d4f66 100644 --- a/packages/techdocs-cli/src/commands/serve/serve.ts +++ b/packages/techdocs-cli/src/commands/serve/serve.ts @@ -22,7 +22,8 @@ import HTTPServer from '../../lib/httpServer'; import { runMkdocsServer } from '../../lib/mkdocsServer'; import { LogFunc, waitForSignal } from '../../lib/run'; import { createLogger } from '../../lib/utility'; -import { getMkdocsYml } from '@backstage/plugin-techdocs-node'; +import { getMkDocsYml } from '@backstage/plugin-techdocs-node'; +import fs from 'fs-extra'; function findPreviewBundlePath(): string { try { @@ -65,7 +66,10 @@ export default async function serve(opts: OptionValues) { ? mkdocsDockerAddr : mkdocsLocalAddr; - await getMkdocsYml('./', opts.siteName); + const { path: mkDocsYmlPath, configIsTemporary } = await getMkDocsYml( + './', + opts.siteName, + ); let mkdocsServerHasStarted = false; const mkdocsLogFunc: LogFunc = data => { @@ -143,4 +147,10 @@ export default async function serve(opts: OptionValues) { }); await waitForSignal([mkdocsChildProcess]); + + if (configIsTemporary) { + process.on('exit', async () => { + fs.rmSync(mkDocsYmlPath, {}); + }); + } } diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index aad7706ab1..e635542a7c 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -25,7 +25,7 @@ import { ParsedLocationAnnotation } from '../../helpers'; import { createOrUpdateMetadata, getGeneratorKey, - getMkdocsYml, + getMkDocsYml, getRepoUrlFromLocationAnnotation, patchIndexPreBuild, storeEtagMetadata, @@ -517,7 +517,7 @@ describe('helpers', () => { }); }); - describe('getMkdocsYml', () => { + describe('getMkDocsYml', () => { const inputDir = resolvePath(__filename, '../__fixtures__/'); const siteOptions = { name: mockEntity.metadata.title, @@ -530,7 +530,7 @@ describe('helpers', () => { path: mkdocsPath, content, configIsTemporary, - } = await getMkdocsYml(inputDir, siteOptions); + } = await getMkDocsYml(inputDir, siteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); @@ -544,7 +544,7 @@ describe('helpers', () => { path: mkdocsPath, content, configIsTemporary, - } = await getMkdocsYml(inputDir, siteOptions); + } = await getMkDocsYml(inputDir, siteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsYml.toString()); expect(configIsTemporary).toBe(false); @@ -562,7 +562,7 @@ describe('helpers', () => { path: mkdocsPath, content, configIsTemporary, - } = await getMkdocsYml(inputDir, defaultSiteOptions); + } = await getMkDocsYml(inputDir, defaultSiteOptions); expect(mkdocsPath).toBe(key); expect(content).toBe(mkdocsDefaultYml.toString()); @@ -571,7 +571,7 @@ describe('helpers', () => { it('throws when neither .yml nor .yaml nor default file is present', async () => { const invalidInputDir = resolvePath(__filename); - await expect(getMkdocsYml(invalidInputDir, siteOptions)).rejects.toThrow( + await expect(getMkDocsYml(invalidInputDir, siteOptions)).rejects.toThrow( /Could not read MkDocs YAML config file mkdocs.yml or mkdocs.yaml or default for validation/, ); }); diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts index e16293f906..27c24ea66e 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.ts @@ -193,7 +193,7 @@ export const generateMkdocsYml = async ( * @param siteOptions - options for the site: `name` property will be used in mkdocs.yml for the * required `site_name` property, default value is "Documentation Site" */ -export const getMkdocsYml = async ( +export const getMkDocsYml = async ( inputDir: string, siteOptions?: { name?: string }, ): Promise<{ path: string; content: string; configIsTemporary: boolean }> => { diff --git a/plugins/techdocs-node/src/stages/generate/index.ts b/plugins/techdocs-node/src/stages/generate/index.ts index 3bd42643c1..fa36486a0f 100644 --- a/plugins/techdocs-node/src/stages/generate/index.ts +++ b/plugins/techdocs-node/src/stages/generate/index.ts @@ -15,7 +15,7 @@ */ export { TechdocsGenerator } from './techdocs'; export { Generators } from './generators'; -export { getMkdocsYml } from './helpers'; +export { getMkDocsYml } from './helpers'; export type { GeneratorBase, GeneratorOptions, diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index b71148060e..93285b7468 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -24,7 +24,7 @@ import { } from '@backstage/integration'; import { createOrUpdateMetadata, - getMkdocsYml, + getMkDocsYml, patchIndexPreBuild, runCommand, storeEtagMetadata, @@ -100,7 +100,7 @@ export class TechdocsGenerator implements GeneratorBase { } = options; // Do some updates to mkdocs.yml before generating docs e.g. adding repo_url - const { path: mkdocsYmlPath, content } = await getMkdocsYml( + const { path: mkdocsYmlPath, content } = await getMkDocsYml( inputDir, siteOptions, ); From 43d409fed42ef0e2f2ccf5d93111c420e37b6099 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Wed, 25 Jan 2023 14:49:13 -0600 Subject: [PATCH 98/98] Updated API Report Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- plugins/techdocs-node/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index 314a46a405..ce5bd1ae09 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -89,7 +89,7 @@ export const getLocationForEntity: ( ) => ParsedLocationAnnotation; // @public -export const getMkdocsYml: ( +export const getMkDocsYml: ( inputDir: string, siteOptions?: { name?: string;