From 833dbea4df1435aaa9e9d31b184045c153f5af98 Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 12:43:31 +0200 Subject: [PATCH 001/590] Make the color of the Entity Context Menu icon configurable Signed-off-by: Olivier Liechti --- .../EntityContextMenu/EntityContextMenu.tsx | 17 +++++++++++------ .../src/components/EntityContextMenu/index.ts | 18 ++++++++++++++++++ plugins/catalog/src/overridableComponents.ts | 2 ++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 plugins/catalog/src/components/EntityContextMenu/index.ts diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 5664186ab1..0059d3118c 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -32,12 +32,17 @@ import { IconComponent } from '@backstage/core-plugin-api'; import { useEntityPermission } from '@backstage/plugin-catalog-react'; import { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common'; -// TODO(freben): It should probably instead be the case that Header sets the theme text color to white inside itself unconditionally instead -const useStyles = makeStyles({ - button: { - color: 'white', - }, -}); +/** @public */ +export type EntityContextMenuClassKey = 'button'; + +const useStyles = makeStyles( + theme => ({ + button: { + color: 'white', + }, + }), + { name: 'PluginCatalogEntityContextMenu' }, +); // NOTE(freben): Intentionally not exported at this point, since it's part of // the unstable extra context menu items concept below diff --git a/plugins/catalog/src/components/EntityContextMenu/index.ts b/plugins/catalog/src/components/EntityContextMenu/index.ts new file mode 100644 index 0000000000..4a2deb20b4 --- /dev/null +++ b/plugins/catalog/src/components/EntityContextMenu/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2021 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 { EntityContextMenu } from './EntityContextMenu'; +export type { EntityContextMenuClassKey } from './EntityContextMenu'; diff --git a/plugins/catalog/src/overridableComponents.ts b/plugins/catalog/src/overridableComponents.ts index e76aafbb68..5cd82202d5 100644 --- a/plugins/catalog/src/overridableComponents.ts +++ b/plugins/catalog/src/overridableComponents.ts @@ -18,11 +18,13 @@ import { StyleRules } from '@material-ui/core/styles/withStyles'; import { EntityLinksEmptyStateClassKey } from './components/EntityLinksCard'; import { SystemDiagramCardClassKey } from './components/SystemDiagramCard'; +import { EntityContextMenuClassKey } from './components/EntityContextMenu'; /** @public */ export type PluginCatalogComponentsNameToClassKey = { PluginCatalogEntityLinksEmptyState: EntityLinksEmptyStateClassKey; PluginCatalogSystemDiagramCard: SystemDiagramCardClassKey; + PluginCatalogEntityContextMenu: EntityContextMenuClassKey; }; /** @public */ From a5d73da942a3f33584326068b453f737dae0dd12 Mon Sep 17 00:00:00 2001 From: Mengnan Gong Date: Fri, 3 Jun 2022 14:26:51 +0800 Subject: [PATCH 002/590] techdocs-cli: fix the legacyCopyReadmeMdToIndexMd flag in techdocs-cli generate Signed-off-by: Mengnan Gong --- .changeset/happy-boxes-melt.md | 6 ++++++ packages/techdocs-cli/src/commands/generate/generate.ts | 2 +- plugins/techdocs-node/src/stages/generate/techdocs.ts | 6 +++--- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/happy-boxes-melt.md diff --git a/.changeset/happy-boxes-melt.md b/.changeset/happy-boxes-melt.md new file mode 100644 index 0000000000..c478e783d3 --- /dev/null +++ b/.changeset/happy-boxes-melt.md @@ -0,0 +1,6 @@ +--- +'@techdocs/cli': patch +'@backstage/plugin-techdocs-node': patch +--- + +Fix the flag parsing for `legacyCopyReadmeMdToIndexMd` in `techdocs-cli generate` command, and decouple it's logic from the `techdocs-ref` flag. diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index 309b9c7969..1e4ed220d9 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -57,8 +57,8 @@ export default async function generate(opts: OptionValues) { runIn: opts.docker ? 'docker' : 'local', dockerImage, pullImage, - legacyCopyReadmeMdToIndexMd, mkdocs: { + legacyCopyReadmeMdToIndexMd, omitTechdocsCorePlugin, }, }, diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index 660b8e8cb5..e3debab526 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -111,10 +111,10 @@ export class TechdocsGenerator implements GeneratorBase { parsedLocationAnnotation, this.scmIntegrations, ); + } - if (this.options.legacyCopyReadmeMdToIndexMd) { - await patchIndexPreBuild({ inputDir, logger: childLogger, docsDir }); - } + if (this.options.legacyCopyReadmeMdToIndexMd) { + await patchIndexPreBuild({ inputDir, logger: childLogger, docsDir }); } if (!this.options.omitTechdocsCoreMkdocsPlugin) { From d996458580de4b63f9c07ebacac98626efab4125 Mon Sep 17 00:00:00 2001 From: sjeyaraman Date: Sun, 5 Jun 2022 12:40:43 -0700 Subject: [PATCH 003/590] customize unregister entity menuitem Signed-off-by: sjeyaraman --- .../app/src/components/catalog/EntityPage.tsx | 15 ++++++- .../EntityContextMenu.test.tsx | 25 ++++++++++- .../EntityContextMenu/EntityContextMenu.tsx | 43 +++++++++++++------ .../components/EntityLayout/EntityLayout.tsx | 4 +- 4 files changed, 70 insertions(+), 17 deletions(-) diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 799fe3e4d9..ab8c02c168 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -161,9 +161,22 @@ const EntityLayoutWrapper = (props: { children?: ReactNode }) => { ]; }, []); + type VisibleType = 'visible' | 'hidden' | 'disabled'; + + type contextMenuOptions = { + disableUnregister: boolean | VisibleType; + }; + + const options: contextMenuOptions = { + disableUnregister: false, + }; + return ( <> - + {props.children} { it('should call onUnregisterEntity on button click', async () => { const mockCallback = jest.fn(); - await render( { expect(mockCallback).toBeCalled(); }); + it('check Unregister entity button is disabled', async () => { + const mockCallback = jest.fn(); + + const { getByText } = await render( + {}} + />, + ); + + const button = await screen.findByTestId('menu-button'); + expect(button).toBeInTheDocument(); + fireEvent.click(button); + + const unregister = await screen.getByText('Unregister entity'); + expect(unregister).toBeInTheDocument(); + + const unregisterSpanItem = getByText(/Unregister entity/); + const unregisterMenuListItem = + unregisterSpanItem?.parentElement?.parentElement; + expect(unregisterMenuListItem).toHaveAttribute('aria-disabled'); + }); + it('should call onInspectEntity on button click', async () => { const mockCallback = jest.fn(); diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 5664186ab1..955c42b95a 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -47,9 +47,11 @@ interface ExtraContextMenuItem { onClick: () => void; } +type VisibleType = 'visible' | 'hidden' | 'disabled'; + // unstable context menu option, eg: disable the unregister entity menu interface contextMenuOptions { - disableUnregister: boolean; + disableUnregister: boolean | VisibleType; } interface EntityContextMenuProps { @@ -98,11 +100,35 @@ export function EntityContextMenu(props: EntityContextMenuProps) { , ]; + const isBoolean = + typeof UNSTABLE_contextMenuOptions?.disableUnregister === 'boolean'; + const disableUnregister = (!unregisterPermission.allowed || - UNSTABLE_contextMenuOptions?.disableUnregister) ?? + (isBoolean + ? UNSTABLE_contextMenuOptions?.disableUnregister + : UNSTABLE_contextMenuOptions?.disableUnregister === 'disabled')) ?? false; + let unregisterButton = <>; + + if (UNSTABLE_contextMenuOptions?.disableUnregister !== 'hidden') { + unregisterButton = ( + { + onClose(); + onUnregisterEntity(); + }} + disabled={disableUnregister} + > + + + + + + ); + } + return ( <> {extraItems} - { - onClose(); - onUnregisterEntity(); - }} - disabled={disableUnregister} - > - - - - - + {unregisterButton} { onClose(); diff --git a/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx b/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx index 693137fe21..4cbb72db5c 100644 --- a/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx +++ b/plugins/catalog/src/components/EntityLayout/EntityLayout.tsx @@ -142,9 +142,11 @@ interface ExtraContextMenuItem { onClick: () => void; } +type VisibleType = 'visible' | 'hidden' | 'disabled'; + // unstable context menu option, eg: disable the unregister entity menu interface contextMenuOptions { - disableUnregister: boolean; + disableUnregister: boolean | VisibleType; } /** @public */ From 9083fae0885053988fed87d64c124f1a6e70ba47 Mon Sep 17 00:00:00 2001 From: sjeyaraman Date: Sun, 5 Jun 2022 17:10:23 -0700 Subject: [PATCH 004/590] add-change-set Signed-off-by: sjeyaraman --- .changeset/cold-apples-film.md | 9 +++++++++ packages/app/src/components/catalog/EntityPage.tsx | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .changeset/cold-apples-film.md diff --git a/.changeset/cold-apples-film.md b/.changeset/cold-apples-film.md new file mode 100644 index 0000000000..d8c7ec283d --- /dev/null +++ b/.changeset/cold-apples-film.md @@ -0,0 +1,9 @@ +--- +'example-app': patch +'@backstage/plugin-catalog': patch +--- + +Adding ability to customize the "unregister entity" menu item in the entity context menu on the entity page with options 'visible','hidden','disabled'. +With this three new options, one can hide the "unregister entity" menu item from the list, disable or keep it enabled. + +The boolean input for "unregister entity" will be deprecated later in favour of the above three options. diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index ab8c02c168..fc17ccf909 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -168,7 +168,7 @@ const EntityLayoutWrapper = (props: { children?: ReactNode }) => { }; const options: contextMenuOptions = { - disableUnregister: false, + disableUnregister: 'visible', }; return ( From 961b1ba24ffe38787a2d78db85a1537cf38cd18b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 8 Jun 2022 10:08:45 +0000 Subject: [PATCH 005/590] fix(deps): update dependency glob to v8 Signed-off-by: Renovate Bot --- .changeset/renovate-5618e69.md | 6 ++++++ packages/cli/package.json | 2 +- plugins/catalog-backend/package.json | 2 +- yarn.lock | 11 +++++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .changeset/renovate-5618e69.md diff --git a/.changeset/renovate-5618e69.md b/.changeset/renovate-5618e69.md new file mode 100644 index 0000000000..7745c5e157 --- /dev/null +++ b/.changeset/renovate-5618e69.md @@ -0,0 +1,6 @@ +--- +'@backstage/cli': patch +'@backstage/plugin-catalog-backend': patch +--- + +Updated dependency `glob` to `^8.0.0`. diff --git a/packages/cli/package.json b/packages/cli/package.json index df779d5526..12865bc326 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -82,7 +82,7 @@ "express": "^4.17.1", "fork-ts-checker-webpack-plugin": "^7.0.0-alpha.8", "fs-extra": "10.1.0", - "glob": "^7.1.7", + "glob": "^8.0.0", "global-agent": "^3.0.0", "handlebars": "^4.7.3", "html-webpack-plugin": "^5.3.1", diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 92669e914d..c67ec135d6 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -54,7 +54,7 @@ "fast-json-stable-stringify": "^2.1.0", "fs-extra": "10.1.0", "git-url-parse": "^11.6.0", - "glob": "^7.1.6", + "glob": "^8.0.0", "knex": "^1.0.2", "lodash": "^4.17.21", "luxon": "^2.0.2", diff --git a/yarn.lock b/yarn.lock index 069500db2c..85ae635402 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13675,6 +13675,17 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.0: + version "8.0.3" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + glob@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz#00308f5c035aa0b2a447cd37ead267ddff1577d3" From d09cee28ba428ea0a036929ca31ef36730988126 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Wed, 8 Jun 2022 13:11:30 +0200 Subject: [PATCH 006/590] docs: add sign-in resolvers in getting started auth Signed-off-by: Himanshu Mishra --- docs/auth/identity-resolver.md | 151 ++++++++++++++++++++------------- 1 file changed, 90 insertions(+), 61 deletions(-) diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md index c7f90d0bbf..3acdf7ea20 100644 --- a/docs/auth/identity-resolver.md +++ b/docs/auth/identity-resolver.md @@ -79,6 +79,7 @@ Now let's look at the example, with the rest of the commentary being made with i the code comments: ```ts +// File: packages/backend/src/plugins/auth.ts import { createRouter, providers, @@ -139,11 +140,21 @@ property of each of the auth provider integrations. For example, the Google prov a built in resolver that works just like the one we defined above: ```ts -providers.google.create({ - signIn: { - resolver: providers.google.resolvers.emailLocalPartMatchingUserEntityName(), - }, -}); +// File: packages/backend/src/plugins/auth.ts +export default async function createPlugin( + // ... + return await createRouter({ + // ... + providerFactories: { + // ... + google: providers.google.create({ + signIn: { + resolver: providers.google.resolvers.emailLocalPartMatchingUserEntityName(), + }, + }); + } + }) +) ``` There are also other options, like the this one that looks up a user @@ -164,40 +175,49 @@ that happens during sign-in you can replace `ctx.signInWithCatalogUser` with a s of lower-level calls: ```ts +// File: packages/backend/src/plugins/auth.ts import { getDefaultOwnershipRefs } from '@backstage/plugin-auth-backend'; -// This example only shows the resolver function itself. -async ({ profile: { email } }, ctx) => { - if (!email) { - throw new Error('User profile contained no email'); - } +export default async function createPlugin( + // ... + return await createRouter({ + // ... + providerFactories: { + // ... + google: async ({ profile: { email } }, ctx) => { + if (!email) { + throw new Error('User profile contained no email'); + } - // This step calls the catalog to look up a user entity. You could for example - // replace it with a call to a different external system. - const { entity } = await ctx.findCatalogUser({ - annotations: { - 'acme.org/email': email, - }, - }); + // This step calls the catalog to look up a user entity. You could for example + // replace it with a call to a different external system. + const { entity } = await ctx.findCatalogUser({ + annotations: { + 'acme.org/email': email, + }, + }); - // In this step we extract the ownership references from the user entity using - // the standard logic. It uses a reference to the entity itself, as well as the - // target of each `memberOf` relation where the target is of the kind `Group`. - // - // If you replace the catalog lookup with something does not return - // an entity you will need to replace this step as well. - // - // You might also replace it if you for example want to filter out certain groups. - const ownershipRefs = getDefaultOwnershipRefs(entity); + // In this step we extract the ownership references from the user entity using + // the standard logic. It uses a reference to the entity itself, as well as the + // target of each `memberOf` relation where the target is of the kind `Group`. + // + // If you replace the catalog lookup with something does not return + // an entity you will need to replace this step as well. + // + // You might also replace it if you for example want to filter out certain groups. + const ownershipRefs = getDefaultOwnershipRefs(entity); - // The last step is to issue the token, where we might provide more options in the future. - return ctx.issueToken({ - claims: { - sub: stringifyEntityRef(entity), - ent: ownershipRefs, - }, - }); -}; + // The last step is to issue the token, where we might provide more options in the future. + return ctx.issueToken({ + claims: { + sub: stringifyEntityRef(entity), + ent: ownershipRefs, + }, + }); + }; + } + }) +) ``` ## Sign-In without Users in the Catalog @@ -221,38 +241,47 @@ check like in the example below, or you might for example look up the GitHub org that the user belongs to using the user access token in the provided result object. ```ts +// File: packages/backend/src/plugins/auth.ts import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model'; -// This example only shows the resolver function itself. -async ({ profile }, ctx) => { - if (!profile.email) { - throw new Error( - 'Login failed, user profile does not contain an email', - ); - } - // Split the email into the local part and the domain. - const [localPart, domain] = profile.email.split('@'); +export default async function createPlugin( + // ... + return await createRouter({ + // ... + providerFactories: { + // ... + google: async ({ profile }, ctx) => { + if (!profile.email) { + throw new Error( + 'Login failed, user profile does not contain an email', + ); + } + // Split the email into the local part and the domain. + const [localPart, domain] = profile.email.split('@'); - // Next we verify the email domain. It is recommended to include this - // kind of check if you don't look up the user in an external service. - if (domain !== 'acme.org') { - throw new Error('Login failed, user email domain check failed'); - } + // Next we verify the email domain. It is recommended to include this + // kind of check if you don't look up the user in an external service. + if (domain !== 'acme.org') { + throw new Error('Login failed, user email domain check failed'); + } - // By using `stringifyEntityRef` we ensure that the reference is formatted correctly - const userEntityRef = stringifyEntityRef({ - kind: 'User', - name: localPart, - namespace: DEFAULT_NAMESPACE, - }); + // By using `stringifyEntityRef` we ensure that the reference is formatted correctly + const userEntityRef = stringifyEntityRef({ + kind: 'User', + name: localPart, + namespace: DEFAULT_NAMESPACE, + }); - return ctx.issueToken({ - claims: { - sub: userEntityRef, - ent: [userEntityRef], - }, - }); -}, + return ctx.issueToken({ + claims: { + sub: userEntityRef, + ent: [userEntityRef], + }, + }); + }, + } + }) +) ``` ## AuthHandler From 9cee3738fc0a4fc6f6d1f61f7a19076dfedf2d6b Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Wed, 8 Jun 2022 13:12:04 +0200 Subject: [PATCH 007/590] docs: nits to identity resolver page Signed-off-by: Himanshu Mishra --- docs/getting-started/configuration.md | 73 ++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md index 1dc1ffc1b1..c16f4145ed 100644 --- a/docs/getting-started/configuration.md +++ b/docs/getting-started/configuration.md @@ -155,6 +155,8 @@ auth: clientSecret: YOUR CLIENT SECRET ``` +### Add sign-in option to the frontend + Backstage will re-read the configuration. If there's no errors, that's great! We can continue with the last part of the configuration. The next step is needed to change the sign-in page, this you actually need to add in the source code. @@ -187,10 +189,77 @@ components: { }, ``` +### Add sign-in resolver in the backend + +The Auth backend plugin is responsible for assigning a [Backstage User Identity](../auth/identity-resolver.md#backstage-user-identity) when a user signs in. The identity is mainly used in determining the ownership of Backstage Catalog entities for the user. This is achieved by writing a [Sign In Resolver](../auth/identity-resolver.md#sign-in-resolvers) which takes care of assigning the right identity to the user and even reject SignIn attempts from unrecognized email domains. + > Since [v1.1.0](https://github.com/backstage/backstage/releases/tag/v1.1.0-next.3), you must provide an [explicit sign-in resolver](../auth/identity-resolver.md). -That should be it. You can stop your Backstage App. When you start it again and -go to your Backstage portal in your browser, you should have your login prompt! +For now, let's create a simple Sign In Resolver which uses the first part of the user's email address to assign a Backstage User Identity. + +Replace your `packages/backend/src/plugin/auth.ts` file with the following + +```tsx +import { + createRouter, + providers, + defaultAuthProviderFactories, +} from '@backstage/plugin-auth-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; +import { + DEFAULT_NAMESPACE, + stringifyEntityRef, +} from '@backstage/catalog-model'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + return await createRouter({ + logger: env.logger, + config: env.config, + database: env.database, + discovery: env.discovery, + tokenManager: env.tokenManager, + providerFactories: { + ...defaultAuthProviderFactories, + github: providers.github.create({ + signIn: { + resolver: async ({ profile }, ctx) => { + if (!profile.email) { + throw new Error( + 'Login failed, user profile does not contain an email', + ); + } + // Split the email into the local part and the domain. + // You can use the email domain and verify that it belongs to your own org + // e.g. acme.org. It is recommended to include this kind of check for security. + const [localPart, _] = profile.email.split('@'); + + // By using `stringifyEntityRef` we ensure that the reference is formatted correctly + const userEntityRef = stringifyEntityRef({ + kind: 'User', + name: localPart, + namespace: DEFAULT_NAMESPACE, + }); + + return ctx.issueToken({ + claims: { + sub: userEntityRef, + ent: [userEntityRef], + }, + }); + }, + }, + }), + }, + }); +} +``` + +Restart Backstage from the terminal, by stopping it with `Control-C`, and starting it with `yarn dev` . You should be welcomed by a login prompt! + +> Note: Sometimes the frontend starts before the backend resulting in errors on the sign in page. Wait for the backend to start and then reload Backstage to proceed. To learn more about Authentication in Backstage, here are some docs you could read: From 2931968cf73c9a9ab5796c8916720e5f79a25ff3 Mon Sep 17 00:00:00 2001 From: Raghunandan Date: Wed, 8 Jun 2022 17:11:59 +0200 Subject: [PATCH 008/590] reorder tab title Signed-off-by: Raghunandan --- .../TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx index 204ac835e4..c45a50d750 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx @@ -91,7 +91,7 @@ export const TechDocsReaderPageHeader = ( }, [metadata, setTitle, setSubtitle]); const appTitle = configApi.getOptional('app.title') || 'Backstage'; - const tabTitle = [subtitle, title, appTitle].filter(Boolean).join(' | '); + const tabTitle = [title, subtitle, appTitle].filter(Boolean).join(' | '); const { locationMetadata, spec } = entityMetadata || {}; const lifecycle = spec?.lifecycle; From 859346bfbbdc68b71a70a448073f3bebcfbe5f80 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 8 Jun 2022 15:11:15 +0000 Subject: [PATCH 009/590] fix(deps): update dependency google-auth-library to v8 Signed-off-by: Renovate Bot --- .changeset/renovate-9454dab.md | 5 +++++ plugins/auth-backend/package.json | 2 +- yarn.lock | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/renovate-9454dab.md diff --git a/.changeset/renovate-9454dab.md b/.changeset/renovate-9454dab.md new file mode 100644 index 0000000000..1f8401e10f --- /dev/null +++ b/.changeset/renovate-9454dab.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Updated dependency `google-auth-library` to `^8.0.0`. diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 21260959ea..3d95d0c0c9 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -50,7 +50,7 @@ "express-promise-router": "^4.1.0", "express-session": "^1.17.1", "fs-extra": "10.1.0", - "google-auth-library": "^7.6.1", + "google-auth-library": "^8.0.0", "jose": "^4.6.0", "jwt-decode": "^3.1.0", "knex": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 69683ace8d..6aa81340c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13768,7 +13768,7 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -google-auth-library@^7.14.0, google-auth-library@^7.6.1: +google-auth-library@^7.14.0: version "7.14.1" resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz#e3483034162f24cc71b95c8a55a210008826213c" integrity sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA== @@ -13783,7 +13783,7 @@ google-auth-library@^7.14.0, google-auth-library@^7.6.1: jws "^4.0.0" lru-cache "^6.0.0" -google-auth-library@^8.0.1, google-auth-library@^8.0.2: +google-auth-library@^8.0.0, google-auth-library@^8.0.1, google-auth-library@^8.0.2: version "8.0.2" resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.0.2.tgz#5fa0f2d3795c3e4019d2bb315ade4454cc9c30b5" integrity sha512-HoG+nWFAThLovKpvcbYzxgn+nBJPTfAwtq0GxPN821nOO+21+8oP7MoEHfd1sbDulUFFGfcjJr2CnJ4YssHcyg== From 04fa958718a74359fab77ddd1b13a19aee98a606 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Wed, 8 Jun 2022 17:46:56 +0200 Subject: [PATCH 010/590] correct explanation of user identity and include domain check in email addresses Signed-off-by: Himanshu Mishra --- docs/auth/identity-resolver.md | 2 +- docs/getting-started/configuration.md | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md index 3acdf7ea20..3ae2f46360 100644 --- a/docs/auth/identity-resolver.md +++ b/docs/auth/identity-resolver.md @@ -201,7 +201,7 @@ export default async function createPlugin( // the standard logic. It uses a reference to the entity itself, as well as the // target of each `memberOf` relation where the target is of the kind `Group`. // - // If you replace the catalog lookup with something does not return + // If you replace the catalog lookup with something that does not return // an entity you will need to replace this step as well. // // You might also replace it if you for example want to filter out certain groups. diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md index c16f4145ed..7c7fa4d98f 100644 --- a/docs/getting-started/configuration.md +++ b/docs/getting-started/configuration.md @@ -191,13 +191,15 @@ components: { ### Add sign-in resolver in the backend -The Auth backend plugin is responsible for assigning a [Backstage User Identity](../auth/identity-resolver.md#backstage-user-identity) when a user signs in. The identity is mainly used in determining the ownership of Backstage Catalog entities for the user. This is achieved by writing a [Sign In Resolver](../auth/identity-resolver.md#sign-in-resolvers) which takes care of assigning the right identity to the user and even reject SignIn attempts from unrecognized email domains. +The Auth backend plugin is responsible for assigning a [Backstage User Identity](../auth/identity-resolver.md#backstage-user-identity) when a user signs in. The Backstage User Identity is fundamentally a JSON Web Token which consists of two parts. The `sub` part is your identity and that identifies your user for any purpose within the Backstage ecosystem. It can for example be used as a primary key in a per-user settings backend, or any other similar purpose. The ent is what relates to ownership (the list of entity refs through which you claim ownership). This is achieved by writing a [Sign In Resolver](../auth/identity-resolver.md#sign-in-resolvers) which takes care of assigning the right identity to the user and even reject SignIn attempts from unrecognized email domains. > Since [v1.1.0](https://github.com/backstage/backstage/releases/tag/v1.1.0-next.3), you must provide an [explicit sign-in resolver](../auth/identity-resolver.md). For now, let's create a simple Sign In Resolver which uses the first part of the user's email address to assign a Backstage User Identity. -Replace your `packages/backend/src/plugin/auth.ts` file with the following +Replace your `packages/backend/src/plugin/auth.ts` file with the following. + +> NOTE: Please update `acme.org` below with your actual company domain to allow login requests from email address with that domain. ```tsx import { @@ -232,9 +234,13 @@ export default async function createPlugin( ); } // Split the email into the local part and the domain. - // You can use the email domain and verify that it belongs to your own org - // e.g. acme.org. It is recommended to include this kind of check for security. - const [localPart, _] = profile.email.split('@'); + const [localPart, domain] = profile.email.split('@'); + + // Next we verify the email domain. It is recommended to include this + // kind of check if you don't look up the user in an external service. + if (domain !== 'acme.org') { + throw new Error('Login failed, user email domain check failed'); + } // By using `stringifyEntityRef` we ensure that the reference is formatted correctly const userEntityRef = stringifyEntityRef({ From 88c697dc89309e3cca1853df228e308d9e7b94e7 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Wed, 8 Jun 2022 17:51:09 +0200 Subject: [PATCH 011/590] vale: add ent in keyword Signed-off-by: Himanshu Mishra --- .github/vale/Vocab/Backstage/accept.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 7631640199..b87f5d3881 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -92,6 +92,7 @@ elasticsearch esbuild eslint etag +ent Expedia facto failover From 13767bd7b69d745cad8ec9bc54c8e0ac78ee2af1 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Thu, 9 Jun 2022 13:49:43 +0200 Subject: [PATCH 012/590] remove custom sign in resolver Signed-off-by: Himanshu Mishra --- docs/getting-started/configuration.md | 74 +-------------------------- 1 file changed, 1 insertion(+), 73 deletions(-) diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md index 7c7fa4d98f..286c6cff1e 100644 --- a/docs/getting-started/configuration.md +++ b/docs/getting-started/configuration.md @@ -189,79 +189,7 @@ components: { }, ``` -### Add sign-in resolver in the backend - -The Auth backend plugin is responsible for assigning a [Backstage User Identity](../auth/identity-resolver.md#backstage-user-identity) when a user signs in. The Backstage User Identity is fundamentally a JSON Web Token which consists of two parts. The `sub` part is your identity and that identifies your user for any purpose within the Backstage ecosystem. It can for example be used as a primary key in a per-user settings backend, or any other similar purpose. The ent is what relates to ownership (the list of entity refs through which you claim ownership). This is achieved by writing a [Sign In Resolver](../auth/identity-resolver.md#sign-in-resolvers) which takes care of assigning the right identity to the user and even reject SignIn attempts from unrecognized email domains. - -> Since [v1.1.0](https://github.com/backstage/backstage/releases/tag/v1.1.0-next.3), you must provide an [explicit sign-in resolver](../auth/identity-resolver.md). - -For now, let's create a simple Sign In Resolver which uses the first part of the user's email address to assign a Backstage User Identity. - -Replace your `packages/backend/src/plugin/auth.ts` file with the following. - -> NOTE: Please update `acme.org` below with your actual company domain to allow login requests from email address with that domain. - -```tsx -import { - createRouter, - providers, - defaultAuthProviderFactories, -} from '@backstage/plugin-auth-backend'; -import { Router } from 'express'; -import { PluginEnvironment } from '../types'; -import { - DEFAULT_NAMESPACE, - stringifyEntityRef, -} from '@backstage/catalog-model'; - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - return await createRouter({ - logger: env.logger, - config: env.config, - database: env.database, - discovery: env.discovery, - tokenManager: env.tokenManager, - providerFactories: { - ...defaultAuthProviderFactories, - github: providers.github.create({ - signIn: { - resolver: async ({ profile }, ctx) => { - if (!profile.email) { - throw new Error( - 'Login failed, user profile does not contain an email', - ); - } - // Split the email into the local part and the domain. - const [localPart, domain] = profile.email.split('@'); - - // Next we verify the email domain. It is recommended to include this - // kind of check if you don't look up the user in an external service. - if (domain !== 'acme.org') { - throw new Error('Login failed, user email domain check failed'); - } - - // By using `stringifyEntityRef` we ensure that the reference is formatted correctly - const userEntityRef = stringifyEntityRef({ - kind: 'User', - name: localPart, - namespace: DEFAULT_NAMESPACE, - }); - - return ctx.issueToken({ - claims: { - sub: userEntityRef, - ent: [userEntityRef], - }, - }); - }, - }, - }), - }, - }); -} -``` +> Note: The default Backstage app comes with a guest Sign In Resolver. This resolver makes all users share a single "guest" identity and is only intended as a minimum requirement to quickly get up and running. You can read more about how [Sign In Resolvers](../auth/identity-resolver.md#sign-in-resolvers) play a role in creating a [Backstage User Identity](../auth/identity-resolver.md#backstage-user-identity) for logged in users. Restart Backstage from the terminal, by stopping it with `Control-C`, and starting it with `yarn dev` . You should be welcomed by a login prompt! From 3bc59fa19f416e5186904b8454f71502a058daf4 Mon Sep 17 00:00:00 2001 From: Tate Date: Thu, 9 Jun 2022 23:27:48 -0400 Subject: [PATCH 013/590] Remove undefined container className property the `container` property is not defined in the example snippet and causes an error when the home page renders as the snippet was written. I removed the className property to fix the issue. Signed-off-by: Tate Hanawalt --- docs/getting-started/homepage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/homepage.md b/docs/getting-started/homepage.md index 2f86380b13..eac76b5fdc 100644 --- a/docs/getting-started/homepage.md +++ b/docs/getting-started/homepage.md @@ -157,7 +157,7 @@ export const HomePage = () => { return ( - + ); From 389f6602bcb4e988366e105725f5d616bbdb2a69 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 10 Jun 2022 17:38:19 +0400 Subject: [PATCH 014/590] added new getDags method to fetch specific dagIds Signed-off-by: Daniele.Mazzotta --- .../src/api/ApacheAirflowApi.ts | 1 + .../src/api/ApacheAirflowClient.test.ts | 27 +++++++++++++++++++ .../src/api/ApacheAirflowClient.ts | 19 +++++++++++++ .../DagTableComponent/DagTableComponent.tsx | 17 +++++++++++- 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/plugins/apache-airflow/src/api/ApacheAirflowApi.ts b/plugins/apache-airflow/src/api/ApacheAirflowApi.ts index dde8c57802..838292524a 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowApi.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowApi.ts @@ -25,6 +25,7 @@ export type ApacheAirflowApi = { discoveryApi: DiscoveryApi; baseUrl: string; listDags(options?: { objectsPerRequest: number }): Promise; + getDags(dagIds: string[]): Promise<{ dags: Dag[]; dagsNotFound: string[] }>; updateDag(dagId: string, isPaused: boolean): Promise; getInstanceStatus(): Promise; getInstanceVersion(): Promise; diff --git a/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts b/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts index 704b17eb34..e56c622ff2 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts @@ -160,4 +160,31 @@ describe('ApacheAirflowClient', () => { expect(response.dag_id).toEqual(dagId); expect(response.is_paused).toEqual(true); }); + + it('get only some dags', async () => { + setupHandlers(); + const client = new ApacheAirflowClient({ + discoveryApi: discoveryApi, + baseUrl: 'localhost:8080/', + }); + const dagIds = ['mock_dag_1', 'mock_dag_3']; + const response = await client.getDags(dagIds); + expect(response.dags.length).toEqual(dagIds.length); + response.dags.forEach((dag, index) => + expect(dag.dag_id).toEqual(dagIds[index]), + ); + expect(response.dagsNotFound.length).toEqual(0); + }); + + it('get dags but ignore NOT FOUND errors', async () => { + setupHandlers(); + const client = new ApacheAirflowClient({ + discoveryApi: discoveryApi, + baseUrl: 'localhost:8080/', + }); + const dagIds = ['mock_dag_1', 'a-random-DAG-id']; + const response = await client.getDags(dagIds); + expect(response.dags[0].dag_id).toEqual('mock_dag_1'); + expect(response.dagsNotFound[0]).toEqual('a-random-DAG-id'); + }); }); diff --git a/plugins/apache-airflow/src/api/ApacheAirflowClient.ts b/plugins/apache-airflow/src/api/ApacheAirflowClient.ts index 847a1b1ca6..bf095a96ba 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowClient.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowClient.ts @@ -75,6 +75,25 @@ export class ApacheAirflowClient implements ApacheAirflowApi { return dags; } + async getDags( + dagIds: string[], + ): Promise<{ dags: Dag[]; dagsNotFound: string[] }> { + const dagsNotFound: string[] = []; + const response = await Promise.all( + dagIds.map(id => { + return this.fetch(`/dags/${id}`).catch(e => { + if (e.message === 'NOT FOUND') { + dagsNotFound.push(id); + } else { + throw e; + } + }); + }), + ); + const dags = response.filter(Boolean) as Dag[]; + return { dags, dagsNotFound }; + } + async updateDag(dagId: string, isPaused: boolean): Promise { const init = { method: 'PATCH', diff --git a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx index cf343a596e..18439e1902 100644 --- a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx +++ b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx @@ -129,9 +129,24 @@ export const DenseTable = ({ dags }: DenseTableProps) => { ); }; -export const DagTableComponent = () => { +type DagTableComponentProps = { + dagIds?: string[]; +}; + +export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { const apiClient = useApi(apacheAirflowApiRef); const { value, loading, error } = useAsync(async (): Promise => { + if (dagIds) { + const { dags, dagsNotFound } = await apiClient.getDags(dagIds); + if (dagsNotFound.length) { + throw new Error( + `${dagsNotFound.length} DAGs were not found:\n${dagsNotFound.join( + ';\n', + )}`, + ); + } + return dags; + } return await apiClient.listDags(); }, []); From fe07d959a59ca84a0de12ddb690bfd9634faf384 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Mon, 13 Jun 2022 10:46:25 +0200 Subject: [PATCH 015/590] add search-react to list of stories to be published Signed-off-by: Emma Indal --- storybook/.storybook/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/storybook/.storybook/main.js b/storybook/.storybook/main.js index f493bd2de6..d2e22abee7 100644 --- a/storybook/.storybook/main.js +++ b/storybook/.storybook/main.js @@ -9,6 +9,7 @@ const BACKSTAGE_CORE_STORIES = [ 'packages/app', 'plugins/org', 'plugins/search', + 'plugins/search-react', 'plugins/home', 'plugins/stack-overflow', ]; From 3cbebf710e60a2479715dbfc9240fd2ea7be0fa8 Mon Sep 17 00:00:00 2001 From: Raghunandan Date: Mon, 13 Jun 2022 23:21:00 +0200 Subject: [PATCH 016/590] Add changeset Signed-off-by: Raghunandan --- .changeset/techdocs-gorgeous-plants-sniff.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/techdocs-gorgeous-plants-sniff.md diff --git a/.changeset/techdocs-gorgeous-plants-sniff.md b/.changeset/techdocs-gorgeous-plants-sniff.md new file mode 100644 index 0000000000..f5453f35be --- /dev/null +++ b/.changeset/techdocs-gorgeous-plants-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Reorder browser tab title in Techdocs pages to have the site name first. From dcaf1cb418d8e63c2b5c3a9395e9a8de68609698 Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 12:50:17 +0200 Subject: [PATCH 017/590] Add changeset Signed-off-by: Olivier Liechti --- .changeset/great-roses-pump.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/great-roses-pump.md diff --git a/.changeset/great-roses-pump.md b/.changeset/great-roses-pump.md new file mode 100644 index 0000000000..1172f5018a --- /dev/null +++ b/.changeset/great-roses-pump.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as 'white'. This was an issue for themes that use a header with a white background. The color of the icon can now be overriden in the theme (PluginCatalogEntityContextMenu > button > color). From 8f8273eb9353465eb9e2292961e12e896e7ffabe Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 13:00:12 +0200 Subject: [PATCH 018/590] Fix typo in changeset Signed-off-by: Olivier Liechti --- .changeset/great-roses-pump.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.changeset/great-roses-pump.md b/.changeset/great-roses-pump.md index 1172f5018a..949c32f34b 100644 --- a/.changeset/great-roses-pump.md +++ b/.changeset/great-roses-pump.md @@ -2,4 +2,16 @@ '@backstage/plugin-catalog': patch --- -Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as 'white'. This was an issue for themes that use a header with a white background. The color of the icon can now be overriden in the theme (PluginCatalogEntityContextMenu > button > color). +Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as 'white'. This was an issue for themes that use a header with a white background. The color of the icon can now be overridden in the theme (PluginCatalogEntityContextMenu > button > color): + +export function createThemeOverrides(theme: BackstageTheme): Overrides { +return { +PluginCatalogEntityContextMenu: { +button: { +color: 'blue', +}, +}, +... +}, +... +} From 93971d41c4643675e65ef2d864d357bb7a8a9736 Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 13:06:56 +0200 Subject: [PATCH 019/590] Fix typo in changeset Signed-off-by: Olivier Liechti --- .changeset/great-roses-pump.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/great-roses-pump.md b/.changeset/great-roses-pump.md index 949c32f34b..263254b63c 100644 --- a/.changeset/great-roses-pump.md +++ b/.changeset/great-roses-pump.md @@ -2,7 +2,7 @@ '@backstage/plugin-catalog': patch --- -Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as 'white'. This was an issue for themes that use a header with a white background. The color of the icon can now be overridden in the theme (PluginCatalogEntityContextMenu > button > color): +Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as 'white'. This was an issue for themes that use a header with a white background. The color of the icon can now be overridden in the theme (PluginCatalogEntityContextMenu > button > color). Example: export function createThemeOverrides(theme: BackstageTheme): Overrides { return { From ae8c6bf16270ae1cfdd36b6885c97bae8584184e Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 13:23:16 +0200 Subject: [PATCH 020/590] Fix linter issue Signed-off-by: Olivier Liechti --- .../EntityContextMenu/EntityContextMenu.tsx | 2 +- ...20ba9-Linux-5.10.25-linuxkit-en.properties | 235 ++++++++++++++++++ 2 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 0059d3118c..9c16f80ee5 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -36,7 +36,7 @@ import { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common' export type EntityContextMenuClassKey = 'button'; const useStyles = makeStyles( - theme => ({ + () => ({ button: { color: 'white', }, diff --git a/plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties b/plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties new file mode 100644 index 0000000000..3849e9a4df --- /dev/null +++ b/plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties @@ -0,0 +1,235 @@ +#JDK Font Configuration Generated File: *Do Not Edit* +#Sun May 29 11:24:26 GMT 2022 +sansserif.3.5.family=DejaVu LGC Serif +serif.1.7.family=DejaVu LGC Sans +monospaced.2.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +serif.1.5.family=DejaVu Sans Mono +sansserif.3.7.family=DejaVu LGC Serif +sansserif.2.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +serif.3.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +serif.1.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf +sansserif.3.3.family=DejaVu Sans +serif.1.9.family=DejaVu Math TeX Gyre +serif.1.3.family=DejaVu Serif +serif.1.1.family=DejaVu Serif +serif.0.4.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +monospaced.1.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf +monospaced.3.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +monospaced.0.1.family=DejaVu Math TeX Gyre +monospaced.0.3.family=DejaVu Serif +sansserif.0.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +serif.2.4.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-Oblique.ttf +monospaced.3.10.family=DejaVu Math TeX Gyre +monospaced.0.length=5 +sansserif.3.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +serif.0.6.family=DejaVu LGC Sans +sansserif.1.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf +version=1 +monospaced.1.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf +monospaced.3.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-BoldOblique.ttf +sansserif.2.4.family=DejaVu Serif +sansserif.2.6.family=DejaVu LGC Sans Mono +serif.1.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf +serif.3.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-BoldOblique.ttf +sansserif.2.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +monospaced.2.length=9 +monospaced.0.1.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +sansserif.0.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +sansserif.3.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +serif.3.length=11 +serif.0.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf +sansserif.3.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +serif.0.0.family=DejaVu Serif +serif.0.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +monospaced.1.2.family=DejaVu Serif +monospaced.1.6.family=DejaVu LGC Sans +sansserif.2.0.family=DejaVu Sans +serif.3.5.family=DejaVu Sans Mono +serif.0.4.family=DejaVu Math TeX Gyre +sansserif.1.5.family=DejaVu LGC Serif +serif.1.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf +serif.3.1.family=DejaVu Serif +serif.1.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +monospaced.3.9.family=DejaVu Sans +serif.2.0.family=DejaVu Serif +sansserif.2.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +sansserif.2.7.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +serif.2.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +monospaced.2.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf +sansserif.1.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono.ttf +monospaced.2.7.family=DejaVu Math TeX Gyre +serif.2.8.family=DejaVu Math TeX Gyre +sansserif.3.1.family=DejaVu Sans +monospaced.2.3.family=DejaVu Serif +serif.2.4.family=DejaVu LGC Sans +sansserif.1.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +monospaced.3.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +monospaced.1.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +sansserif.2.length=8 +monospaced.3.2.family=DejaVu Sans Mono +serif.3.8.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +serif.3.10.family=DejaVu Sans +monospaced.2.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +monospaced.1.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf +monospaced.3.5.family=DejaVu LGC Serif +serif.3.10.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +monospaced.3.4.family=DejaVu Serif +monospaced.3.7.family=DejaVu Sans +serif.3.9.family=DejaVu Math TeX Gyre +sansserif.1.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +sansserif.1.1.family=DejaVu Sans +serif.3.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-Oblique.ttf +serif.2.10.family=DejaVu Sans +monospaced.3.8.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Bold.ttf +monospaced.1.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +monospaced.2.6.family=DejaVu Sans +sansserif.2.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +monospaced.2.4.family=DejaVu Serif +sansserif.0.1.family=DejaVu Sans +sansserif.0.3.family=DejaVu Sans +serif.2.9.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +serif.1.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono.ttf +serif.1.length=10 +sansserif.1.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +monospaced.1.8.family=DejaVu Math TeX Gyre +serif.1.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf +monospaced.1.3.family=DejaVu LGC Sans +sansserif.2.2.family=DejaVu Sans +monospaced.1.0.family=DejaVu Sans Mono +serif.3.4.family=DejaVu LGC Sans Mono +monospaced.3.9.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +serif.0.2.family=DejaVu Serif +monospaced.3.3.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-BoldItalic.ttf +sansserif.1.7.family=DejaVu Serif +sansserif.1.4.family=DejaVu Sans Mono +serif.3.7.family=DejaVu LGC Sans +sansserif.1.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +serif.3.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf +sansserif.0.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +monospaced.2.1.family=DejaVu Sans Mono +monospaced.0.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +serif.0.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf +serif.0.7.family=DejaVu Sans +monospaced.2.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +sansserif.2.5.family=DejaVu Serif +serif.2.6.family=DejaVu Sans +monospaced.1.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +sansserif.0.6.family=DejaVu Math TeX Gyre +sansserif.3.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +serif.1.6.family=DejaVu LGC Sans Mono +monospaced.3.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf +serif.1.8.family=DejaVu Sans +sansserif.3.8.family=DejaVu Math TeX Gyre +sansserif.3.6.family=DejaVu LGC Sans Mono +sansserif.3.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Italic.ttf +sansserif.1.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Bold.ttf +serif.0.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +sansserif.3.4.family=DejaVu Serif +sansserif.3.2.family=DejaVu Sans +serif.2.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf +serif.1.2.family=DejaVu Serif +serif.1.4.family=DejaVu Sans +monospaced.0.2.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf +serif.1.0.family=DejaVu Serif +serif.1.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +monospaced.2.2.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Italic.ttf +monospaced.0.4.family=DejaVu Sans +monospaced.0.2.family=DejaVu LGC Sans +monospaced.0.0.family=DejaVu Sans Mono +serif.3.4.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-BoldOblique.ttf +serif.2.1.family=DejaVu Serif +monospaced.1.3.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-Bold.ttf +serif.1.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +sansserif.1.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf +sansserif.3.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Bold.ttf +cachedir.0=/var/cache/fontconfig +serif.2.9.family=DejaVu Sans Mono +cachedir.2=/tmp/.fontconfig +sansserif.2.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-Oblique.ttf +cachedir.1=/tmp/.cache/fontconfig +serif.3.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf +sansserif.0.6.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +fcversion=21301 +sansserif.3.0.family=DejaVu Sans +serif.2.5.family=DejaVu LGC Sans Mono +serif.2.3.family=DejaVu Serif +serif.2.7.family=DejaVu LGC Sans +monospaced.0.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +serif.3.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +serif.2.length=11 +monospaced.2.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +serif.3.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +sansserif.0.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +serif.0.1.family=DejaVu Serif +monospaced.1.1.family=DejaVu Sans Mono +monospaced.1.5.family=DejaVu LGC Serif +serif.0.5.family=DejaVu Sans Mono +serif.3.2.family=DejaVu Serif +serif.3.6.family=DejaVu Sans +serif.0.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +sansserif.1.6.family=DejaVu LGC Sans Mono +serif.0.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf +sansserif.1.2.family=DejaVu Sans +monospaced.3.11.family=DejaVu Sans +monospaced.1.length=9 +monospaced.2.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Oblique.ttf +sansserif.2.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf +sansserif.2.7.family=DejaVu Math TeX Gyre +sansserif.2.3.family=DejaVu Sans +serif.2.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-Oblique.ttf +sansserif.0.0.family=DejaVu Sans +sansserif.1.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +sansserif.0.4.family=DejaVu Sans Mono +serif.3.9.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +sansserif.0.5.family=DejaVu Serif +serif.1.9.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +monospaced.2.7.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +monospaced.3.10.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +monospaced.3.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +sansserif.1.length=9 +sansserif.3.length=9 +serif.2.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf +monospaced.3.11.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +monospaced.3.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +monospaced.3.6.family=DejaVu Sans +sansserif.0.length=7 +monospaced.3.0.family=DejaVu Sans Mono +monospaced.3.3.family=DejaVu LGC Serif +monospaced.3.1.family=DejaVu Sans Mono +monospaced.3.8.family=DejaVu LGC Serif +sansserif.1.3.family=DejaVu Sans +monospaced.2.0.family=DejaVu Sans Mono +monospaced.2.2.family=DejaVu LGC Serif +sansserif.3.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +monospaced.3.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Italic.ttf +serif.1.8.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +monospaced.1.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif.ttf +monospaced.2.8.family=DejaVu Sans +sansserif.0.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +monospaced.1.4.family=DejaVu Sans +serif.2.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf +serif.2.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf +serif.0.length=8 +monospaced.1.7.family=DejaVu Sans +sansserif.2.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +sansserif.2.1.family=DejaVu Sans +serif.3.3.family=DejaVu Serif +serif.0.3.family=DejaVu Serif +sansserif.1.8.family=DejaVu Math TeX Gyre +serif.2.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-BoldOblique.ttf +serif.3.8.family=DejaVu Sans +serif.3.0.family=DejaVu Serif +serif.2.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf +sansserif.0.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +sansserif.1.0.family=DejaVu Sans +serif.2.10.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +serif.2.2.family=DejaVu Serif +monospaced.2.8.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +monospaced.0.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +serif.0.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf +sansserif.3.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf +sansserif.3.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-BoldOblique.ttf +monospaced.3.length=12 +monospaced.2.5.family=DejaVu Sans +monospaced.1.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf +sansserif.0.2.family=DejaVu Sans From 33ad22a309888dc7fcf7d41efd635a46c361e59b Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 13:54:03 +0200 Subject: [PATCH 021/590] Update api-report.md Signed-off-by: Olivier Liechti --- plugins/catalog/api-report.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index 3d426a0c8b..aea9c2b2c5 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -390,6 +390,7 @@ export function isOrphan(entity: Entity): boolean; export type PluginCatalogComponentsNameToClassKey = { PluginCatalogEntityLinksEmptyState: EntityLinksEmptyStateClassKey; PluginCatalogSystemDiagramCard: SystemDiagramCardClassKey; + PluginCatalogEntityContextMenu: EntityContextMenuClassKey; }; // @public (undocumented) @@ -416,4 +417,8 @@ export type SystemDiagramCardClassKey = | 'componentNode' | 'apiNode' | 'resourceNode'; + +// Warnings were encountered during analysis: +// +// src/overridableComponents.d.ts:10:5 - (ae-forgotten-export) The symbol "EntityContextMenuClassKey" needs to be exported by the entry point index.d.ts ``` From 74dc3acb1ac2a3205aeb78ad62a20c8ea24408b0 Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 13:00:12 +0200 Subject: [PATCH 022/590] Fix typo in changeset Signed-off-by: Olivier Liechti --- .../EntityContextMenu/EntityContextMenu.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 9c16f80ee5..db50eeab84 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -31,16 +31,19 @@ import React, { useState } from 'react'; import { IconComponent } from '@backstage/core-plugin-api'; import { useEntityPermission } from '@backstage/plugin-catalog-react'; import { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common'; +import { BackstageTheme } from '@backstage/theme'; /** @public */ export type EntityContextMenuClassKey = 'button'; const useStyles = makeStyles( - () => ({ - button: { - color: 'white', - }, - }), + (theme: BackstageTheme) => { + return { + button: { + color: theme.palette.bursts.fontColor, + }, + }; + }, { name: 'PluginCatalogEntityContextMenu' }, ); From e173877d5140b0d5c56e58d391001dce013ccebc Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Wed, 1 Jun 2022 13:00:12 +0200 Subject: [PATCH 023/590] Fix typo in changeset Signed-off-by: Olivier Liechti --- ...20ba9-Linux-5.10.25-linuxkit-en.properties | 235 ------------------ 1 file changed, 235 deletions(-) delete mode 100644 plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties diff --git a/plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties b/plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties deleted file mode 100644 index 3849e9a4df..0000000000 --- a/plugins/techdocs-backend/examples/documented-component/?/.java/fonts/11.0.15/fcinfo-1-995caf720ba9-Linux-5.10.25-linuxkit-en.properties +++ /dev/null @@ -1,235 +0,0 @@ -#JDK Font Configuration Generated File: *Do Not Edit* -#Sun May 29 11:24:26 GMT 2022 -sansserif.3.5.family=DejaVu LGC Serif -serif.1.7.family=DejaVu LGC Sans -monospaced.2.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -serif.1.5.family=DejaVu Sans Mono -sansserif.3.7.family=DejaVu LGC Serif -sansserif.2.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -serif.3.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -serif.1.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf -sansserif.3.3.family=DejaVu Sans -serif.1.9.family=DejaVu Math TeX Gyre -serif.1.3.family=DejaVu Serif -serif.1.1.family=DejaVu Serif -serif.0.4.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -monospaced.1.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf -monospaced.3.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -monospaced.0.1.family=DejaVu Math TeX Gyre -monospaced.0.3.family=DejaVu Serif -sansserif.0.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -serif.2.4.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-Oblique.ttf -monospaced.3.10.family=DejaVu Math TeX Gyre -monospaced.0.length=5 -sansserif.3.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -serif.0.6.family=DejaVu LGC Sans -sansserif.1.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf -version=1 -monospaced.1.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf -monospaced.3.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-BoldOblique.ttf -sansserif.2.4.family=DejaVu Serif -sansserif.2.6.family=DejaVu LGC Sans Mono -serif.1.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf -serif.3.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-BoldOblique.ttf -sansserif.2.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -monospaced.2.length=9 -monospaced.0.1.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -sansserif.0.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -sansserif.3.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -serif.3.length=11 -serif.0.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf -sansserif.3.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -serif.0.0.family=DejaVu Serif -serif.0.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -monospaced.1.2.family=DejaVu Serif -monospaced.1.6.family=DejaVu LGC Sans -sansserif.2.0.family=DejaVu Sans -serif.3.5.family=DejaVu Sans Mono -serif.0.4.family=DejaVu Math TeX Gyre -sansserif.1.5.family=DejaVu LGC Serif -serif.1.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf -serif.3.1.family=DejaVu Serif -serif.1.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -monospaced.3.9.family=DejaVu Sans -serif.2.0.family=DejaVu Serif -sansserif.2.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -sansserif.2.7.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -serif.2.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -monospaced.2.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf -sansserif.1.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono.ttf -monospaced.2.7.family=DejaVu Math TeX Gyre -serif.2.8.family=DejaVu Math TeX Gyre -sansserif.3.1.family=DejaVu Sans -monospaced.2.3.family=DejaVu Serif -serif.2.4.family=DejaVu LGC Sans -sansserif.1.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -monospaced.3.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -monospaced.1.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -sansserif.2.length=8 -monospaced.3.2.family=DejaVu Sans Mono -serif.3.8.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -serif.3.10.family=DejaVu Sans -monospaced.2.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -monospaced.1.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf -monospaced.3.5.family=DejaVu LGC Serif -serif.3.10.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -monospaced.3.4.family=DejaVu Serif -monospaced.3.7.family=DejaVu Sans -serif.3.9.family=DejaVu Math TeX Gyre -sansserif.1.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -sansserif.1.1.family=DejaVu Sans -serif.3.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-Oblique.ttf -serif.2.10.family=DejaVu Sans -monospaced.3.8.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Bold.ttf -monospaced.1.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -monospaced.2.6.family=DejaVu Sans -sansserif.2.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -monospaced.2.4.family=DejaVu Serif -sansserif.0.1.family=DejaVu Sans -sansserif.0.3.family=DejaVu Sans -serif.2.9.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -serif.1.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono.ttf -serif.1.length=10 -sansserif.1.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -monospaced.1.8.family=DejaVu Math TeX Gyre -serif.1.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf -monospaced.1.3.family=DejaVu LGC Sans -sansserif.2.2.family=DejaVu Sans -monospaced.1.0.family=DejaVu Sans Mono -serif.3.4.family=DejaVu LGC Sans Mono -monospaced.3.9.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -serif.0.2.family=DejaVu Serif -monospaced.3.3.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-BoldItalic.ttf -sansserif.1.7.family=DejaVu Serif -sansserif.1.4.family=DejaVu Sans Mono -serif.3.7.family=DejaVu LGC Sans -sansserif.1.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -serif.3.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf -sansserif.0.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -monospaced.2.1.family=DejaVu Sans Mono -monospaced.0.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -serif.0.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf -serif.0.7.family=DejaVu Sans -monospaced.2.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -sansserif.2.5.family=DejaVu Serif -serif.2.6.family=DejaVu Sans -monospaced.1.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -sansserif.0.6.family=DejaVu Math TeX Gyre -sansserif.3.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -serif.1.6.family=DejaVu LGC Sans Mono -monospaced.3.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Bold.ttf -serif.1.8.family=DejaVu Sans -sansserif.3.8.family=DejaVu Math TeX Gyre -sansserif.3.6.family=DejaVu LGC Sans Mono -sansserif.3.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Italic.ttf -sansserif.1.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Bold.ttf -serif.0.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -sansserif.3.4.family=DejaVu Serif -sansserif.3.2.family=DejaVu Sans -serif.2.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf -serif.1.2.family=DejaVu Serif -serif.1.4.family=DejaVu Sans -monospaced.0.2.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans.ttf -serif.1.0.family=DejaVu Serif -serif.1.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -monospaced.2.2.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Italic.ttf -monospaced.0.4.family=DejaVu Sans -monospaced.0.2.family=DejaVu LGC Sans -monospaced.0.0.family=DejaVu Sans Mono -serif.3.4.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-BoldOblique.ttf -serif.2.1.family=DejaVu Serif -monospaced.1.3.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-Bold.ttf -serif.1.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -sansserif.1.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf -sansserif.3.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Bold.ttf -cachedir.0=/var/cache/fontconfig -serif.2.9.family=DejaVu Sans Mono -cachedir.2=/tmp/.fontconfig -sansserif.2.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-Oblique.ttf -cachedir.1=/tmp/.cache/fontconfig -serif.3.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf -sansserif.0.6.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -fcversion=21301 -sansserif.3.0.family=DejaVu Sans -serif.2.5.family=DejaVu LGC Sans Mono -serif.2.3.family=DejaVu Serif -serif.2.7.family=DejaVu LGC Sans -monospaced.0.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -serif.3.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -serif.2.length=11 -monospaced.2.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -serif.3.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -sansserif.0.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -serif.0.1.family=DejaVu Serif -monospaced.1.1.family=DejaVu Sans Mono -monospaced.1.5.family=DejaVu LGC Serif -serif.0.5.family=DejaVu Sans Mono -serif.3.2.family=DejaVu Serif -serif.3.6.family=DejaVu Sans -serif.0.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -sansserif.1.6.family=DejaVu LGC Sans Mono -serif.0.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf -sansserif.1.2.family=DejaVu Sans -monospaced.3.11.family=DejaVu Sans -monospaced.1.length=9 -monospaced.2.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono-Oblique.ttf -sansserif.2.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf -sansserif.2.7.family=DejaVu Math TeX Gyre -sansserif.2.3.family=DejaVu Sans -serif.2.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-Oblique.ttf -sansserif.0.0.family=DejaVu Sans -sansserif.1.3.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -sansserif.0.4.family=DejaVu Sans Mono -serif.3.9.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -sansserif.0.5.family=DejaVu Serif -serif.1.9.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -monospaced.2.7.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -monospaced.3.10.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -monospaced.3.7.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -sansserif.1.length=9 -sansserif.3.length=9 -serif.2.8.file=/usr/share/fonts/ttf-dejavu/DejaVuMathTeXGyre.ttf -monospaced.3.11.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -monospaced.3.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -monospaced.3.6.family=DejaVu Sans -sansserif.0.length=7 -monospaced.3.0.family=DejaVu Sans Mono -monospaced.3.3.family=DejaVu LGC Serif -monospaced.3.1.family=DejaVu Sans Mono -monospaced.3.8.family=DejaVu LGC Serif -sansserif.1.3.family=DejaVu Sans -monospaced.2.0.family=DejaVu Sans Mono -monospaced.2.2.family=DejaVu LGC Serif -sansserif.3.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -monospaced.3.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif-Italic.ttf -serif.1.8.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -monospaced.1.5.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSerif.ttf -monospaced.2.8.family=DejaVu Sans -sansserif.0.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -monospaced.1.4.family=DejaVu Sans -serif.2.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-Italic.ttf -serif.2.6.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Oblique.ttf -serif.0.length=8 -monospaced.1.7.family=DejaVu Sans -sansserif.2.2.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -sansserif.2.1.family=DejaVu Sans -serif.3.3.family=DejaVu Serif -serif.0.3.family=DejaVu Serif -sansserif.1.8.family=DejaVu Math TeX Gyre -serif.2.7.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSans-BoldOblique.ttf -serif.3.8.family=DejaVu Sans -serif.3.0.family=DejaVu Serif -serif.2.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSerif-BoldItalic.ttf -sansserif.0.1.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -sansserif.1.0.family=DejaVu Sans -serif.2.10.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -serif.2.2.family=DejaVu Serif -monospaced.2.8.file=/usr/share/fonts/ttf-dejavu/DejaVuSans.ttf -monospaced.0.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -serif.0.5.file=/usr/share/fonts/ttf-dejavu/DejaVuSansMono.ttf -sansserif.3.0.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-BoldOblique.ttf -sansserif.3.6.file=/usr/share/fonts/ttf-dejavu/DejaVuLGCSansMono-BoldOblique.ttf -monospaced.3.length=12 -monospaced.2.5.family=DejaVu Sans -monospaced.1.4.file=/usr/share/fonts/ttf-dejavu/DejaVuSans-Bold.ttf -sansserif.0.2.family=DejaVu Sans From a8399074116eeae60d235a2fcf021c7e55cd1b8a Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Tue, 14 Jun 2022 10:49:35 +0200 Subject: [PATCH 024/590] Improve changeset Signed-off-by: Olivier Liechti --- .changeset/great-roses-pump.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/.changeset/great-roses-pump.md b/.changeset/great-roses-pump.md index 263254b63c..16a49bd464 100644 --- a/.changeset/great-roses-pump.md +++ b/.changeset/great-roses-pump.md @@ -2,16 +2,22 @@ '@backstage/plugin-catalog': patch --- -Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as 'white'. This was an issue for themes that use a header with a white background. The color of the icon can now be overridden in the theme (PluginCatalogEntityContextMenu > button > color). Example: +Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as `white`. +This was an issue for themes that use a header with a white background. By default, the color of the icon is now `theme.palette.bursts.fontColor`. + +It can now also be overridden in the theme, which is only necessary if the header title, subtitle and three-dots icon need to have different colors. For example: + +```typescript export function createThemeOverrides(theme: BackstageTheme): Overrides { -return { -PluginCatalogEntityContextMenu: { -button: { -color: 'blue', -}, -}, -... -}, -... -} + return { + PluginCatalogEntityContextMenu: { + button: { + color: 'blue', + }, + }, + ... + }, + ... + } +``` From 066626f166fe5a794e55c75309446a7a63453858 Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Tue, 14 Jun 2022 15:16:38 +0200 Subject: [PATCH 025/590] Fix export Signed-off-by: Olivier Liechti --- plugins/catalog/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog/src/index.ts b/plugins/catalog/src/index.ts index cfe4851d09..f0f94656d5 100644 --- a/plugins/catalog/src/index.ts +++ b/plugins/catalog/src/index.ts @@ -62,6 +62,7 @@ export type { } from './components/EntityLinksCard'; export type { SystemDiagramCardClassKey } from './components/SystemDiagramCard'; export type { DefaultCatalogPageProps } from './components/CatalogPage'; +export type { EntityContextMenuClassKey } from './components/EntityContextMenu'; export type { HasComponentsCardProps } from './components/HasComponentsCard'; export type { HasResourcesCardProps } from './components/HasResourcesCard'; export type { HasSubcomponentsCardProps } from './components/HasSubcomponentsCard'; From 11a4d9157ca1cfd08c21a06b9f498c3dac0a0096 Mon Sep 17 00:00:00 2001 From: Olivier Liechti Date: Tue, 14 Jun 2022 15:33:45 +0200 Subject: [PATCH 026/590] Generate new api-report.md Signed-off-by: Olivier Liechti --- plugins/catalog/api-report.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index aea9c2b2c5..d1e8247f90 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -207,6 +207,9 @@ export interface DependsOnResourcesCardProps { // @public (undocumented) export const EntityAboutCard: (props: AboutCardProps) => JSX.Element; +// @public (undocumented) +export type EntityContextMenuClassKey = 'button'; + // @public (undocumented) export const EntityDependencyOfComponentsCard: ( props: DependencyOfComponentsCardProps, @@ -417,8 +420,4 @@ export type SystemDiagramCardClassKey = | 'componentNode' | 'apiNode' | 'resourceNode'; - -// Warnings were encountered during analysis: -// -// src/overridableComponents.d.ts:10:5 - (ae-forgotten-export) The symbol "EntityContextMenuClassKey" needs to be exported by the entry point index.d.ts ``` From 85f2d90543c4274e74b6dba044489b44e50adfd6 Mon Sep 17 00:00:00 2001 From: Maixmilian Ressel Date: Tue, 14 Jun 2022 16:22:54 +0200 Subject: [PATCH 027/590] docs: scaffolder: improve docs to setup the RepoUrlPicker authentication Signed-off-by: Maixmilian Ressel --- docs/auth/index.md | 18 ++++++++++++++++++ .../software-templates/writing-templates.md | 3 +++ microsite/pages/en/link.js | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/auth/index.md b/docs/auth/index.md index c34d244886..e644fb74ed 100644 --- a/docs/auth/index.md +++ b/docs/auth/index.md @@ -185,6 +185,24 @@ const app = createApp({ When using multiple auth providers like this, it's important that you configure the different sign-in resolvers so that they resolve to the same identity regardless of the method used. +## Scaffolder Configuration (Software Templates) + +If you want to use the authentication capabilities of the [Repository Picker](../features/software-templates/writing-templates.md#the-repository-picker) inside your Software Templates you will need to configure the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi) alongside your authentication provider. It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed. + +To set it up, you'll need to add an API factory entry to `packages/app/src/apis.ts`. The example below sets up the `ScmAuthApi` for an already configured GitLab authentication provider: + +```ts +createApiFactory({ + api: scmAuthApiRef, + deps: { + gitlabAuthApi: gitlabAuthApiRef, + }, + factory: ({ gitlabAuthApi }) => ScmAuth.forGitlab(gitlabAuthApi), +}); +``` + +In case you are using a custom authentication providers, you might need to add a [custom `ScmAuthApi` implementation](./index.md#custom-scmauthapi-implementation). + ## For Plugin Developers The Backstage frontend core APIs provide a set of Utility APIs for plugin developers diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 27e6e76817..4078b18a2b 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -397,6 +397,9 @@ There's also the ability to pass additional scopes when requesting the `oauth` token from the user, which you can do on a per-provider basis, in case your template can be published to multiple providers. +Note, that you will need to configure an [authentication provider](../../auth/index.md#configuring-authentication-providers), alongside the +[`ScmAuthApi`](../../auth/index.md#scaffolder-configuration-software-templates) for your source code management (scm) service to make this feature work. + ### Accessing the signed-in users details Sometimes when authoring templates, you'll want to access the user that is running the template, and get details from the profile or the users `Entity` in the Catalog. diff --git a/microsite/pages/en/link.js b/microsite/pages/en/link.js index 727b15bfd8..6f56aa768c 100644 --- a/microsite/pages/en/link.js +++ b/microsite/pages/en/link.js @@ -5,7 +5,7 @@ const React = require('react'); const redirects = { 'bind-routes': '/docs/plugins/composability#binding-external-routes-in-the-app', - 'scm-auth': '/docs/auth/#custom-scmauthapi-implementation', + 'scm-auth': '/docs/auth/#scaffolder-configuration-software-templates', }; const fallback = '/docs'; From 8fe235710154a4f6deaf6173ef15b421a37a62ee Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 14 Jun 2022 17:53:16 +0200 Subject: [PATCH 028/590] core-app-api: navigate to app base URL on signout Signed-off-by: Patrik Oldsberg --- .changeset/nervous-humans-sip.md | 5 ++ .../IdentityApi/AppIdentityProxy.test.ts | 16 +++++- .../IdentityApi/AppIdentityProxy.ts | 9 +++- packages/core-app-api/src/app/AppManager.tsx | 50 +++++++++++-------- 4 files changed, 55 insertions(+), 25 deletions(-) create mode 100644 .changeset/nervous-humans-sip.md diff --git a/.changeset/nervous-humans-sip.md b/.changeset/nervous-humans-sip.md new file mode 100644 index 0000000000..aa1ca2c60a --- /dev/null +++ b/.changeset/nervous-humans-sip.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +The `signOut` method of the `IdentityApi` will now navigate the user back to the base URL of the app as indicated by the `app.baseUrl` config. diff --git a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts index aa15182499..3d4f83b05d 100644 --- a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts +++ b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts @@ -31,7 +31,7 @@ describe('AppIdentityProxy', () => { it('should forward user identities', async () => { const proxy = new AppIdentityProxy(); - proxy.setTarget(mockIdentityApi); + proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/' }); const logs = await withLogCollector(async () => { mockIdentityApi.getBackstageIdentity.mockResolvedValueOnce({ @@ -55,7 +55,7 @@ describe('AppIdentityProxy', () => { it('should warn about invalid user entity refs', async () => { const proxy = new AppIdentityProxy(); - proxy.setTarget(mockIdentityApi); + proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/' }); const logs = await withLogCollector(async () => { mockIdentityApi.getBackstageIdentity.mockResolvedValueOnce({ @@ -79,4 +79,16 @@ describe('AppIdentityProxy', () => { error: [], }); }); + + it('should navigate to target URL on sign out', async () => { + const proxy = new AppIdentityProxy(); + proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/foo' }); + Object.defineProperty(window, 'location', { + writable: true, + value: {}, + }); + + await proxy.signOut(); + expect(location.href).toBe('/foo'); + }); }); diff --git a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts index 3ef3a1f6d3..2df351bc18 100644 --- a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts +++ b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts @@ -49,6 +49,7 @@ export class AppIdentityProxy implements IdentityApi { private target?: CompatibilityIdentityApi; private waitForTarget: Promise; private resolveTarget: (api: CompatibilityIdentityApi) => void = () => {}; + private signOutTargetUrl = '/'; constructor() { this.waitForTarget = new Promise(resolve => { @@ -57,8 +58,12 @@ export class AppIdentityProxy implements IdentityApi { } // This is called by the app manager once the sign-in page provides us with an implementation - setTarget(identityApi: CompatibilityIdentityApi) { + setTarget( + identityApi: CompatibilityIdentityApi, + targetOptions: { signOutTargetUrl: string }, + ) { this.target = identityApi; + this.signOutTargetUrl = targetOptions.signOutTargetUrl; this.resolveTarget(identityApi); } @@ -119,6 +124,6 @@ export class AppIdentityProxy implements IdentityApi { async signOut(): Promise { await this.waitForTarget.then(target => target.signOut()); - location.reload(); + location.href = this.signOutTargetUrl; } } diff --git a/packages/core-app-api/src/app/AppManager.tsx b/packages/core-app-api/src/app/AppManager.tsx index 75bab5c2df..f47ddf676a 100644 --- a/packages/core-app-api/src/app/AppManager.tsx +++ b/packages/core-app-api/src/app/AppManager.tsx @@ -334,41 +334,49 @@ export class AppManager implements BackstageApp { children: ReactElement; }) => { const [identityApi, setIdentityApi] = useState(); + const configApi = useApi(configApiRef); + const basePath = getBasePath(configApi); if (!identityApi) { return ; } - this.appIdentityProxy.setTarget(identityApi); + this.appIdentityProxy.setTarget(identityApi, { + signOutTargetUrl: basePath || '/', + }); return children; }; const AppRouter = ({ children }: PropsWithChildren<{}>) => { const configApi = useApi(configApiRef); - const mountPath = `${getBasePath(configApi)}/*`; + const basePath = getBasePath(configApi); + const mountPath = `${basePath}/*`; const { routeObjects } = useContext(InternalAppContext); // If the app hasn't configured a sign-in page, we just continue as guest. if (!SignInPageComponent) { - this.appIdentityProxy.setTarget({ - getUserId: () => 'guest', - getIdToken: async () => undefined, - getProfile: () => ({ - email: 'guest@example.com', - displayName: 'Guest', - }), - getProfileInfo: async () => ({ - email: 'guest@example.com', - displayName: 'Guest', - }), - getBackstageIdentity: async () => ({ - type: 'user', - userEntityRef: 'user:default/guest', - ownershipEntityRefs: ['user:default/guest'], - }), - getCredentials: async () => ({}), - signOut: async () => {}, - }); + this.appIdentityProxy.setTarget( + { + getUserId: () => 'guest', + getIdToken: async () => undefined, + getProfile: () => ({ + email: 'guest@example.com', + displayName: 'Guest', + }), + getProfileInfo: async () => ({ + email: 'guest@example.com', + displayName: 'Guest', + }), + getBackstageIdentity: async () => ({ + type: 'user', + userEntityRef: 'user:default/guest', + ownershipEntityRefs: ['user:default/guest'], + }), + getCredentials: async () => ({}), + signOut: async () => {}, + }, + { signOutTargetUrl: basePath || '/' }, + ); return ( From f306c2e842882669fc9925a813e71ad727d8b4ff Mon Sep 17 00:00:00 2001 From: James Russo Date: Wed, 15 Jun 2022 00:30:31 -0400 Subject: [PATCH 029/590] Add type to EntityLinks Add an optional type field to entity links that will allow developers to group and categorize links based on types. closes #10404 Signed-off-by: James Russo --- packages/catalog-model/src/entity/Entity.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/catalog-model/src/entity/Entity.ts b/packages/catalog-model/src/entity/Entity.ts index 96f19b2c8a..80c9adaffb 100644 --- a/packages/catalog-model/src/entity/Entity.ts +++ b/packages/catalog-model/src/entity/Entity.ts @@ -210,4 +210,9 @@ export type EntityLink = { * An optional semantic key that represents a visual icon. */ icon?: string; + + /** + * An optional value to categorize links into specific groups + */ + type?: string; }; From 1380b389dc99bbb04e660a80ab9121599ab60f1b Mon Sep 17 00:00:00 2001 From: James Russo Date: Wed, 15 Jun 2022 00:32:32 -0400 Subject: [PATCH 030/590] add changeset Signed-off-by: James Russo --- .changeset/shaggy-melons-drive.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/shaggy-melons-drive.md diff --git a/.changeset/shaggy-melons-drive.md b/.changeset/shaggy-melons-drive.md new file mode 100644 index 0000000000..cff45954fe --- /dev/null +++ b/.changeset/shaggy-melons-drive.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-model': patch +--- + +Adding an optional type field to entity links to group and categorize links From e636a012276519e4277c94f721c3924d64643a73 Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Wed, 15 Jun 2022 11:47:17 +0200 Subject: [PATCH 031/590] chore: replace `integrations.bitbucket` with `[..].bitbucketCloud` in `app-config.yaml` Replace `integrations.bitbucket` with `integrations.bitbucketCloud` in `app-config.yaml` (local dev, demo). Signed-off-by: Patrick Jungermann --- app-config.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index 5919deb1ee..2f9f6e4f9a 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -182,9 +182,8 @@ integrations: gitlab: - host: gitlab.com token: ${GITLAB_TOKEN} - bitbucket: - - host: bitbucket.org - username: ${BITBUCKET_USERNAME} + bitbucketCloud: + - username: ${BITBUCKET_USERNAME} appPassword: ${BITBUCKET_APP_PASSWORD} ### Example for how to add your bitbucket server instance using the API: # - host: server.bitbucket.com From d40b199c487c0aa8344d6982c1143c221fe6e7ab Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 15 Jun 2022 12:13:28 +0200 Subject: [PATCH 032/590] ADOPTERS.md: remove duplicate adopter Signed-off-by: Patrik Oldsberg --- ADOPTERS.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 4df952be6d..c66bab4266 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -161,10 +161,9 @@ _If you're using Backstage in your organization, please try to add your company | [OVHcloud](https://www.ovhcloud.com/fr/) | [Jean-Philippe Blary](https://github.com/blaryjp), [Arnaud Bauer](mailto:arnaud.bauer@ovhcloud.com), [Flavien Chantelot](https://github.com/Dorn-) | We're providing Backstage to our collaborators to ease their daily jobs, and let them extends it using plugins. | | [Procter & Gamble](https://us.pg.com/) | [Binita Nayak](https://github.com/binitan), [Josh Rose](https://github.com/joshuarose), [RJ Winkler](https://github.com/rjwink) | P&G leverages Backstage to build internal developer portal to ensure developers' happiness. This developer portal shall act as single source of information needed by development teams to seamlessly create, find and maintain their software components/resources/documentation. | | [SANS Institute](https://www.sans.org) | [Christopher Klewin](mailto:cklewin@sans.org) | Developer portal for centralized visibility, reporting, and tooling across multiple organizations. | -| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) +| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) | [Kaluza](https://www.kaluza.com) | [James Condren](mailto:james.condron@kaluza.com) | To provide an automated golden path to developers, with a focus on discovery and documentation | | [LinkedIn](https://linkedin.com) | [Joshua Lawrence](mailto:jlawrence@linkedin.com) | We are building a platform for internal web tools | -| [SANS Institute](https://www.sans.org) | [Justin Selleck](mailto:jselleck@sans.org) | SANS uses backstage to track components in github and to facilitate docs near code. | | [Forto](https://forto.com) | [Rodolfo Matos](mailto:rodolfo.matos@forto.com) | Still in a experimental phase/assessing the organisational fit. We will be using it mostly a developer portal -- pretty standard use case. | | [BetterUp](https://betterup.com) | [Jordan Hochenbaum](mailto:jordan.hochenbaum@betterup.co) | We're starting to use Backstage as the central hub for service discovery, documentation, and develop experience. | | [warung pintar](https://warungpintar.co.id/) | [Muhammad Rafly Andrianza](mailto:rafly.andrianza@warungpintar.co) | Initial Work Developer Portal with TechRadar, Service Catalogue, TechDocs, anything about platform & infrastructure resources. | From 8829e175f2cd8334373ba6971b181631a660a050 Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Wed, 15 Jun 2022 13:15:52 +0200 Subject: [PATCH 033/590] fix: allow frontend visibility for `integrations` itself Currently, `integrations` is retrieved at catalog-import to check configured integrations. This could fail if there was no config below `integrations` which has `@visibility frontend`. This happened if no integration or only non-Github integrations without frontend visible properties like `integrations.bitbucketCloud` are used. After this change, at least `integrations` will always be visible to the frontend. Closes: #11700 Signed-off-by: Patrick Jungermann --- .changeset/sweet-plants-sparkle.md | 5 +++++ packages/integration/config.d.ts | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/sweet-plants-sparkle.md diff --git a/.changeset/sweet-plants-sparkle.md b/.changeset/sweet-plants-sparkle.md new file mode 100644 index 0000000000..69e7647849 --- /dev/null +++ b/.changeset/sweet-plants-sparkle.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +Allow frontend visibility for `integrations` itself. diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index c14f5c76cd..22acc5cd70 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -15,7 +15,10 @@ */ export interface Config { - /** Configuration for integrations towards various external repository provider systems */ + /** + * Configuration for integrations towards various external repository provider systems + * @visibility frontend + */ integrations?: { /** Integration configuration for Azure */ azure?: Array<{ From 272106fdad56a6a8930349ef84d9aa13e70f2a5d Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Wed, 15 Jun 2022 13:07:14 +0200 Subject: [PATCH 034/590] fix: check for `integrations.github` without retrieving `integrations` Support use without `integrations` or only integrations without frontend visible properties (e.g., `bitbucketCloud`) being configured by checking `integrations.github` directly without attempting to load `integrations`. Previously, `integrations` was retrieved first and then the existence of the key `github` was checked. This could fail if there was no config below `integrations` which has `@visibility frontend`. This happened if no integration or only non-Github integrations without frontend visible properties like `integrations.bitbucketCloud` are used. After this change, we will check `integrations.github` directly. Closes: #11700 Signed-off-by: Patrick Jungermann --- .changeset/unlucky-stingrays-juggle.md | 5 +++++ .../src/components/ImportInfoCard/ImportInfoCard.tsx | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changeset/unlucky-stingrays-juggle.md diff --git a/.changeset/unlucky-stingrays-juggle.md b/.changeset/unlucky-stingrays-juggle.md new file mode 100644 index 0000000000..f2e83f7163 --- /dev/null +++ b/.changeset/unlucky-stingrays-juggle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-import': patch +--- + +Support use without `integrations` or only integrations without frontend visible properties (e.g., `bitbucketCloud`) being configured by checking `integrations.github` directly without attempting to load `integrations`. diff --git a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx index 7fa6b13a82..4779e2d64b 100644 --- a/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx +++ b/plugins/catalog-import/src/components/ImportInfoCard/ImportInfoCard.tsx @@ -46,8 +46,7 @@ export const ImportInfoCard = (props: ImportInfoCardProps) => { const appTitle = configApi.getOptional('app.title') || 'Backstage'; const catalogImportApi = useApi(catalogImportApiRef); - const integrations = configApi.getConfig('integrations'); - const hasGithubIntegration = integrations.has('github'); + const hasGithubIntegration = configApi.has('integrations.github'); const catalogFilename = useCatalogFilename(); From b1c5b42849a400dbac414df2d8f20c813d2111a1 Mon Sep 17 00:00:00 2001 From: Alex Rybchenko Date: Wed, 15 Jun 2022 13:58:33 +0200 Subject: [PATCH 035/590] added type predicates for entities Signed-off-by: Alex Rybchenko --- .../src/components/EntitySwitch/conditions.ts | 61 ++++++++++++++++++- .../src/components/EntitySwitch/index.ts | 2 +- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.ts b/plugins/catalog/src/components/EntitySwitch/conditions.ts index 5f50fde5c9..b6837627c0 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.ts @@ -14,7 +14,17 @@ * limitations under the License. */ -import { Entity, ComponentEntity } from '@backstage/catalog-model'; +import { + ApiEntity, + ComponentEntity, + DomainEntity, + Entity, + GroupEntity, + LocationEntity, + ResourceEntity, + SystemEntity, + UserEntity, +} from '@backstage/catalog-model'; function strCmp(a: string | undefined, b: string | undefined): boolean { return Boolean( @@ -57,3 +67,52 @@ export function isComponentType(types: string | string[]) { export function isNamespace(namespaces: string | string[]) { return (entity: Entity) => strCmpAll(entity.metadata?.namespace, namespaces); } + +/** + * @public + */ +export function isApiEntity(entity: Entity): entity is ApiEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'API'; +} +/** + * @public + */ +export function isComponentEntity(entity: Entity): entity is ComponentEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'COMPONENT'; +} +/** + * @public + */ +export function isDomainEntity(entity: Entity): entity is DomainEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'DOMAIN'; +} +/** + * @public + */ +export function isGroupEntity(entity: Entity): entity is GroupEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'GROUP'; +} +/** + * @public + */ +export function isLocationEntity(entity: Entity): entity is LocationEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'LOCATION'; +} +/** + * @public + */ +export function isResourceEntity(entity: Entity): entity is ResourceEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'RESOURCE'; +} +/** + * @public + */ +export function isSystemEntity(entity: Entity): entity is SystemEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'SYSTEM'; +} +/** + * @public + */ +export function isUserEntity(entity: Entity): entity is UserEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'USER'; +} diff --git a/plugins/catalog/src/components/EntitySwitch/index.ts b/plugins/catalog/src/components/EntitySwitch/index.ts index 6cccf4be6e..5d0537bfa5 100644 --- a/plugins/catalog/src/components/EntitySwitch/index.ts +++ b/plugins/catalog/src/components/EntitySwitch/index.ts @@ -16,4 +16,4 @@ export { EntitySwitch } from './EntitySwitch'; export type { EntitySwitchProps, EntitySwitchCaseProps } from './EntitySwitch'; -export { isKind, isNamespace, isComponentType } from './conditions'; +export * from './conditions'; From b1edb5cfd9e2761a5715152e06532a6c6f8b85b7 Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Wed, 15 Jun 2022 14:25:19 +0200 Subject: [PATCH 036/590] fix: fix parsing of S3 URLs for the default region Closes: #11913 Signed-off-by: Patrick Jungermann --- .changeset/chilled-mirrors-grab.md | 5 +++++ .../backend-common/src/reading/AwsS3UrlReader.test.ts | 9 +++++++++ packages/backend-common/src/reading/AwsS3UrlReader.ts | 8 +++++--- 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 .changeset/chilled-mirrors-grab.md diff --git a/.changeset/chilled-mirrors-grab.md b/.changeset/chilled-mirrors-grab.md new file mode 100644 index 0000000000..ecc95680e2 --- /dev/null +++ b/.changeset/chilled-mirrors-grab.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Fix parsing of S3 URLs for the default region. diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index 0ae64e9404..454b8a2c5a 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -39,6 +39,15 @@ const treeResponseFactory = DefaultReadTreeResponseFactory.create({ describe('parseUrl', () => { it('supports all aws formats', () => { + expect( + parseUrl('https://s3.amazonaws.com/my.bucket-3/a/puppy.jpg', { + host: 'amazonaws.com', + }), + ).toEqual({ + path: 'a/puppy.jpg', + bucket: 'my.bucket-3', + region: 'us-east-1', + }); expect( parseUrl('https://s3.us-west-2.amazonaws.com/my.bucket-3/a/puppy.jpg', { host: 'amazonaws.com', diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts index b0ac81676a..7c314cf036 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts @@ -35,6 +35,8 @@ import { ForwardedError, NotModifiedError } from '@backstage/errors'; import { ListObjectsV2Output, ObjectList } from 'aws-sdk/clients/s3'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +const DEFAULT_REGION = 'us-east-1'; + /** * Path style URLs: https://s3.(region).amazonaws.com/(bucket)/(key) * The region can also be on the old form: https://s3-(region).amazonaws.com/(bucket)/(key) @@ -57,7 +59,7 @@ export function parseUrl( // Treat Amazon hosted separately because it has special region logic if (config.host === 'amazonaws.com') { const match = host.match( - /^(?:([a-z0-9.-]+)\.)?s3[.-]([a-z0-9-]+)\.amazonaws\.com$/, + /^(?:([a-z0-9.-]+)\.)?s3(?:[.-]([a-z0-9-]+))?\.amazonaws\.com$/, ); if (!match) { throw new Error(`Invalid AWS S3 URL ${url}`); @@ -76,14 +78,14 @@ export function parseUrl( return { path: pathname.substring(slashIndex + 1), bucket: pathname.substring(0, slashIndex), - region: hostRegion, + region: hostRegion ?? DEFAULT_REGION, }; } return { path: pathname, bucket: hostBucket, - region: hostRegion, + region: hostRegion ?? DEFAULT_REGION, }; } From ee3c232c60d3dd5aab28f9dcbcf4633a83b3ae17 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 15 Jun 2022 14:29:21 +0200 Subject: [PATCH 037/590] e2e-test: make sure workspace dep packages are clean Signed-off-by: Patrik Oldsberg --- packages/e2e-test/src/commands/run.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index e1477d98d7..d324aeafaf 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -235,6 +235,18 @@ async function createApp( print('Rewriting module resolutions of app to use workspace packages'); await overrideModuleResolutions(appDir, workspaceDir); + // Yarn does not clean up node_module folders in the linked in dependencies by itself + print('Cleaning up node_modules in workspace'); + await fs.remove(resolvePath(workspaceDir, 'node_modules')); + for (const wsDir of ['packages', 'plugins']) { + for (const dir of await fs.readdir(resolvePath(workspaceDir, wsDir))) { + const moduleDir = resolvePath(workspaceDir, wsDir, dir, 'node_modules'); + if (await fs.pathExists(moduleDir)) { + await fs.remove(moduleDir); + } + } + } + print('Pinning yarn version and registry in app'); await pinYarnVersion(appDir); await fs.writeFile( From 49ff472c0b527bea729ce23de65fb62f26dd20ad Mon Sep 17 00:00:00 2001 From: ivgo Date: Wed, 15 Jun 2022 15:27:30 +0200 Subject: [PATCH 038/590] Add possibility to scan all the groups in the project Signed-off-by: ivgo --- .changeset/two-crews-accept.md | 14 ++++ docs/integrations/gitlab/discovery.md | 12 +++ .../catalog-backend-module-gitlab/config.d.ts | 74 ++++++++++++------- .../src/providers/config.test.ts | 17 +++++ .../src/providers/config.ts | 17 ++++- 5 files changed, 105 insertions(+), 29 deletions(-) create mode 100644 .changeset/two-crews-accept.md diff --git a/.changeset/two-crews-accept.md b/.changeset/two-crews-accept.md new file mode 100644 index 0000000000..5885b1346d --- /dev/null +++ b/.changeset/two-crews-accept.md @@ -0,0 +1,14 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': minor +--- + +Add the possibility in the `GitlabDiscoveryEntityProvider` to scan the whole project instead of concrete groups. For that, use a configuration like this one: + +```yaml +catalog: + providers: + gitlab: + host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Uses `master` as default + entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` +``` diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md index ea151e9415..a7dd0a03df 100644 --- a/docs/integrations/gitlab/discovery.md +++ b/docs/integrations/gitlab/discovery.md @@ -26,6 +26,18 @@ catalog: entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` ``` +If you desire so, it's also possible to execute the gitlab discovery in your entire +project. In order to do that, use this catalog configuration instead: + +```yaml +catalog: + providers: + gitlab: + host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Uses `master` as default + entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` +``` + As this provider is not one of the default providers, you will first need to install the gitlab catalog plugin: diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts index 5b0d42c81d..0626cb9488 100644 --- a/plugins/catalog-backend-module-gitlab/config.d.ts +++ b/plugins/catalog-backend-module-gitlab/config.d.ts @@ -23,33 +23,53 @@ export interface Config { /** * GitlabDiscoveryEntityProvider configuration */ - gitlab?: Record< - string, - { - /** - * (Required) Gitlab's host name. - * @visibility backend - */ - host: string; - /** - * (Required) Gitlab's group[/subgroup] where the discovery is done. - * @visibility backend - */ - group: string; - /** - * (Optional) Default branch to read the catalog-info.yaml file. - * If not set, 'master' will be used. - * @visibility backend - */ - branch?: string; - /** - * (Optional) The name used for the catalog file. - * If not set, 'catalog-info.yaml' will be used. - * @visibility backend - */ - entityFilename?: string; - } - >; + gitlab?: + | { + /** + * (Required) Gitlab's host name. + * @visibility backend + */ + host: string; + /** + * (Optional) Default branch to read the catalog-info.yaml file. + * If not set, 'master' will be used. + * @visibility backend + */ + branch?: string; + /** + * (Optional) The name used for the catalog file. + * If not set, 'catalog-info.yaml' will be used. + * @visibility backend + */ + entityFilename?: string; + } + | Record< + string, + { + /** + * (Required) Gitlab's host name. + * @visibility backend + */ + host: string; + /** + * (Required) Gitlab's group[/subgroup] where the discovery is done. + * @visibility backend + */ + group: string; + /** + * (Optional) Default branch to read the catalog-info.yaml file. + * If not set, 'master' will be used. + * @visibility backend + */ + branch?: string; + /** + * (Optional) The name used for the catalog file. + * If not set, 'catalog-info.yaml' will be used. + * @visibility backend + */ + entityFilename?: string; + } + >; }; }; } diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts index d28930b151..429743f4bd 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts @@ -103,4 +103,21 @@ describe('config', () => { "Missing required config value at 'catalog.providers.gitlab.test.group'", ); }); + + it('read full gitlab project', () => { + const config = new ConfigReader({ + catalog: { + providers: { + gitlab: { + host: 'host', + branch: 'main', + }, + }, + }, + }); + + const result = readGitlabConfigs(config); + expect(result).toHaveLength(1); + expect(result[0].group).toEqual(''); + }); }); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.ts index f7eb316997..56df8d62f1 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.ts @@ -48,6 +48,7 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { * @param config - The config object to extract from */ export function readGitlabConfigs(config: Config): GitlabProviderConfig[] { + const reservedParams = ['host', 'group', 'branch', 'catalogFile']; const configs: GitlabProviderConfig[] = []; const providerConfigs = config.getOptionalConfig('catalog.providers.gitlab'); @@ -56,8 +57,20 @@ export function readGitlabConfigs(config: Config): GitlabProviderConfig[] { return configs; } - for (const id of providerConfigs.keys()) { - configs.push(readGitlabConfig(id, providerConfigs.getConfig(id))); + if (providerConfigs.keys().some(r => reservedParams.indexOf(r) >= 0)) { + configs.push({ + id: 'full-check', + group: '', + branch: providerConfigs.getOptionalString('branch') ?? 'master', + host: providerConfigs.getString('host'), + catalogFile: + providerConfigs.getOptionalString('entityFilename') ?? + 'catalog-info.yaml', + }); + } else { + for (const id of providerConfigs.keys()) { + configs.push(readGitlabConfig(id, providerConfigs.getConfig(id))); + } } return configs; From 82f052e74bc21948feb3e45793b94e6cc31e4d55 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 8 Jun 2022 10:24:34 +0200 Subject: [PATCH 039/590] move widget to its own package Signed-off-by: Kiss Miklos --- plugins/api-docs-react/.eslintrc.js | 1 + plugins/api-docs-react/README.md | 40 +++++ plugins/api-docs-react/package.json | 48 ++++++ plugins/api-docs-react/src/index.ts | 23 +++ plugins/api-docs-react/src/setupTests.ts | 17 +++ plugins/api-docs-react/src/widgets.tsx | 28 ++++ yarn.lock | 181 ++++++++++++++++++++++- 7 files changed, 331 insertions(+), 7 deletions(-) create mode 100644 plugins/api-docs-react/.eslintrc.js create mode 100644 plugins/api-docs-react/README.md create mode 100644 plugins/api-docs-react/package.json create mode 100644 plugins/api-docs-react/src/index.ts create mode 100644 plugins/api-docs-react/src/setupTests.ts create mode 100644 plugins/api-docs-react/src/widgets.tsx diff --git a/plugins/api-docs-react/.eslintrc.js b/plugins/api-docs-react/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/api-docs-react/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/api-docs-react/README.md b/plugins/api-docs-react/README.md new file mode 100644 index 0000000000..f5e88314e9 --- /dev/null +++ b/plugins/api-docs-react/README.md @@ -0,0 +1,40 @@ +# @backstage/plugin-api-docs-react + +### Setup + +This widget will render the generated `protoc-gen-doc` descriptors with the `grpc-docs` package. For this make sure you use the `grpc-docs` as the type in the API catalog file. + +```yaml +spec: + type: grpc-docs + owner: foo + definition: + $text: https://fetch-my-json.com/awesome-resource.json +``` + +### Add the GrpcDocsApiWidget to your apis + +Add the widget to your `apiDocsConfigRef` in the following way. Make sure the `apiEntity.spec.type` is compared to `grpc-docs` + +```ts +// packages/app/apis.ts + createApiFactory({ + api: apiDocsConfigRef, + deps: {}, + factory: () => { + // load the default widgets + const definitionWidgets = defaultDefinitionWidgets(); + return { + getApiDefinitionWidget: (apiEntity: ApiEntity) => { + // custom rendering for grpc-docs + if (apiEntity.spec.type === 'grpc-docs') { + return grpcDocsApiWidget(); + } + + // fallback to the defaults + return definitionWidgets.find(d => d.type === apiEntity.spec.type); + }, + }; + }, + }), +``` diff --git a/plugins/api-docs-react/package.json b/plugins/api-docs-react/package.json new file mode 100644 index 0000000000..f29153488e --- /dev/null +++ b/plugins/api-docs-react/package.json @@ -0,0 +1,48 @@ +{ + "name": "@backstage/plugin-api-docs-react", + "description": "Common functionalities for the api-docs-react plugin", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "web-library" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/permission-react" + }, + "keywords": [ + "backstage" + ], + "scripts": { + "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": { + "grpc-docs": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.13.1 || ^17.0.0", + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.17.2-next.0", + "@testing-library/jest-dom": "^5.16.4" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/api-docs-react/src/index.ts b/plugins/api-docs-react/src/index.ts new file mode 100644 index 0000000000..8cca60ac60 --- /dev/null +++ b/plugins/api-docs-react/src/index.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +/** + * Package encapsulating utilities to be shared by frontend TechDocs plugins. + * + * @packageDocumentation + */ + +export { grpcDocsApiWidget } from './widgets'; diff --git a/plugins/api-docs-react/src/setupTests.ts b/plugins/api-docs-react/src/setupTests.ts new file mode 100644 index 0000000000..7a459ed24e --- /dev/null +++ b/plugins/api-docs-react/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * 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 '@testing-library/jest-dom'; diff --git a/plugins/api-docs-react/src/widgets.tsx b/plugins/api-docs-react/src/widgets.tsx new file mode 100644 index 0000000000..7365c4d73a --- /dev/null +++ b/plugins/api-docs-react/src/widgets.tsx @@ -0,0 +1,28 @@ +/* + * 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 { GRPCSelfGeneratedAPIReference } from 'grpc-docs'; + +export function grpcDocsApiWidget() { + return { + type: 'grpc-docs', + title: 'gRPC', + component: (definition: string) => ( + + ), + }; +} diff --git a/yarn.lock b/yarn.lock index 0d8a9f0a80..7ec3615686 100644 --- a/yarn.lock +++ b/yarn.lock @@ -409,7 +409,7 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.16.7": +"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== @@ -523,7 +523,7 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== @@ -1873,6 +1873,28 @@ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== +"@emotion/is-prop-valid@^1.1.0": + version "1.1.2" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" + integrity sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ== + dependencies: + "@emotion/memoize" "^0.7.4" + +"@emotion/memoize@^0.7.4": + version "0.7.5" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" + integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2": version "3.0.2" resolved "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" @@ -2550,6 +2572,20 @@ resolved "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== +"@improbable-eng/grpc-web@^0.14.0": + version "0.14.1" + resolved "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz#f4662f64dc89c0f956a94bb8a3b576556c74589c" + integrity sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw== + dependencies: + browser-headers "^0.4.1" + +"@improbable-eng/grpc-web@^0.15.0": + version "0.15.0" + resolved "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.15.0.tgz#3e47e9fdd90381a74abd4b7d26e67422a2a04bef" + integrity sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg== + dependencies: + browser-headers "^0.4.1" + "@ioredis/commands@^1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@ioredis/commands/-/commands-1.1.1.tgz#2ba4299ea624a6bfac15b35f6df90b0015691ec3" @@ -5387,7 +5423,7 @@ lz-string "^1.4.4" pretty-format "^27.0.2" -"@testing-library/jest-dom@^5.10.1": +"@testing-library/jest-dom@^5.10.1", "@testing-library/jest-dom@^5.16.4": version "5.16.4" resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== @@ -8109,6 +8145,22 @@ babel-plugin-polyfill-regenerator@^0.3.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" +"babel-plugin-styled-components@>= 1.12.0": + version "2.0.7" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" + integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + picomatch "^2.3.0" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" @@ -8322,6 +8374,11 @@ big.js@^5.2.2: resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +big.js@^6.1.1: + version "6.2.0" + resolved "https://registry.npmjs.org/big.js/-/big.js-6.2.0.tgz#39c60822aecb0f34a1d79a90fe9908a0ddf45e1d" + integrity sha512-paIKvJiAaOYdLt6MfnvxkDo64lTOV257XYJyX3oJnJQocIclUn+48k6ZerH/c5FxWE6DGJu1TKDYis7tqHg9kg== + bignumber.js@^9.0.0: version "9.0.1" resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" @@ -8550,6 +8607,11 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-headers@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02" + integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg== + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -8908,6 +8970,11 @@ camelcase@^6.2.0, camelcase@^6.3.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -10178,6 +10245,11 @@ css-color-converter@^2.0.0: color-name "^1.1.4" css-unit-converter "^1.1.2" +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + css-declaration-sorter@^6.0.3: version "6.1.3" resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" @@ -10218,6 +10290,15 @@ css-select@^4.1.3: domutils "^2.6.0" nth-check "^2.0.0" +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -13235,6 +13316,14 @@ gcp-metadata@^5.0.0: gaxios "^5.0.0" json-bigint "^1.0.0" +gendocu-public-apis@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/gendocu-public-apis/-/gendocu-public-apis-1.0.0.tgz#ba9212207c6b4c9ba131b6cafb82deb07f068010" + integrity sha512-2XbY+joWdhBK2Z7b5NaP8+3NkOYZjHkqux83lpgdShp1QN9eu10s/MojCaJ7WiCTB7ZKIkfqUtWgWipDxDPjpw== + dependencies: + "@improbable-eng/grpc-web" "^0.14.0" + google-protobuf "^3.15.8" + generate-function@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" @@ -13634,6 +13723,11 @@ google-p12-pem@^3.1.3: dependencies: node-forge "^1.3.1" +google-protobuf@^3.15.8, google-protobuf@^3.19.1: + version "3.20.1" + resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.20.1.tgz#1b255c2b59bcda7c399df46c65206aa3c7a0ce8b" + integrity sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw== + got@11.8.3, got@^11.8.0: version "11.8.3" resolved "https://registry.npmjs.org/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" @@ -13777,6 +13871,26 @@ grouped-queue@^2.0.0: resolved "https://registry.npmjs.org/grouped-queue/-/grouped-queue-2.0.0.tgz#a2c6713f2171e45db2c300a3a9d7c119d694dac8" integrity sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw== +grpc-docs@^1.0.6, grpc-docs@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/grpc-docs/-/grpc-docs-1.1.2.tgz#021d065f8a386bdc07d16f80a8ab604cddefba06" + integrity sha512-IUQJpDNgCgq5aL1OWkcvK2Yeky0tscEOI0rDLb4fNxXAOgamrsEI/14aNX+DRzGq3gs/NTF9xU7YqN2kj3OiFA== + dependencies: + "@improbable-eng/grpc-web" "^0.15.0" + "@types/minimatch" "^3.0.5" + gendocu-public-apis "^1.0.0" + google-protobuf "^3.19.1" + grpc-docs "^1.0.6" + js-yaml "^4.1.0" + minimatch "^3.0.4" + react-copy-to-clipboard "^5.0.4" + react-dom "^16.13.1" + react-is "^16.8.0" + react-syntax-highlighter "^15.4.5" + rollup "^0.60" + rollup-plugin-smart-asset "^2.1.2" + styled-components "^5.3.3" + gtoken@^5.0.4: version "5.1.0" resolved "https://registry.npmjs.org/gtoken/-/gtoken-5.1.0.tgz#4ba8d2fc9a8459098f76e7e8fd7beaa39fda9fe4" @@ -14053,7 +14167,7 @@ hogan.js@^3.0.2: mkdirp "0.3.0" nopt "1.0.10" -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -17176,7 +17290,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.0, lodash@~4.17.15, lodash@~4.17.4: +lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.0, lodash@~4.17.15, lodash@~4.17.4: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -18150,7 +18264,7 @@ mime@1.6.0, mime@^1.3.4, mime@^1.4.1: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.2.0, mime@^2.5.0: +mime@^2.2.0, mime@^2.5.0, mime@^2.5.2: version "2.6.0" resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== @@ -20163,7 +20277,7 @@ picocolors@^1.0.0: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -21194,6 +21308,14 @@ react-copy-to-clipboard@5.0.4: copy-to-clipboard "^3" prop-types "^15.5.8" +react-copy-to-clipboard@^5.0.4: + version "5.1.0" + resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz#09aae5ec4c62750ccb2e6421a58725eabc41255c" + integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== + dependencies: + copy-to-clipboard "^3.3.1" + prop-types "^15.8.1" + react-debounce-input@=3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.4.tgz#8204373a6498776536a2fcc7e467d054c3b729d4" @@ -21232,6 +21354,16 @@ react-dev-utils@^12.0.0-next.60: strip-ansi "^6.0.1" text-table "^0.2.0" +react-dom@^16.13.1: + version "16.14.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + react-dom@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -22390,6 +22522,17 @@ rollup-plugin-postcss@*, rollup-plugin-postcss@^4.0.0: safe-identifier "^0.4.2" style-inject "^0.3.0" +rollup-plugin-smart-asset@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/rollup-plugin-smart-asset/-/rollup-plugin-smart-asset-2.1.2.tgz#08c171122395b848c0c342eb344d2ffcd87261bc" + integrity sha512-Y/gD3abliw3F20uY6ILpmH6sokXKntuTFKvDdLEJxHFcyQRsTb12u2KbsapqPZDa4JN/Nxx7BslYlZ/KmYAtPg== + dependencies: + big.js "^6.1.1" + magic-string "^0.25.7" + mime "^2.5.2" + mkdirp "^1.0.4" + rollup-pluginutils "^2.8.2" + rollup-pluginutils@^2.8.2: version "2.8.2" resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" @@ -22397,6 +22540,14 @@ rollup-pluginutils@^2.8.2: dependencies: estree-walker "^0.6.1" +rollup@^0.60: + version "0.60.7" + resolved "https://registry.npmjs.org/rollup/-/rollup-0.60.7.tgz#2b62ef9306f719b1ab85a7814b3e6596ac51fae8" + integrity sha512-Uj5I1A2PnDgA79P+v1dsNs1IHVydNgeJdKWRfoEJJdNMmyx07TRYqUtPUINaZ/gDusncFy1SZsT3lJnBBI8CGw== + dependencies: + "@types/estree" "0.0.39" + "@types/node" "*" + rollup@^0.63.4: version "0.63.5" resolved "https://registry.npmjs.org/rollup/-/rollup-0.63.5.tgz#5543eecac9a1b83b7e1be598b5be84c9c0a089db" @@ -23794,6 +23945,22 @@ style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" +styled-components@^5.3.3: + version "5.3.5" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz#a750a398d01f1ca73af16a241dec3da6deae5ec4" + integrity sha512-ndETJ9RKaaL6q41B69WudeqLzOpY1A/ET/glXkNZ2T7dPjPqpPCXXQjDFYZWwNnE5co0wX+gTCqx9mfxTmSIPg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + stylehacks@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" From 3a086ef50c8db162a49c109d644def6dc74cd4d3 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 8 Jun 2022 11:57:40 +0200 Subject: [PATCH 040/590] fix directory name Signed-off-by: Kiss Miklos --- plugins/api-docs-react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/api-docs-react/package.json b/plugins/api-docs-react/package.json index f29153488e..f6bdf00267 100644 --- a/plugins/api-docs-react/package.json +++ b/plugins/api-docs-react/package.json @@ -18,7 +18,7 @@ "repository": { "type": "git", "url": "https://github.com/backstage/backstage", - "directory": "plugins/permission-react" + "directory": "plugins/api-docs-react" }, "keywords": [ "backstage" From e0328f2107f7aacc779f30f06680ef70cc5b85e0 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 8 Jun 2022 12:58:14 +0200 Subject: [PATCH 041/590] update readme Signed-off-by: Kiss Miklos --- .changeset/red-games-decide.md | 5 +++ plugins/api-docs-react/README.md | 44 ++++++++++++++++---------- plugins/api-docs-react/src/widgets.tsx | 16 ++++------ 3 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 .changeset/red-games-decide.md diff --git a/.changeset/red-games-decide.md b/.changeset/red-games-decide.md new file mode 100644 index 0000000000..cbf36de833 --- /dev/null +++ b/.changeset/red-games-decide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs-react': major +--- + +Adds an api widget to render protoc-gen-doc generated descriptors by the grpc-docs package diff --git a/plugins/api-docs-react/README.md b/plugins/api-docs-react/README.md index f5e88314e9..3a8e099e11 100644 --- a/plugins/api-docs-react/README.md +++ b/plugins/api-docs-react/README.md @@ -1,40 +1,52 @@ # @backstage/plugin-api-docs-react -### Setup +## Setup -This widget will render the generated `protoc-gen-doc` descriptors with the `grpc-docs` package. For this make sure you use the `grpc-docs` as the type in the API catalog file. - -```yaml -spec: - type: grpc-docs - owner: foo - definition: - $text: https://fetch-my-json.com/awesome-resource.json +``` +yarn add @backstage/plugin-api-docs-react ``` -### Add the GrpcDocsApiWidget to your apis +## Add the GrpcDocsApiWidget to your apis Add the widget to your `apiDocsConfigRef` in the following way. Make sure the `apiEntity.spec.type` is compared to `grpc-docs` ```ts +import { grpcDocsApiWidget } from '@backstage/plugin-api-docs-react'; // packages/app/apis.ts +export const apis: AnyApiFactory[] = [ createApiFactory({ api: apiDocsConfigRef, deps: {}, factory: () => { // load the default widgets const definitionWidgets = defaultDefinitionWidgets(); + // add the grpc-docs api widget to the definition widgets + definitionWidgets.push(grpcDocsApiWidget); return { getApiDefinitionWidget: (apiEntity: ApiEntity) => { - // custom rendering for grpc-docs - if (apiEntity.spec.type === 'grpc-docs') { - return grpcDocsApiWidget(); - } - - // fallback to the defaults + // find the widget for the type of api entity return definitionWidgets.find(d => d.type === apiEntity.spec.type); }, }; }, }), +]; +``` + +### Set the type in your api entities + +This widget will render the generated `protoc-gen-doc` descriptors with the `grpc-docs` package. For this make sure you use the `grpc-docs` as the type in the API catalog file. + +```yaml +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + name: hello-world + description: Hello World example for gRPC +spec: + type: grpc-docs + lifecycle: deprecated + owner: foo + definition: + $text: https://fetch-my-json.com/awesome-resource.json ``` diff --git a/plugins/api-docs-react/src/widgets.tsx b/plugins/api-docs-react/src/widgets.tsx index 7365c4d73a..cb0dadf787 100644 --- a/plugins/api-docs-react/src/widgets.tsx +++ b/plugins/api-docs-react/src/widgets.tsx @@ -17,12 +17,10 @@ import React from 'react'; import { GRPCSelfGeneratedAPIReference } from 'grpc-docs'; -export function grpcDocsApiWidget() { - return { - type: 'grpc-docs', - title: 'gRPC', - component: (definition: string) => ( - - ), - }; -} +export const grpcDocsApiWidget = { + type: 'grpc-docs', + title: 'gRPC', + component: (definition: string) => ( + + ), +}; From b9aeb42e659670d9712d060cab841ffc4b9abb3c Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 8 Jun 2022 13:01:11 +0200 Subject: [PATCH 042/590] update readme Signed-off-by: Kiss Miklos --- plugins/api-docs-react/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/api-docs-react/README.md b/plugins/api-docs-react/README.md index 3a8e099e11..d030aba222 100644 --- a/plugins/api-docs-react/README.md +++ b/plugins/api-docs-react/README.md @@ -1,5 +1,9 @@ # @backstage/plugin-api-docs-react +This package contains ApiDefinitionWidgets for the following projects: + +- [grpc-docs](https://github.com/gendocu-com/grpc-docs) + ## Setup ``` @@ -8,7 +12,7 @@ yarn add @backstage/plugin-api-docs-react ## Add the GrpcDocsApiWidget to your apis -Add the widget to your `apiDocsConfigRef` in the following way. Make sure the `apiEntity.spec.type` is compared to `grpc-docs` +Add the widget to your `apiDocsConfigRef`. ```ts import { grpcDocsApiWidget } from '@backstage/plugin-api-docs-react'; From 3c1d596425c08b7ecace0347217fe17fcb0b7ef1 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 8 Jun 2022 13:30:57 +0200 Subject: [PATCH 043/590] remove private prop Signed-off-by: Kiss Miklos --- plugins/api-docs-react/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/api-docs-react/package.json b/plugins/api-docs-react/package.json index f6bdf00267..64ff6e9785 100644 --- a/plugins/api-docs-react/package.json +++ b/plugins/api-docs-react/package.json @@ -5,7 +5,6 @@ "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", - "private": true, "publishConfig": { "access": "public", "main": "dist/index.esm.js", From 425dc3ae57afcb090498059f3df046e5a06ec5e7 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 8 Jun 2022 13:44:47 +0200 Subject: [PATCH 044/590] add api-report.md Signed-off-by: Kiss Miklos --- plugins/api-docs-react/api-report.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 plugins/api-docs-react/api-report.md diff --git a/plugins/api-docs-react/api-report.md b/plugins/api-docs-react/api-report.md new file mode 100644 index 0000000000..2f7c6db7c1 --- /dev/null +++ b/plugins/api-docs-react/api-report.md @@ -0,0 +1,16 @@ +## API Report File for "@backstage/plugin-api-docs-react" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +// Warning: (ae-missing-release-tag) "grpcDocsApiWidget" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const grpcDocsApiWidget: { + type: string; + title: string; + component: (definition: string) => JSX.Element; +}; +``` From 3605d0b691d0272827f416e27c64dcb37c5611c6 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Thu, 9 Jun 2022 00:41:48 +0200 Subject: [PATCH 045/590] move type deps to devDeps Signed-off-by: Kiss Miklos --- plugins/api-docs-react/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/api-docs-react/package.json b/plugins/api-docs-react/package.json index 64ff6e9785..dfea494ced 100644 --- a/plugins/api-docs-react/package.json +++ b/plugins/api-docs-react/package.json @@ -34,12 +34,12 @@ "grpc-docs": "^1.1.2" }, "peerDependencies": { - "@types/react": "^16.13.1 || ^17.0.0", "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { "@backstage/cli": "^0.17.2-next.0", - "@testing-library/jest-dom": "^5.16.4" + "@testing-library/jest-dom": "^5.16.4", + "@types/react": "^16.13.1 || ^17.0.0" }, "files": [ "dist" From 3c705f93095cc201fa292273c86008b5085a2edb Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 15 Jun 2022 12:55:18 +0200 Subject: [PATCH 046/590] rename package Signed-off-by: Kiss Miklos --- .changeset/red-games-decide.md | 4 ++-- .../.eslintrc.js | 0 .../README.md | 6 +++--- .../api-report.md | 2 +- .../package.json | 8 ++++---- .../src/index.ts | 0 .../src/setupTests.ts | 0 .../src/widgets.tsx | 0 8 files changed, 10 insertions(+), 10 deletions(-) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/.eslintrc.js (100%) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/README.md (87%) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/api-report.md (85%) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/package.json (78%) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/src/index.ts (100%) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/src/setupTests.ts (100%) rename plugins/{api-docs-react => api-docs-module-protoc-gen-doc}/src/widgets.tsx (100%) diff --git a/.changeset/red-games-decide.md b/.changeset/red-games-decide.md index cbf36de833..ca5ff580b4 100644 --- a/.changeset/red-games-decide.md +++ b/.changeset/red-games-decide.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-api-docs-react': major +'@backstage/plugin-api-docs-module-protoc-gen-doc': major --- -Adds an api widget to render protoc-gen-doc generated descriptors by the grpc-docs package +Added the new `grpcDocsApiWidget` to render `protoc-gen-doc` generated descriptors by the `grpc-docs` package. diff --git a/plugins/api-docs-react/.eslintrc.js b/plugins/api-docs-module-protoc-gen-doc/.eslintrc.js similarity index 100% rename from plugins/api-docs-react/.eslintrc.js rename to plugins/api-docs-module-protoc-gen-doc/.eslintrc.js diff --git a/plugins/api-docs-react/README.md b/plugins/api-docs-module-protoc-gen-doc/README.md similarity index 87% rename from plugins/api-docs-react/README.md rename to plugins/api-docs-module-protoc-gen-doc/README.md index d030aba222..4d90cd74c2 100644 --- a/plugins/api-docs-react/README.md +++ b/plugins/api-docs-module-protoc-gen-doc/README.md @@ -1,4 +1,4 @@ -# @backstage/plugin-api-docs-react +# @backstage/plugin-api-docs-module-protoc-gen-doc This package contains ApiDefinitionWidgets for the following projects: @@ -7,7 +7,7 @@ This package contains ApiDefinitionWidgets for the following projects: ## Setup ``` -yarn add @backstage/plugin-api-docs-react +yarn add @backstage/plugin-api-docs-module-protoc-gen-doc ``` ## Add the GrpcDocsApiWidget to your apis @@ -15,7 +15,7 @@ yarn add @backstage/plugin-api-docs-react Add the widget to your `apiDocsConfigRef`. ```ts -import { grpcDocsApiWidget } from '@backstage/plugin-api-docs-react'; +import { grpcDocsApiWidget } from '@backstage/plugin-api-docs-module-protoc-gen-doc'; // packages/app/apis.ts export const apis: AnyApiFactory[] = [ createApiFactory({ diff --git a/plugins/api-docs-react/api-report.md b/plugins/api-docs-module-protoc-gen-doc/api-report.md similarity index 85% rename from plugins/api-docs-react/api-report.md rename to plugins/api-docs-module-protoc-gen-doc/api-report.md index 2f7c6db7c1..0573573682 100644 --- a/plugins/api-docs-react/api-report.md +++ b/plugins/api-docs-module-protoc-gen-doc/api-report.md @@ -1,4 +1,4 @@ -## API Report File for "@backstage/plugin-api-docs-react" +## API Report File for "@backstage/plugin-api-docs-module-protoc-gen-doc" > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). diff --git a/plugins/api-docs-react/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json similarity index 78% rename from plugins/api-docs-react/package.json rename to plugins/api-docs-module-protoc-gen-doc/package.json index dfea494ced..81e7b7ea45 100644 --- a/plugins/api-docs-react/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -1,6 +1,6 @@ { - "name": "@backstage/plugin-api-docs-react", - "description": "Common functionalities for the api-docs-react plugin", + "name": "@backstage/plugin-api-docs-module-protoc-gen-doc", + "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc", "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", @@ -11,13 +11,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "web-library" + "role": "frontend-plugin-module" }, "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", - "directory": "plugins/api-docs-react" + "directory": "plugins/api-docs-module-protoc-gen-doc" }, "keywords": [ "backstage" diff --git a/plugins/api-docs-react/src/index.ts b/plugins/api-docs-module-protoc-gen-doc/src/index.ts similarity index 100% rename from plugins/api-docs-react/src/index.ts rename to plugins/api-docs-module-protoc-gen-doc/src/index.ts diff --git a/plugins/api-docs-react/src/setupTests.ts b/plugins/api-docs-module-protoc-gen-doc/src/setupTests.ts similarity index 100% rename from plugins/api-docs-react/src/setupTests.ts rename to plugins/api-docs-module-protoc-gen-doc/src/setupTests.ts diff --git a/plugins/api-docs-react/src/widgets.tsx b/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx similarity index 100% rename from plugins/api-docs-react/src/widgets.tsx rename to plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx From 90fb26a514f034d44c7deda2db87805ff6a01e6f Mon Sep 17 00:00:00 2001 From: James Russo Date: Wed, 15 Jun 2022 10:03:37 -0400 Subject: [PATCH 047/590] update additional files Signed-off-by: James Russo --- docs/features/software-catalog/descriptor-format.md | 5 ++++- packages/catalog-model/src/schema/EntityMeta.schema.json | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md index 86c832e3d2..bb79f18738 100644 --- a/docs/features/software-catalog/descriptor-format.md +++ b/docs/features/software-catalog/descriptor-format.md @@ -55,6 +55,7 @@ metadata: - url: https://admin.example-org.com title: Admin Dashboard icon: dashboard + type: admin-dashboard spec: type: website lifecycle: production @@ -83,7 +84,8 @@ This is the same entity as returned in JSON from the software catalog API: { "url": "https://admin.example-org.com", "title": "Admin Dashboard", - "icon": "dashboard" + "icon": "dashboard", + "type": "admin-dashboard" } ], "tags": ["java"], @@ -353,6 +355,7 @@ Fields of a link are: | `url` | String | [Required] A `url` in a standard `uri` format (e.g. `https://example.com/some/page`) | | `title` | String | [Optional] A user friendly display name for the link. | | `icon` | String | [Optional] A key representing a visual icon to be displayed in the UI. | +| `type` | String | [Optional] An optional value to categorize links into specific groups. | _NOTE_: The `icon` field value is meant to be a semantic key that will map to a specific icon that may be provided by an icon library (e.g. `material-ui` diff --git a/packages/catalog-model/src/schema/EntityMeta.schema.json b/packages/catalog-model/src/schema/EntityMeta.schema.json index cfdf9539c2..483e69f672 100644 --- a/packages/catalog-model/src/schema/EntityMeta.schema.json +++ b/packages/catalog-model/src/schema/EntityMeta.schema.json @@ -108,6 +108,12 @@ "description": "A key representing a visual icon to be displayed in the UI.", "examples": ["dashboard"], "minLength": 1 + }, + "type": { + "type": "string", + "description": "An optional value to categorize links into specific groups.", + "examples": ["runbook", "documentation", "logs", "dashboard"], + "minLength": 1 } } } From f4f6d51b31ddaa4bfd9474ca521f8384e6f40e8a Mon Sep 17 00:00:00 2001 From: James Russo Date: Wed, 15 Jun 2022 10:05:36 -0400 Subject: [PATCH 048/590] update api-reports Signed-off-by: James Russo --- packages/catalog-model/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/catalog-model/api-report.md b/packages/catalog-model/api-report.md index fca23d6ab9..8427ef4112 100644 --- a/packages/catalog-model/api-report.md +++ b/packages/catalog-model/api-report.md @@ -159,6 +159,7 @@ export type EntityLink = { url: string; title?: string; icon?: string; + type?: string; }; // @public From 14ce0d9347d9c2d3f28c80a14a67bda99bb8daaa Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Wed, 15 Jun 2022 16:13:01 +0200 Subject: [PATCH 049/590] Pull by default, don't pull on --no-pull Signed-off-by: Eric Peterson --- .changeset/techdocs-the-whole-pulse.md | 5 +++++ packages/techdocs-cli/src/commands/index.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/techdocs-the-whole-pulse.md diff --git a/.changeset/techdocs-the-whole-pulse.md b/.changeset/techdocs-the-whole-pulse.md new file mode 100644 index 0000000000..b54fb080ae --- /dev/null +++ b/.changeset/techdocs-the-whole-pulse.md @@ -0,0 +1,5 @@ +--- +'@techdocs/cli': patch +--- + +Fixed a bug that prevented docker images from being pulled by default when generating TechDocs. diff --git a/packages/techdocs-cli/src/commands/index.ts b/packages/techdocs-cli/src/commands/index.ts index 85a218eb54..68e8f88c0b 100644 --- a/packages/techdocs-cli/src/commands/index.ts +++ b/packages/techdocs-cli/src/commands/index.ts @@ -38,7 +38,7 @@ export function registerCommands(program: Command) { 'The mkdocs docker container to use', defaultDockerImage, ) - .option('--no-pull', 'Do not pull the latest docker image', false) + .option('--no-pull', 'Do not pull the latest docker image') .option( '--no-docker', 'Do not use Docker, use MkDocs executable and plugins in current user environment.', From 5df7a4bdbe65010498dbf15745432e167330e2fd Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Wed, 15 Jun 2022 16:45:35 +0200 Subject: [PATCH 050/590] add release tag to widget Signed-off-by: Kiss Miklos --- plugins/api-docs-module-protoc-gen-doc/api-report.md | 2 -- plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/api-docs-module-protoc-gen-doc/api-report.md b/plugins/api-docs-module-protoc-gen-doc/api-report.md index 0573573682..696fee2a20 100644 --- a/plugins/api-docs-module-protoc-gen-doc/api-report.md +++ b/plugins/api-docs-module-protoc-gen-doc/api-report.md @@ -5,8 +5,6 @@ ```ts /// -// Warning: (ae-missing-release-tag) "grpcDocsApiWidget" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export const grpcDocsApiWidget: { type: string; diff --git a/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx b/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx index cb0dadf787..5f35c8d9b3 100644 --- a/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx +++ b/plugins/api-docs-module-protoc-gen-doc/src/widgets.tsx @@ -17,6 +17,9 @@ import React from 'react'; import { GRPCSelfGeneratedAPIReference } from 'grpc-docs'; +/** + * @public + */ export const grpcDocsApiWidget = { type: 'grpc-docs', title: 'gRPC', From 279fa6b116967c237677a759f9c0323c4ac3ecf7 Mon Sep 17 00:00:00 2001 From: James Russo Date: Wed, 15 Jun 2022 10:46:32 -0400 Subject: [PATCH 051/590] update docs again Signed-off-by: James Russo --- docs/features/software-catalog/descriptor-format.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md index bb79f18738..81e3604ffe 100644 --- a/docs/features/software-catalog/descriptor-format.md +++ b/docs/features/software-catalog/descriptor-format.md @@ -365,6 +365,8 @@ Backstage integrator will ultimately be left to provide the appropriate icon component mappings. A generic fallback icon would be provided if a mapping cannot be resolved. +The semantics of the `type` field are undefined. The adopter is free to define their own set of types and utilize them as they wish. Some potential use cases can be to utilize the type field to validate certain links exist on entities or to create customized UI components for specific link types. + ## Common to All Kinds: Relations The `relations` root field is a read-only list of relations, between the current From 62d3912f1d9ef66fe62c00ed7efc6dc403d74832 Mon Sep 17 00:00:00 2001 From: James Russo Date: Wed, 15 Jun 2022 10:49:09 -0400 Subject: [PATCH 052/590] update to minor Signed-off-by: James Russo --- .changeset/shaggy-melons-drive.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/shaggy-melons-drive.md b/.changeset/shaggy-melons-drive.md index cff45954fe..b5674493f4 100644 --- a/.changeset/shaggy-melons-drive.md +++ b/.changeset/shaggy-melons-drive.md @@ -1,5 +1,5 @@ --- -'@backstage/catalog-model': patch +'@backstage/catalog-model': minor --- Adding an optional type field to entity links to group and categorize links From 8ebc1dea21c221e5395945026d8de46b619aa358 Mon Sep 17 00:00:00 2001 From: Maximilian Ressel Date: Tue, 31 May 2022 16:08:50 +0200 Subject: [PATCH 053/590] Add allowedRepos Option and move Repo Field to own Component Signed-off-by: Maximilian Ressel --- .../fields/RepoUrlPicker/AzureRepoPicker.tsx | 15 +--- .../RepoUrlPicker/BitbucketRepoPicker.tsx | 15 +--- .../fields/RepoUrlPicker/GerritRepoPicker.tsx | 15 +--- .../fields/RepoUrlPicker/GithubRepoPicker.tsx | 15 +--- .../fields/RepoUrlPicker/GitlabRepoPicker.tsx | 18 +---- .../fields/RepoUrlPicker/RepoUrlPicker.tsx | 19 +++++ .../RepoUrlPicker/RepoUrlPickerRepoName.tsx | 77 +++++++++++++++++++ 7 files changed, 103 insertions(+), 71 deletions(-) create mode 100644 plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/AzureRepoPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/AzureRepoPicker.tsx index 0efadf4017..0246c67801 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/AzureRepoPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/AzureRepoPicker.tsx @@ -27,7 +27,7 @@ export const AzureRepoPicker = (props: { rawErrors: string[]; }) => { const { rawErrors, state, onChange } = props; - const { organization, repoName, owner } = state; + const { organization, owner } = state; return ( <> The Owner that this repo will belong to - 0 && !repoName} - > - Repository - onChange({ repoName: e.target.value })} - value={repoName} - /> - The name of the repository - ); }; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx index 64eb4b8dac..fc59398d94 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx @@ -26,7 +26,7 @@ export const BitbucketRepoPicker = (props: { rawErrors: string[]; }) => { const { onChange, rawErrors, state } = props; - const { host, workspace, project, repoName } = state; + const { host, workspace, project } = state; return ( <> {host === 'bitbucket.org' && ( @@ -61,19 +61,6 @@ export const BitbucketRepoPicker = (props: { The Project that this repo will belong to - 0 && !repoName} - > - Repository - onChange({ repoName: e.target.value })} - value={repoName} - /> - The name of the repository - ); }; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/GerritRepoPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/GerritRepoPicker.tsx index 4cbc0859e8..f021948532 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/GerritRepoPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/GerritRepoPicker.tsx @@ -26,7 +26,7 @@ export const GerritRepoPicker = (props: { rawErrors: string[]; }) => { const { onChange, rawErrors, state } = props; - const { workspace, repoName, owner } = state; + const { workspace, owner } = state; return ( <> - 0 && !repoName} - > - Repository - onChange({ repoName: e.target.value })} - value={repoName} - /> - The name of the repository - ); }; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/GithubRepoPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/GithubRepoPicker.tsx index 13b57cb449..ec59d89ef8 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/GithubRepoPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/GithubRepoPicker.tsx @@ -32,7 +32,7 @@ export const GithubRepoPicker = (props: { ? allowedOwners.map(i => ({ label: i, value: i })) : [{ label: 'Loading...', value: 'loading' }]; - const { owner, repoName } = state; + const { owner } = state; return ( <> @@ -66,19 +66,6 @@ export const GithubRepoPicker = (props: { The organization, user or project that this repo will belong to - 0 && !repoName} - > - Repository - onChange({ repoName: e.target.value })} - value={repoName} - /> - The name of the repository - ); }; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx index e2052b792f..c628b364b9 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx @@ -23,16 +23,17 @@ import { RepoUrlPickerState } from './types'; export const GitlabRepoPicker = (props: { allowedOwners?: string[]; + allowedRepos?: string[]; state: RepoUrlPickerState; onChange: (state: RepoUrlPickerState) => void; rawErrors: string[]; }) => { - const { allowedOwners = [], rawErrors, state, onChange } = props; + const { allowedOwners = [], state, onChange, rawErrors } = props; const ownerItems: SelectItem[] = allowedOwners ? allowedOwners.map(i => ({ label: i, value: i })) : [{ label: 'Loading...', value: 'loading' }]; - const { owner, repoName } = state; + const { owner } = state; return ( <> @@ -69,19 +70,6 @@ export const GitlabRepoPicker = (props: { namespaces in gitlab), that this repo will belong to - 0 && !repoName} - > - Repository - onChange({ repoName: e.target.value })} - value={repoName} - /> - The name of the repository - ); }; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx index 6f762933b6..b36b332d9e 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx @@ -26,6 +26,7 @@ import { BitbucketRepoPicker } from './BitbucketRepoPicker'; import { GerritRepoPicker } from './GerritRepoPicker'; import { FieldExtensionComponentProps } from '../../../extensions'; import { RepoUrlPickerHost } from './RepoUrlPickerHost'; +import { RepoUrlPickerRepoName } from './RepoUrlPickerRepoName'; import { parseRepoPickerUrl, serializeRepoPickerUrl } from './utils'; import { RepoUrlPickerState } from './types'; import useDebounce from 'react-use/lib/useDebounce'; @@ -40,6 +41,7 @@ import { useTemplateSecrets } from '../../secrets'; export interface RepoUrlPickerUiOptions { allowedHosts?: string[]; allowedOwners?: string[]; + allowedRepos?: string[]; requestUserCredentials?: { secretsKey: string; additionalScopes?: { @@ -76,6 +78,10 @@ export const RepoUrlPicker = ( () => uiSchema?.['ui:options']?.allowedOwners ?? [], [uiSchema], ); + const allowedRepos = useMemo( + () => uiSchema?.['ui:options']?.allowedRepos ?? [], + [uiSchema], + ); useEffect(() => { onChange(serializeRepoPickerUrl(state)); @@ -87,6 +93,11 @@ export const RepoUrlPicker = ( setState(prevState => ({ ...prevState, owner: allowedOwners[0] })); } }, [setState, allowedOwners]); + useEffect(() => { + if (allowedRepos.length === 1) { + setState(prevState => ({ ...prevState, repoName: allowedRepos[0] })); + } + }, [setState, allowedRepos]); const updateLocalState = useCallback( (newState: RepoUrlPickerState) => { @@ -179,6 +190,14 @@ export const RepoUrlPicker = ( onChange={updateLocalState} /> )} + + setState(prevState => ({ ...prevState, repoName })) + } + rawErrors={rawErrors} + /> ); }; diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx new file mode 100644 index 0000000000..f2d68b08f3 --- /dev/null +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx @@ -0,0 +1,77 @@ +/* + * Copyright 2021 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, { useEffect } from 'react'; +import { Select, SelectItem } from '@backstage/core-components'; +import FormControl from '@material-ui/core/FormControl'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import Input from '@material-ui/core/Input'; +import InputLabel from '@material-ui/core/InputLabel'; + +export const RepoUrlPickerRepoName = (props: { + repoName?: string; + allowedRepos?: string[]; + onChange: (host: string) => void; + rawErrors: string[]; +}) => { + const { repoName, allowedRepos, onChange, rawErrors } = props; + + useEffect(() => { + // If there is no repoName chosen currently + if (!repoName) { + // Set the first of the allowedRepos option if that available + if (allowedRepos?.length) { + onChange(allowedRepos[0]); + } + } + }, [allowedRepos, repoName, onChange]); + + const repoItems: SelectItem[] = allowedRepos + ? allowedRepos.map(i => ({ label: i, value: i })) + : [{ label: 'Loading...', value: 'loading' }]; + + return ( + <> + 0 && !repoName} + > + {allowedRepos?.length ? ( + onChange(String(e.target.value))} + value={repoName} + /> + + )} + The name of the repository + + + ); +}; From d8eb82f4474f04f413896deee1fccf2db20287d9 Mon Sep 17 00:00:00 2001 From: Maixmilian Ressel Date: Wed, 15 Jun 2022 16:46:57 +0200 Subject: [PATCH 054/590] Add changeset Signed-off-by: Maixmilian Ressel --- .changeset/hot-rice-sin.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hot-rice-sin.md diff --git a/.changeset/hot-rice-sin.md b/.changeset/hot-rice-sin.md new file mode 100644 index 0000000000..5a7363bdc8 --- /dev/null +++ b/.changeset/hot-rice-sin.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +RepoUrlPicker: Add allowedRepos option and move repoName field to own component From 7fdb8eb4fc3c07f57bc9403450062969f6cb1be7 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Wed, 25 May 2022 11:30:00 -0700 Subject: [PATCH 055/590] feat(plugins/pagerduty): add constant for service id annotation annotation: 'pagerduty.com/service-id' Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/components/constants.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/pagerduty/src/components/constants.ts b/plugins/pagerduty/src/components/constants.ts index bfe1aea298..01308590f1 100644 --- a/plugins/pagerduty/src/components/constants.ts +++ b/plugins/pagerduty/src/components/constants.ts @@ -14,3 +14,4 @@ * limitations under the License. */ export const PAGERDUTY_INTEGRATION_KEY = 'pagerduty.com/integration-key'; +export const PAGERDUTY_SERVICE_ID = 'pagerduty.com/service-id'; From 0e8fc434923321248bcd4ee09c3c90119f997c04 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Wed, 25 May 2022 15:49:45 -0700 Subject: [PATCH 056/590] feat(plugins/pagerduty): add serviceId to pager duty entity Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/hooks/index.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/plugins/pagerduty/src/hooks/index.ts b/plugins/pagerduty/src/hooks/index.ts index 40a34788f0..a5fa462e02 100644 --- a/plugins/pagerduty/src/hooks/index.ts +++ b/plugins/pagerduty/src/hooks/index.ts @@ -16,13 +16,18 @@ import { useEntity } from '@backstage/plugin-catalog-react'; -import { PAGERDUTY_INTEGRATION_KEY } from '../components/constants'; +import { + PAGERDUTY_INTEGRATION_KEY, + PAGERDUTY_SERVICE_ID, +} from '../components/constants'; export function usePagerdutyEntity() { const { entity } = useEntity(); - const integrationKey = - entity.metadata.annotations?.[PAGERDUTY_INTEGRATION_KEY]; + const { + [PAGERDUTY_INTEGRATION_KEY]: integrationKey, + [PAGERDUTY_SERVICE_ID]: serviceId, + } = entity.metadata.annotations || ({} as Record); const name = entity.metadata.name; - return { integrationKey, name }; + return { integrationKey, serviceId, name }; } From 7959a35cc14d1954ee06fa43806dd4e3b6c5d168 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Wed, 25 May 2022 15:52:34 -0700 Subject: [PATCH 057/590] feat(plugins/pagerduty): check for service id annotation for applicable entities Signed-off-by: Alec Jacobs --- .../components/PagerDutyCard/index.test.tsx | 65 ++++++++++++++++++- .../src/components/PagerDutyCard/index.tsx | 7 +- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index e0a857ccc7..1195d6e7ee 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; import { render, waitFor, fireEvent, act } from '@testing-library/react'; -import { PagerDutyCard } from '../PagerDutyCard'; +import { PagerDutyCard, isPluginApplicableToEntity } from '../PagerDutyCard'; import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-react'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; @@ -35,6 +35,7 @@ const apis = TestApiRegistry.from( [pagerDutyApiRef, mockPagerDutyApi], [alertApiRef, {}], ); + const entity: Entity = { apiVersion: 'backstage.io/v1alpha1', kind: 'Component', @@ -46,6 +47,38 @@ const entity: Entity = { }, }; +const entityWithoutAnnotations: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: {}, + }, +}; + +const entityWithServiceId: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/service-id': 'def456', + }, + }, +}; + +const entityWithAllAnnotations: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/integration-key': 'abc123', + 'pagerduty.com/service-id': 'def456', + }, + }, +}; + const user: User = { name: 'person1', id: 'p1', @@ -55,7 +88,7 @@ const user: User = { }; const service: Service = { - id: 'abc', + id: 'def456', name: 'pagerduty-name', html_url: 'www.example.com', escalation_policy: { @@ -63,9 +96,35 @@ const service: Service = { user: user, html_url: 'http://a.com/id1', }, - integrationKey: 'abcd', + integrationKey: 'abc123', }; +describe('isPluginApplicableToEntity', () => { + describe('when entity has no annotations', () => { + it('returns false', () => { + expect(isPluginApplicableToEntity(entityWithoutAnnotations)).toBe(false); + }); + }); + + describe('when entity has the pagerduty.com/integration-key annotation', () => { + it('returns true', () => { + expect(isPluginApplicableToEntity(entity)).toBe(true); + }); + }); + + describe('when entity has the pagerduty.com/service-id annotation', () => { + it('returns true', () => { + expect(isPluginApplicableToEntity(entityWithServiceId)).toBe(true); + }); + }); + + describe('when entity has all annotations', () => { + it('returns true', () => { + expect(isPluginApplicableToEntity(entityWithAllAnnotations)).toBe(true); + }); + }); +}); + describe('PageDutyCard', () => { it('Render pagerduty', async () => { mockPagerDutyApi.getServiceByIntegrationKey = jest diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index bbade09e51..0938f7288b 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -26,7 +26,7 @@ import { MissingTokenError } from '../Errors/MissingTokenError'; import WebIcon from '@material-ui/icons/Web'; import DateRangeIcon from '@material-ui/icons/DateRange'; import { usePagerdutyEntity } from '../../hooks'; -import { PAGERDUTY_INTEGRATION_KEY } from '../constants'; +import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID } from '../constants'; import { TriggerDialog } from '../TriggerDialog'; import { ChangeEvents } from '../ChangeEvents'; @@ -40,7 +40,10 @@ import { } from '@backstage/core-components'; export const isPluginApplicableToEntity = (entity: Entity) => - Boolean(entity.metadata.annotations?.[PAGERDUTY_INTEGRATION_KEY]); + Boolean( + entity.metadata.annotations?.[PAGERDUTY_INTEGRATION_KEY] || + entity.metadata.annotations?.[PAGERDUTY_SERVICE_ID], + ); export const PagerDutyCard = () => { const { integrationKey } = usePagerdutyEntity(); From e5af087fb5917bd58041557a5e7f1a49cbac1395 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Thu, 26 May 2022 10:19:12 -0700 Subject: [PATCH 058/590] feat(plugins/pagerduty): add getServiceByServiceId to PagerDutyClient * extract common params to helper constant Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 16 +++++++++++++++- plugins/pagerduty/src/api/types.ts | 10 ++++++++++ .../src/components/PagerDutyCard/index.test.tsx | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 43c6165c91..db883e8e35 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -19,6 +19,7 @@ import { PagerDutyApi, TriggerAlarmRequest, ServicesResponse, + ServiceResponse, IncidentsResponse, OnCallsResponse, ClientApiConfig, @@ -38,6 +39,9 @@ export const pagerDutyApiRef = createApiRef({ id: 'plugin.pagerduty.api', }); +const commonGetServiceParams = + 'time_zone=UTC&include[]=integrations&include[]=escalation_policies'; + export class PagerDutyClient implements PagerDutyApi { static fromConfig( configApi: ConfigApi, @@ -56,7 +60,7 @@ export class PagerDutyClient implements PagerDutyApi { constructor(private readonly config: ClientApiConfig) {} async getServiceByIntegrationKey(integrationKey: string): Promise { - const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&query=${integrationKey}`; + const params = `${commonGetServiceParams}&query=${integrationKey}`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/services?${params}`; @@ -65,6 +69,16 @@ export class PagerDutyClient implements PagerDutyApi { return services; } + async getServiceByServiceId(serviceId: string): Promise { + const params = commonGetServiceParams; + const url = `${await this.config.discoveryApi.getBaseUrl( + 'proxy', + )}/pagerduty/services/${serviceId}?${params}`; + const { service } = await this.getByUrl(url); + + return service; + } + async getIncidentsByServiceId(serviceId: string): Promise { const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`; const url = `${await this.config.discoveryApi.getBaseUrl( diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 8acd24f033..e473529980 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -31,6 +31,12 @@ export interface PagerDutyApi { */ getServiceByIntegrationKey(integrationKey: string): Promise; + /** + * Fetches the service for the provided service id. + * + */ + getServiceByServiceId(serviceId: string): Promise; + /** * Fetches a list of incidents a provided service has. * @@ -59,6 +65,10 @@ export type ServicesResponse = { services: Service[]; }; +export type ServiceResponse = { + service: Service; +}; + export type IncidentsResponse = { incidents: Incident[]; }; diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index 1195d6e7ee..e633dde0c8 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -27,6 +27,7 @@ import { ApiProvider } from '@backstage/core-app-api'; const mockPagerDutyApi: Partial = { getServiceByIntegrationKey: async () => [], + getServiceByServiceId: async () => service, getOnCallByPolicyId: async () => [], getIncidentsByServiceId: async () => [], }; From ff30bc3f061007200b0716d8e087da7785cf7343 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Thu, 26 May 2022 14:57:09 -0700 Subject: [PATCH 059/590] fix(plugins/pagerduty): use FetchApi over raw fetch with IdentityApi Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 10 ++++------ plugins/pagerduty/src/api/types.ts | 4 ++-- plugins/pagerduty/src/plugin.ts | 8 ++++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index db883e8e35..78d1c048f2 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -30,7 +30,7 @@ import { createApiRef, DiscoveryApi, ConfigApi, - IdentityApi, + FetchApi, } from '@backstage/core-plugin-api'; export class UnauthorizedError extends Error {} @@ -46,7 +46,7 @@ export class PagerDutyClient implements PagerDutyApi { static fromConfig( configApi: ConfigApi, discoveryApi: DiscoveryApi, - identityApi: IdentityApi, + fetchApi: FetchApi, ) { const eventsBaseUrl: string = configApi.getOptionalString('pagerDuty.eventsBaseUrl') ?? @@ -54,7 +54,7 @@ export class PagerDutyClient implements PagerDutyApi { return new PagerDutyClient({ eventsBaseUrl, discoveryApi, - identityApi, + fetchApi, }); } constructor(private readonly config: ClientApiConfig) {} @@ -144,13 +144,11 @@ export class PagerDutyClient implements PagerDutyApi { } private async getByUrl(url: string): Promise { - const { token: idToken } = await this.config.identityApi.getCredentials(); const options = { method: 'GET', headers: { Accept: 'application/vnd.pagerduty+json;version=2', 'Content-Type': 'application/json', - ...(idToken && { Authorization: `Bearer ${idToken}` }), }, }; const response = await this.request(url, options); @@ -161,7 +159,7 @@ export class PagerDutyClient implements PagerDutyApi { url: string, options: RequestOptions, ): Promise { - const response = await fetch(url, options); + const response = await this.config.fetchApi.fetch(url, options); if (response.status === 401) { throw new UnauthorizedError(); } diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index e473529980..e747fd40fe 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -15,7 +15,7 @@ */ import { Incident, ChangeEvent, OnCall, Service } from '../components/types'; -import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; export type TriggerAlarmRequest = { integrationKey: string; @@ -84,7 +84,7 @@ export type OnCallsResponse = { export type ClientApiConfig = { eventsBaseUrl?: string; discoveryApi: DiscoveryApi; - identityApi: IdentityApi; + fetchApi: FetchApi; }; export type RequestOptions = { diff --git a/plugins/pagerduty/src/plugin.ts b/plugins/pagerduty/src/plugin.ts index 32093015ff..3baa36a50e 100644 --- a/plugins/pagerduty/src/plugin.ts +++ b/plugins/pagerduty/src/plugin.ts @@ -19,9 +19,9 @@ import { createPlugin, createRouteRef, discoveryApiRef, + fetchApiRef, configApiRef, createComponentExtension, - identityApiRef, } from '@backstage/core-plugin-api'; export const rootRouteRef = createRouteRef({ @@ -36,10 +36,10 @@ export const pagerDutyPlugin = createPlugin({ deps: { discoveryApi: discoveryApiRef, configApi: configApiRef, - identityApi: identityApiRef, + fetchApi: fetchApiRef, }, - factory: ({ configApi, discoveryApi, identityApi }) => - PagerDutyClient.fromConfig(configApi, discoveryApi, identityApi), + factory: ({ configApi, discoveryApi, fetchApi }) => + PagerDutyClient.fromConfig(configApi, discoveryApi, fetchApi), }), ], }); From 525641fc02aea84e0772f8bb8e7c149eecfcb483 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Thu, 26 May 2022 14:58:31 -0700 Subject: [PATCH 060/590] feat(plugins/pagerduty): add ServiceNotFoundError empty state Signed-off-by: Alec Jacobs --- .../Errors/ServiceNotFoundError.tsx | 35 +++++++++++++++++++ .../pagerduty/src/components/Errors/index.ts | 1 + 2 files changed, 36 insertions(+) create mode 100644 plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx diff --git a/plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx b/plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx new file mode 100644 index 0000000000..d8b61ef7cd --- /dev/null +++ b/plugins/pagerduty/src/components/Errors/ServiceNotFoundError.tsx @@ -0,0 +1,35 @@ +/* + * 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 React from 'react'; +import { Button } from '@material-ui/core'; +import { EmptyState } from '@backstage/core-components'; + +export const ServiceNotFoundError = () => ( + + Read More + + } + /> +); diff --git a/plugins/pagerduty/src/components/Errors/index.ts b/plugins/pagerduty/src/components/Errors/index.ts index df255749e0..6c35e0bfd1 100644 --- a/plugins/pagerduty/src/components/Errors/index.ts +++ b/plugins/pagerduty/src/components/Errors/index.ts @@ -15,3 +15,4 @@ */ export { MissingTokenError } from './MissingTokenError'; +export { ServiceNotFoundError } from './ServiceNotFoundError'; From 845c7f88523c4f2f2c89e70da7ac14c7a370b2c4 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 10:14:20 -0700 Subject: [PATCH 061/590] feat(plugins/pagerduty): add NotFoundError Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 1 + plugins/pagerduty/src/api/index.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 78d1c048f2..ddf4248934 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -34,6 +34,7 @@ import { } from '@backstage/core-plugin-api'; export class UnauthorizedError extends Error {} +export class NotFoundError extends Error {} export const pagerDutyApiRef = createApiRef({ id: 'plugin.pagerduty.api', diff --git a/plugins/pagerduty/src/api/index.ts b/plugins/pagerduty/src/api/index.ts index 015204b1e8..e23ee0c9a4 100644 --- a/plugins/pagerduty/src/api/index.ts +++ b/plugins/pagerduty/src/api/index.ts @@ -14,5 +14,10 @@ * limitations under the License. */ -export { PagerDutyClient, pagerDutyApiRef, UnauthorizedError } from './client'; +export { + PagerDutyClient, + pagerDutyApiRef, + UnauthorizedError, + NotFoundError, +} from './client'; export type { PagerDutyApi } from './types'; From 3cf02b6e9c968e8cb598a92d058b11a93b97e616 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 10:22:01 -0700 Subject: [PATCH 062/590] feat(plugins/pagerduty): handle 404 error code in Api Client * raise NotFoundError Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index ddf4248934..6c31f2a5d0 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -164,6 +164,11 @@ export class PagerDutyClient implements PagerDutyApi { if (response.status === 401) { throw new UnauthorizedError(); } + + if (response.status === 404) { + throw new NotFoundError(); + } + if (!response.ok) { const payload = await response.json(); const errors = payload.errors.map((error: string) => error).join(' '); From bb4fb80dac1d4c29728a2cc52112181c7f414495 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 10:39:06 -0700 Subject: [PATCH 063/590] feat(plugins/pagerduty): add wrapper BasicCard component * ensures errors and progress bar have consistent styling with the rest of the Overview Page components Signed-off-by: Alec Jacobs --- .../src/components/PagerDutyCard/index.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index 0938f7288b..e5c7eab071 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useState, useCallback } from 'react'; +import React, { ReactNode, useState, useCallback } from 'react'; import { Entity } from '@backstage/catalog-model'; import { Card, CardHeader, Divider, CardContent } from '@material-ui/core'; import { Incidents } from '../Incident'; @@ -37,8 +37,13 @@ import { IconLinkVerticalProps, TabbedCard, CardTab, + InfoCard, } from '@backstage/core-components'; +const BasicCard = ({ children }: { children: ReactNode }) => ( + {children} +); + export const isPluginApplicableToEntity = (entity: Entity) => Boolean( entity.metadata.annotations?.[PAGERDUTY_INTEGRATION_KEY] || @@ -96,7 +101,11 @@ export const PagerDutyCard = () => { } if (loading) { - return ; + return ( + + + + ); } const serviceLink: IconLinkVerticalProps = { From 02c2978b79d8f09873fa4bfb3b806080edf772dc Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 10:43:28 -0700 Subject: [PATCH 064/590] feat(plugins/pagerduty): handle empty response when querying services * raise NotFoundError in async hook * show ServiceNotFoundError empty state when async hook errors Signed-off-by: Alec Jacobs --- .../components/PagerDutyCard/index.test.tsx | 44 +++++++++++++++++- .../src/components/PagerDutyCard/index.tsx | 46 ++++++++++++------- 2 files changed, 73 insertions(+), 17 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index e633dde0c8..2b309533ed 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -19,7 +19,12 @@ import { PagerDutyCard, isPluginApplicableToEntity } from '../PagerDutyCard'; import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-react'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; -import { pagerDutyApiRef, UnauthorizedError, PagerDutyClient } from '../../api'; +import { + pagerDutyApiRef, + UnauthorizedError, + NotFoundError, + PagerDutyClient, +} from '../../api'; import { Service, User } from '../types'; import { alertApiRef } from '@backstage/core-plugin-api'; @@ -166,6 +171,24 @@ describe('PageDutyCard', () => { expect(getByText('Missing or invalid PagerDuty Token')).toBeInTheDocument(); }); + it('Handles custom NotFoundError', async () => { + mockPagerDutyApi.getServiceByIntegrationKey = jest + .fn() + .mockRejectedValueOnce(new NotFoundError()); + + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect(getByText('PagerDuty Service Not Found')).toBeInTheDocument(); + }); + it('handles general error', async () => { mockPagerDutyApi.getServiceByIntegrationKey = jest .fn() @@ -187,6 +210,25 @@ describe('PageDutyCard', () => { ), ).toBeInTheDocument(); }); + + it('handles empty response from getServiceByIntegrationKey', async () => { + mockPagerDutyApi.getServiceByIntegrationKey = jest + .fn() + .mockImplementationOnce(async () => []); + + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect(getByText('PagerDuty Service Not Found')).toBeInTheDocument(); + }); + it('opens the dialog when trigger button is clicked', async () => { mockPagerDutyApi.getServiceByIntegrationKey = jest .fn() diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index e5c7eab071..b4b20fb25b 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -20,15 +20,16 @@ import { Incidents } from '../Incident'; import { EscalationPolicy } from '../Escalation'; import useAsync from 'react-use/lib/useAsync'; import { Alert } from '@material-ui/lab'; -import { pagerDutyApiRef, UnauthorizedError } from '../../api'; +import { pagerDutyApiRef, UnauthorizedError, NotFoundError } from '../../api'; import AlarmAddIcon from '@material-ui/icons/AlarmAdd'; -import { MissingTokenError } from '../Errors/MissingTokenError'; +import { MissingTokenError, ServiceNotFoundError } from '../Errors'; import WebIcon from '@material-ui/icons/Web'; import DateRangeIcon from '@material-ui/icons/DateRange'; import { usePagerdutyEntity } from '../../hooks'; import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID } from '../constants'; import { TriggerDialog } from '../TriggerDialog'; import { ChangeEvents } from '../ChangeEvents'; +import { Service } from '../types'; import { useApi } from '@backstage/core-plugin-api'; import { @@ -75,29 +76,42 @@ export const PagerDutyCard = () => { loading, error, } = useAsync(async () => { + let service: Service; const services = await api.getServiceByIntegrationKey( integrationKey as string, ); + service = services[0]; + if (!service) throw new NotFoundError(); + return { - id: services[0].id, - name: services[0].name, - url: services[0].html_url, - policyId: services[0].escalation_policy.id, - policyLink: services[0].escalation_policy.html_url, + id: service.id, + name: service.name, + url: service.html_url, + policyId: service.escalation_policy.id, + policyLink: service.escalation_policy.html_url, }; }); - if (error instanceof UnauthorizedError) { - return ; - } - if (error) { - return ( - - Error encountered while fetching information. {error.message} - - ); + let errorNode: ReactNode; + + switch (error.constructor) { + case UnauthorizedError: + errorNode = ; + break; + case NotFoundError: + errorNode = ; + break; + default: + errorNode = ( + + Error encountered while fetching information. {error.message} + + ); + } + + return {errorNode}; } if (loading) { From 707191bf6f10a5a8e4dcfe3d0c77adf7d12e70b3 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 11:03:06 -0700 Subject: [PATCH 065/590] feat(plugins/pagerduty): lookup by service-id if that is available * prefer integration-key value over service-id * disable creation of incidents if integration-key is not available Signed-off-by: Alec Jacobs --- .../components/PagerDutyCard/index.test.tsx | 130 ++++++++++++++++++ .../src/components/PagerDutyCard/index.tsx | 40 ++++-- 2 files changed, 158 insertions(+), 12 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index 2b309533ed..54b58489be 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -252,4 +252,134 @@ describe('PageDutyCard', () => { }); expect(getByRole('dialog')).toBeInTheDocument(); }); + + describe('when entity has the pagerduty.com/service-id annotation', () => { + it('Renders PagerDuty service information', async () => { + mockPagerDutyApi.getServiceByServiceId = jest + .fn() + .mockImplementationOnce(async () => service); + + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect(getByText('Service Directory')).toBeInTheDocument(); + expect(getByText('Create Incident')).toBeInTheDocument(); + expect(getByText('Nice! No incidents found!')).toBeInTheDocument(); + expect(getByText('Empty escalation policy')).toBeInTheDocument(); + }); + + it('Handles custom error for missing token', async () => { + mockPagerDutyApi.getServiceByServiceId = jest + .fn() + .mockRejectedValueOnce(new UnauthorizedError()); + + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect( + getByText('Missing or invalid PagerDuty Token'), + ).toBeInTheDocument(); + }); + + it('Handles custom NotFoundError', async () => { + mockPagerDutyApi.getServiceByServiceId = jest + .fn() + .mockRejectedValueOnce(new NotFoundError()); + + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect(getByText('PagerDuty Service Not Found')).toBeInTheDocument(); + }); + + it('handles general error', async () => { + mockPagerDutyApi.getServiceByServiceId = jest + .fn() + .mockRejectedValueOnce(new Error('An error occurred')); + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + + expect( + getByText( + 'Error encountered while fetching information. An error occurred', + ), + ).toBeInTheDocument(); + }); + + it('disables the Create Incident button', async () => { + mockPagerDutyApi.getServiceByServiceId = jest + .fn() + .mockImplementationOnce(async () => service); + + const { queryByTestId, getByTitle } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect(queryByTestId('trigger-dialoger')).not.toBeInTheDocument(); + expect( + getByTitle('Must provide an integration-key to create incidents') + .className, + ).toMatch('disabled'); + }); + }); + + describe('when entity has all annotations', () => { + it('queries by integration key', async () => { + mockPagerDutyApi.getServiceByIntegrationKey = jest + .fn() + .mockImplementationOnce(async () => [service]); + mockPagerDutyApi.getServiceByServiceId = jest.fn(); + + const { getByText, queryByTestId } = render( + wrapInTestApp( + + + + + , + ), + ); + await waitFor(() => !queryByTestId('progress')); + expect(mockPagerDutyApi.getServiceByServiceId).not.toHaveBeenCalled(); + expect(getByText('Service Directory')).toBeInTheDocument(); + expect(getByText('Create Incident')).toBeInTheDocument(); + expect(getByText('Nice! No incidents found!')).toBeInTheDocument(); + expect(getByText('Empty escalation policy')).toBeInTheDocument(); + }); + }); }); diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index b4b20fb25b..308d17a08d 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -52,7 +52,7 @@ export const isPluginApplicableToEntity = (entity: Entity) => ); export const PagerDutyCard = () => { - const { integrationKey } = usePagerdutyEntity(); + const { integrationKey, serviceId } = usePagerdutyEntity(); const api = useApi(pagerDutyApiRef); const [refreshIncidents, setRefreshIncidents] = useState(false); const [refreshChangeEvents, setRefreshChangeEvents] = @@ -77,12 +77,16 @@ export const PagerDutyCard = () => { error, } = useAsync(async () => { let service: Service; - const services = await api.getServiceByIntegrationKey( - integrationKey as string, - ); - service = services[0]; - if (!service) throw new NotFoundError(); + if (integrationKey) { + const services = await api.getServiceByIntegrationKey( + integrationKey as string, + ); + service = services[0]; + if (!service) throw new NotFoundError(); + } else { + service = await api.getServiceByServiceId(serviceId); + } return { id: service.id, @@ -128,11 +132,21 @@ export const PagerDutyCard = () => { icon: , }; + /** + * In order to create incidents using the REST API, a valid user email address must be present. + * There is no guarantee the current user entity has a valid email association, so instead just + * only allow triggering incidents when an integration key is present. + */ + const createIncidentDisabled = !integrationKey; const triggerLink: IconLinkVerticalProps = { label: 'Create Incident', onClick: showDialog, icon: , color: 'secondary', + disabled: createIncidentDisabled, + title: createIncidentDisabled + ? 'Must provide an integration-key to create incidents' + : '', }; const escalationPolicyLink: IconLinkVerticalProps = { @@ -171,12 +185,14 @@ export const PagerDutyCard = () => { - + {!createIncidentDisabled && ( + + )} ); }; From 8901c1d28540f6c2b0e0d648f05da17f06d059a8 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 11:38:38 -0700 Subject: [PATCH 066/590] docs(plugins/pagerduty): regenerate api-report Signed-off-by: Alec Jacobs --- plugins/pagerduty/api-report.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/pagerduty/api-report.md b/plugins/pagerduty/api-report.md index 86b917c6eb..c708a1ca4e 100644 --- a/plugins/pagerduty/api-report.md +++ b/plugins/pagerduty/api-report.md @@ -10,7 +10,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { ConfigApi } from '@backstage/core-plugin-api'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; -import { IdentityApi } from '@backstage/core-plugin-api'; +import { FetchApi } from '@backstage/core-plugin-api'; import { ReactNode } from 'react'; // Warning: (ae-missing-release-tag) "EntityPagerDutyCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -46,7 +46,7 @@ export class PagerDutyClient implements PagerDutyApi { static fromConfig( configApi: ConfigApi, discoveryApi: DiscoveryApi, - identityApi: IdentityApi, + fetchApi: FetchApi, ): PagerDutyClient; // Warning: (ae-forgotten-export) The symbol "ChangeEvent" needs to be exported by the entry point index.d.ts // @@ -64,6 +64,8 @@ export class PagerDutyClient implements PagerDutyApi { // // (undocumented) getServiceByIntegrationKey(integrationKey: string): Promise; + // (undocumented) + getServiceByServiceId(serviceId: string): Promise; // Warning: (ae-forgotten-export) The symbol "TriggerAlarmRequest" needs to be exported by the entry point index.d.ts // // (undocumented) From 946c11ad03c21363de665e2c2ad0eb895197dcf6 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 12:06:32 -0700 Subject: [PATCH 067/590] docs(plugins/pagerduty): update README for new annotation support Signed-off-by: Alec Jacobs --- plugins/pagerduty/README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/plugins/pagerduty/README.md b/plugins/pagerduty/README.md index 71050dc54b..7b3124ab0f 100644 --- a/plugins/pagerduty/README.md +++ b/plugins/pagerduty/README.md @@ -7,6 +7,7 @@ - The Backstage PagerDuty plugin allows PagerDuty information about a Backstage entity to be displayed within Backstage. This includes active incidents, recent change events, as well as the current on-call responders' names, email addresses, and links to their profiles in PagerDuty. - Incidents can be manually triggered via the plugin with a user-provided description, which will in turn notify the current on-call responders. + - _Note: This feature is only available when providing the `pagerduty.com/integration-key` annotation_ - Change events will be displayed in a separate tab. If the change event payload has additional links the first link only will be rendered. # Requirements @@ -117,6 +118,26 @@ This will proxy the request by adding an `Authorization` header with the provide ### Optional configuration +#### Annotating with Service ID + +If you want to integrate a PagerDuty service with Backstage but don't want to use an integration key, you can also [annotate](https://backstage.io/docs/features/software-catalog/descriptor-format#annotations-optional) the appropriate entity with a PagerDuty Service ID instead + +```yaml +annotations: + pagerduty.com/service-id: [SERVICE_ID] +``` + +This service ID can be found by navigating to a Service within PagerDuty and pulling the ID value out of the URL. + +1. From the **Configuration** menu within PagerDuty, select **Services**. +2. Click the **name** of the service you want to represent for your Entity. + +Your browser URL should now be located at `https://pagerduty.com/service-directory/[SERVICE_ID]`. + +_Note: When annotating with `pagerduty.com/service-id`, the feature to Create Incidents is not currently supported_ + +#### Custom Events URL + If you want to override the default URL used for events, you can add it to `app-config.yaml`: ```yaml From 8798f8d93f6328834573d5d321215f833e5ac82c Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 27 May 2022 11:49:06 -0700 Subject: [PATCH 068/590] chore: generate changeset Signed-off-by: Alec Jacobs --- .changeset/weak-bananas-deliver.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .changeset/weak-bananas-deliver.md diff --git a/.changeset/weak-bananas-deliver.md b/.changeset/weak-bananas-deliver.md new file mode 100644 index 0000000000..db76f396a8 --- /dev/null +++ b/.changeset/weak-bananas-deliver.md @@ -0,0 +1,16 @@ +--- +'@backstage/plugin-pagerduty': minor +--- + +Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. +_Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ + +**BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object as a third argument. +The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests. + +In addition, various enhancements/bug fixes were introduced: + +- The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage +- If no service can be found for the provided integration key, a new Error Message Empty State component will be shown instead of an error alert +- Introduces the `fetchApi` to replace standard `window.fetch` + - ensures that Identity Authorization is respected and provided in API requests From f13bf8b510cb94f3922f1157efd5fb57186b853c Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 30 May 2022 07:31:01 -0700 Subject: [PATCH 069/590] feat(plugins/pagerduty): add @backstage/errors package Signed-off-by: Alec Jacobs --- plugins/pagerduty/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 73a92ed5f7..6d11ee8d69 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -37,6 +37,7 @@ "@backstage/catalog-model": "^1.0.3", "@backstage/core-components": "^0.9.5", "@backstage/core-plugin-api": "^1.0.3", + "@backstage/errors": "^1.0.0", "@backstage/plugin-catalog-react": "^1.1.1", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", From aba92d8f6aa7e07eabd185024c0766a5f72f5726 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 30 May 2022 07:26:42 -0700 Subject: [PATCH 070/590] fix(plugins/pagerduty): use NotFoundError from @backstage/errors Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 2 +- plugins/pagerduty/src/api/index.ts | 7 +------ .../pagerduty/src/components/PagerDutyCard/index.test.tsx | 2 +- plugins/pagerduty/src/components/PagerDutyCard/index.tsx | 3 ++- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 6c31f2a5d0..8ab0bcdc31 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -32,9 +32,9 @@ import { ConfigApi, FetchApi, } from '@backstage/core-plugin-api'; +import { NotFoundError } from '@backstage/errors'; export class UnauthorizedError extends Error {} -export class NotFoundError extends Error {} export const pagerDutyApiRef = createApiRef({ id: 'plugin.pagerduty.api', diff --git a/plugins/pagerduty/src/api/index.ts b/plugins/pagerduty/src/api/index.ts index e23ee0c9a4..015204b1e8 100644 --- a/plugins/pagerduty/src/api/index.ts +++ b/plugins/pagerduty/src/api/index.ts @@ -14,10 +14,5 @@ * limitations under the License. */ -export { - PagerDutyClient, - pagerDutyApiRef, - UnauthorizedError, - NotFoundError, -} from './client'; +export { PagerDutyClient, pagerDutyApiRef, UnauthorizedError } from './client'; export type { PagerDutyApi } from './types'; diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index 54b58489be..041f76fb8c 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -18,11 +18,11 @@ import { render, waitFor, fireEvent, act } from '@testing-library/react'; import { PagerDutyCard, isPluginApplicableToEntity } from '../PagerDutyCard'; import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-react'; +import { NotFoundError } from '@backstage/errors'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; import { pagerDutyApiRef, UnauthorizedError, - NotFoundError, PagerDutyClient, } from '../../api'; import { Service, User } from '../types'; diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index 308d17a08d..48a7f69e3c 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -20,7 +20,7 @@ import { Incidents } from '../Incident'; import { EscalationPolicy } from '../Escalation'; import useAsync from 'react-use/lib/useAsync'; import { Alert } from '@material-ui/lab'; -import { pagerDutyApiRef, UnauthorizedError, NotFoundError } from '../../api'; +import { pagerDutyApiRef, UnauthorizedError } from '../../api'; import AlarmAddIcon from '@material-ui/icons/AlarmAdd'; import { MissingTokenError, ServiceNotFoundError } from '../Errors'; import WebIcon from '@material-ui/icons/Web'; @@ -32,6 +32,7 @@ import { ChangeEvents } from '../ChangeEvents'; import { Service } from '../types'; import { useApi } from '@backstage/core-plugin-api'; +import { NotFoundError } from '@backstage/errors'; import { Progress, HeaderIconLinkRow, From d8abae2ce6a2f1d10b56728da68edc4ce0c9202d Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 30 May 2022 07:21:52 -0700 Subject: [PATCH 071/590] chore(plugins/pagerduty): dont shadow outer variable Signed-off-by: Alec Jacobs --- .../src/components/PagerDutyCard/index.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index 48a7f69e3c..2edc8cbd44 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -77,24 +77,24 @@ export const PagerDutyCard = () => { loading, error, } = useAsync(async () => { - let service: Service; + let foundService: Service; if (integrationKey) { const services = await api.getServiceByIntegrationKey( integrationKey as string, ); - service = services[0]; - if (!service) throw new NotFoundError(); + foundService = services[0]; + if (!foundService) throw new NotFoundError(); } else { - service = await api.getServiceByServiceId(serviceId); + foundService = await api.getServiceByServiceId(serviceId); } return { - id: service.id, - name: service.name, - url: service.html_url, - policyId: service.escalation_policy.id, - policyLink: service.escalation_policy.html_url, + id: foundService.id, + name: foundService.name, + url: foundService.html_url, + policyId: foundService.escalation_policy.id, + policyLink: foundService.escalation_policy.html_url, }; }); From 56926b6f1e365209f5079086820754222b88c82b Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 30 May 2022 07:28:51 -0700 Subject: [PATCH 072/590] chore(plugins/pagerduty): move mockPagerDutyApi to not reference const before it is defined Signed-off-by: Alec Jacobs --- .../components/PagerDutyCard/index.test.tsx | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index 041f76fb8c..fbb19c9897 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -20,28 +20,12 @@ import { Entity } from '@backstage/catalog-model'; import { EntityProvider } from '@backstage/plugin-catalog-react'; import { NotFoundError } from '@backstage/errors'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; -import { - pagerDutyApiRef, - UnauthorizedError, - PagerDutyClient, -} from '../../api'; +import { pagerDutyApiRef, UnauthorizedError, PagerDutyClient } from '../../api'; import { Service, User } from '../types'; import { alertApiRef } from '@backstage/core-plugin-api'; import { ApiProvider } from '@backstage/core-app-api'; -const mockPagerDutyApi: Partial = { - getServiceByIntegrationKey: async () => [], - getServiceByServiceId: async () => service, - getOnCallByPolicyId: async () => [], - getIncidentsByServiceId: async () => [], -}; - -const apis = TestApiRegistry.from( - [pagerDutyApiRef, mockPagerDutyApi], - [alertApiRef, {}], -); - const entity: Entity = { apiVersion: 'backstage.io/v1alpha1', kind: 'Component', @@ -105,6 +89,18 @@ const service: Service = { integrationKey: 'abc123', }; +const mockPagerDutyApi: Partial = { + getServiceByIntegrationKey: async () => [], + getServiceByServiceId: async () => service, + getOnCallByPolicyId: async () => [], + getIncidentsByServiceId: async () => [], +}; + +const apis = TestApiRegistry.from( + [pagerDutyApiRef, mockPagerDutyApi], + [alertApiRef, {}], +); + describe('isPluginApplicableToEntity', () => { describe('when entity has no annotations', () => { it('returns false', () => { From 67bfd75de1396cddce6d3e8a7be6787c111c6847 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 09:46:39 -0700 Subject: [PATCH 073/590] feat(plugins/pagerduty): add ClientApiDependencies type * have ClientApiConfig join ClientApiDependencies with custom configuration Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/types.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index e747fd40fe..4f80d39816 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -81,12 +81,15 @@ export type OnCallsResponse = { oncalls: OnCall[]; }; -export type ClientApiConfig = { - eventsBaseUrl?: string; +export type ClientApiDependencies = { discoveryApi: DiscoveryApi; fetchApi: FetchApi; }; +export type ClientApiConfig = ClientApiDependencies & { + eventsBaseUrl?: string; +}; + export type RequestOptions = { method: string; headers: HeadersInit; From 89f596bb4a671659492e6c796c60292badd23709 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 09:50:33 -0700 Subject: [PATCH 074/590] feat(plugins/pagerduty): refactor PagerDutyClient.fromConfig to accept second argument of ClientApiDependencies Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 12 ++++-------- plugins/pagerduty/src/plugin.ts | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 8ab0bcdc31..9bfd6a5594 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -22,16 +22,12 @@ import { ServiceResponse, IncidentsResponse, OnCallsResponse, + ClientApiDependencies, ClientApiConfig, RequestOptions, ChangeEventsResponse, } from './types'; -import { - createApiRef, - DiscoveryApi, - ConfigApi, - FetchApi, -} from '@backstage/core-plugin-api'; +import { createApiRef, ConfigApi } from '@backstage/core-plugin-api'; import { NotFoundError } from '@backstage/errors'; export class UnauthorizedError extends Error {} @@ -46,12 +42,12 @@ const commonGetServiceParams = export class PagerDutyClient implements PagerDutyApi { static fromConfig( configApi: ConfigApi, - discoveryApi: DiscoveryApi, - fetchApi: FetchApi, + { discoveryApi, fetchApi }: ClientApiDependencies, ) { const eventsBaseUrl: string = configApi.getOptionalString('pagerDuty.eventsBaseUrl') ?? 'https://events.pagerduty.com/v2'; + return new PagerDutyClient({ eventsBaseUrl, discoveryApi, diff --git a/plugins/pagerduty/src/plugin.ts b/plugins/pagerduty/src/plugin.ts index 3baa36a50e..d49de29416 100644 --- a/plugins/pagerduty/src/plugin.ts +++ b/plugins/pagerduty/src/plugin.ts @@ -39,7 +39,7 @@ export const pagerDutyPlugin = createPlugin({ fetchApi: fetchApiRef, }, factory: ({ configApi, discoveryApi, fetchApi }) => - PagerDutyClient.fromConfig(configApi, discoveryApi, fetchApi), + PagerDutyClient.fromConfig(configApi, { discoveryApi, fetchApi }), }), ], }); From 1b0ab057575e9e3b08742464798ffa919cb382b1 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 10:46:59 -0700 Subject: [PATCH 075/590] feat(plugins/pagerduty): add PagerDutyEntity type Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/types.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 plugins/pagerduty/src/types.ts diff --git a/plugins/pagerduty/src/types.ts b/plugins/pagerduty/src/types.ts new file mode 100644 index 0000000000..07f7f2bbe3 --- /dev/null +++ b/plugins/pagerduty/src/types.ts @@ -0,0 +1,21 @@ +/* + * 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 type PagerDutyEntity = { + integrationKey?: string; + serviceId?: string; + name: string; +}; From 05da90db84104fd67541f644407d5d41974b05bd Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 10:56:29 -0700 Subject: [PATCH 076/590] feat(plugins/pagerduty): enforce PagerDutyEntity type from usePagerdutyEntity Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/components/PagerDutyCard/index.tsx | 2 +- plugins/pagerduty/src/hooks/index.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index 2edc8cbd44..e089cf817c 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -86,7 +86,7 @@ export const PagerDutyCard = () => { foundService = services[0]; if (!foundService) throw new NotFoundError(); } else { - foundService = await api.getServiceByServiceId(serviceId); + foundService = await api.getServiceByServiceId(serviceId!); } return { diff --git a/plugins/pagerduty/src/hooks/index.ts b/plugins/pagerduty/src/hooks/index.ts index a5fa462e02..503597a69e 100644 --- a/plugins/pagerduty/src/hooks/index.ts +++ b/plugins/pagerduty/src/hooks/index.ts @@ -15,13 +15,14 @@ */ import { useEntity } from '@backstage/plugin-catalog-react'; +import { PagerDutyEntity } from '../types'; import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID, } from '../components/constants'; -export function usePagerdutyEntity() { +export function usePagerdutyEntity(): PagerDutyEntity { const { entity } = useEntity(); const { [PAGERDUTY_INTEGRATION_KEY]: integrationKey, From 4d755224cc572b7440a0c3f29f5102e41b7e8293 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 14:30:22 -0700 Subject: [PATCH 077/590] feat(plugins/pagerduty): add getServiceByEntity client function Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.test.ts | 359 +++++++++++++++++++++++ plugins/pagerduty/src/api/client.ts | 32 ++ plugins/pagerduty/src/api/types.ts | 9 + 3 files changed, 400 insertions(+) create mode 100644 plugins/pagerduty/src/api/client.test.ts diff --git a/plugins/pagerduty/src/api/client.test.ts b/plugins/pagerduty/src/api/client.test.ts new file mode 100644 index 0000000000..d3e9b58542 --- /dev/null +++ b/plugins/pagerduty/src/api/client.test.ts @@ -0,0 +1,359 @@ +/* + * 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 { MockFetchApi } from '@backstage/test-utils'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; +import { PagerDutyClient, UnauthorizedError } from './client'; +import { PagerDutyEntity } from '../types'; +import { Service, User } from '../components/types'; +import { NotFoundError } from '@backstage/errors'; + +const mockFetch = jest.fn().mockName('fetch'); +const mockDiscoveryApi: jest.Mocked = { + getBaseUrl: jest + .fn() + .mockName('discoveryApi') + .mockResolvedValue('http://localhost:7007/proxy'), +}; +const mockFetchApi: MockFetchApi = new MockFetchApi({ + baseImplementation: mockFetch, +}); + +let client: PagerDutyClient; +let pagerDutyEntity: PagerDutyEntity; + +const user: User = { + name: 'person1', + id: 'p1', + summary: 'person1', + email: 'person1@example.com', + html_url: 'http://a.com/id1', +}; + +const service: Service = { + id: 'def456', + name: 'pagerduty-name', + html_url: 'www.example.com', + escalation_policy: { + id: 'def', + user: user, + html_url: 'http://a.com/id1', + }, + integrationKey: 'abc123', +}; + +const requestHeaders = { + headers: { + Accept: 'application/vnd.pagerduty+json;version=2', + 'Content-Type': 'application/json', + }, + method: 'GET', +}; + +describe('PagerDutyClient', () => { + beforeEach(() => { + mockFetch.mockReset(); + + client = new PagerDutyClient({ + eventsBaseUrl: 'https://events.pagerduty.com/v2', + discoveryApi: mockDiscoveryApi, + fetchApi: mockFetchApi, + }); + }); + + describe('getServiceByEntity', () => { + describe('when provided entity has an integrationKey value', () => { + beforeEach(() => { + pagerDutyEntity = { + name: 'pagerduty-test', + integrationKey: 'abc123', + }; + }); + + it('queries proxy path by integration id', async () => { + mockFetch.mockResolvedValueOnce({ + status: 200, + ok: true, + json: () => Promise.resolve({ services: [service] }), + }); + + expect(await client.getServiceByEntity(pagerDutyEntity)).toEqual({ + service, + }); + expect(mockFetch).toHaveBeenCalledWith( + 'http://localhost:7007/proxy/pagerduty/services?time_zone=UTC&include[]=integrations&include[]=escalation_policies&query=abc123', + requestHeaders, + ); + }); + + describe('on 401 response code', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 401, + ok: false, + json: () => Promise.resolve({}), + }); + }); + + it('throws UnauthorizedError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(UnauthorizedError); + }); + }); + + describe('on 404 response code', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 404, + ok: false, + json: () => Promise.resolve({}), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(NotFoundError); + }); + }); + + describe('on other non-ok response', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 500, + ok: false, + json: () => + Promise.resolve({ + errors: ['Not valid request', 'internal error occurred'], + }), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError( + 'Request failed with 500, Not valid request internal error occurred', + ); + }); + }); + + describe('when services response is empty', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 200, + ok: true, + json: () => Promise.resolve({ services: [] }), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(NotFoundError); + }); + }); + }); + + describe('when provided entity has a serviceId value', () => { + beforeEach(() => { + pagerDutyEntity = { + name: 'pagerduty-test', + serviceId: 'def456', + }; + }); + + it('queries proxy path by integration id', async () => { + mockFetch.mockResolvedValueOnce({ + status: 200, + ok: true, + json: () => Promise.resolve({ service }), + }); + + expect(await client.getServiceByEntity(pagerDutyEntity)).toEqual({ + service, + }); + expect(mockFetch).toHaveBeenCalledWith( + 'http://localhost:7007/proxy/pagerduty/services/def456?time_zone=UTC&include[]=integrations&include[]=escalation_policies', + requestHeaders, + ); + }); + + describe('on 401 response code', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 401, + ok: false, + json: () => Promise.resolve({}), + }); + }); + + it('throws UnauthorizedError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(UnauthorizedError); + }); + }); + + describe('on 404 response code', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 404, + ok: false, + json: () => Promise.resolve({}), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(NotFoundError); + }); + }); + + describe('on other non-ok response', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 500, + ok: false, + json: () => + Promise.resolve({ + errors: ['Not valid request', 'internal error occurred'], + }), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError( + 'Request failed with 500, Not valid request internal error occurred', + ); + }); + }); + }); + + describe('when provided entity has both integrationKey and serviceId', () => { + beforeEach(() => { + pagerDutyEntity = { + name: 'pagerduty-test', + integrationKey: 'abc123', + serviceId: 'def456', + }; + }); + + it('queries proxy path by integration id', async () => { + mockFetch.mockResolvedValueOnce({ + status: 200, + ok: true, + json: () => Promise.resolve({ services: [service] }), + }); + + expect(await client.getServiceByEntity(pagerDutyEntity)).toEqual({ + service, + }); + expect(mockFetch).toHaveBeenCalledWith( + 'http://localhost:7007/proxy/pagerduty/services?time_zone=UTC&include[]=integrations&include[]=escalation_policies&query=abc123', + requestHeaders, + ); + }); + + describe('on 401 response code', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 401, + ok: false, + json: () => Promise.resolve({}), + }); + }); + + it('throws UnauthorizedError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(UnauthorizedError); + }); + }); + + describe('on 404 response code', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 404, + ok: false, + json: () => Promise.resolve({}), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(NotFoundError); + }); + }); + + describe('on other non-ok response', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 500, + ok: false, + json: () => + Promise.resolve({ + errors: ['Not valid request', 'internal error occurred'], + }), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError( + 'Request failed with 500, Not valid request internal error occurred', + ); + }); + }); + + describe('when services response is empty', () => { + beforeEach(() => { + mockFetch.mockResolvedValueOnce({ + status: 200, + ok: true, + json: () => Promise.resolve({ services: [] }), + }); + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(NotFoundError); + }); + }); + }); + + describe('when provided entity has no integrationKey or serviceId values', () => { + beforeEach(() => { + pagerDutyEntity = { + name: 'pagerduty-test', + }; + }); + + it('throws NotFoundError', async () => { + await expect( + client.getServiceByEntity(pagerDutyEntity), + ).rejects.toThrowError(NotFoundError); + expect(mockFetch).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 9bfd6a5594..e6f4eb4aef 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -29,6 +29,7 @@ import { } from './types'; import { createApiRef, ConfigApi } from '@backstage/core-plugin-api'; import { NotFoundError } from '@backstage/errors'; +import { PagerDutyEntity } from '../types'; export class UnauthorizedError extends Error {} @@ -76,6 +77,37 @@ export class PagerDutyClient implements PagerDutyApi { return service; } + async getServiceByEntity( + pagerDutyEntity: PagerDutyEntity, + ): Promise { + const { integrationKey, serviceId } = pagerDutyEntity; + + let response: ServiceResponse; + let url: string; + + if (integrationKey) { + url = `${await this.config.discoveryApi.getBaseUrl( + 'proxy', + )}/pagerduty/services?${commonGetServiceParams}&query=${integrationKey}`; + const { services } = await this.getByUrl(url); + const service = services[0]; + + if (!service) throw new NotFoundError(); + + response = { service }; + } else if (serviceId) { + url = `${await this.config.discoveryApi.getBaseUrl( + 'proxy', + )}/pagerduty/services/${serviceId}?${commonGetServiceParams}`; + + response = await this.getByUrl(url); + } else { + throw new NotFoundError(); + } + + return response; + } + async getIncidentsByServiceId(serviceId: string): Promise { const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`; const url = `${await this.config.discoveryApi.getBaseUrl( diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 4f80d39816..a0736304f0 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -16,6 +16,7 @@ import { Incident, ChangeEvent, OnCall, Service } from '../components/types'; import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; +import { PagerDutyEntity } from '../types'; export type TriggerAlarmRequest = { integrationKey: string; @@ -37,6 +38,14 @@ export interface PagerDutyApi { */ getServiceByServiceId(serviceId: string): Promise; + /** + * Fetches the service for the provided PagerDutyEntity. + * + */ + getServiceByEntity( + pagerDutyEntity: PagerDutyEntity, + ): Promise; + /** * Fetches a list of incidents a provided service has. * From 71cc97f207760d2cf6ad402c7e771e9c20eca362 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 15:13:02 -0700 Subject: [PATCH 078/590] feat(plugins/pagerduty): refactor to use PagerDutyClient.getServiceByEntity Signed-off-by: Alec Jacobs --- .../components/PagerDutyCard/index.test.tsx | 58 ++++++------------- .../src/components/PagerDutyCard/index.tsx | 19 ++---- 2 files changed, 23 insertions(+), 54 deletions(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index fbb19c9897..68eea5990c 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -90,8 +90,7 @@ const service: Service = { }; const mockPagerDutyApi: Partial = { - getServiceByIntegrationKey: async () => [], - getServiceByServiceId: async () => service, + getServiceByEntity: async () => ({ service }), getOnCallByPolicyId: async () => [], getIncidentsByServiceId: async () => [], }; @@ -129,9 +128,9 @@ describe('isPluginApplicableToEntity', () => { describe('PageDutyCard', () => { it('Render pagerduty', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() - .mockImplementationOnce(async () => [service]); + .mockImplementationOnce(async () => ({ service })); const { getByText, queryByTestId } = render( wrapInTestApp( @@ -150,7 +149,7 @@ describe('PageDutyCard', () => { }); it('Handles custom error for missing token', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() .mockRejectedValueOnce(new UnauthorizedError()); @@ -168,7 +167,7 @@ describe('PageDutyCard', () => { }); it('Handles custom NotFoundError', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() .mockRejectedValueOnce(new NotFoundError()); @@ -186,7 +185,7 @@ describe('PageDutyCard', () => { }); it('handles general error', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() .mockRejectedValueOnce(new Error('An error occurred')); const { getByText, queryByTestId } = render( @@ -207,28 +206,10 @@ describe('PageDutyCard', () => { ).toBeInTheDocument(); }); - it('handles empty response from getServiceByIntegrationKey', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest - .fn() - .mockImplementationOnce(async () => []); - - const { getByText, queryByTestId } = render( - wrapInTestApp( - - - - - , - ), - ); - await waitFor(() => !queryByTestId('progress')); - expect(getByText('PagerDuty Service Not Found')).toBeInTheDocument(); - }); - it('opens the dialog when trigger button is clicked', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() - .mockImplementationOnce(async () => [service]); + .mockImplementationOnce(async () => ({ service })); const { getByText, queryByTestId, getByRole } = render( wrapInTestApp( @@ -251,9 +232,9 @@ describe('PageDutyCard', () => { describe('when entity has the pagerduty.com/service-id annotation', () => { it('Renders PagerDuty service information', async () => { - mockPagerDutyApi.getServiceByServiceId = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() - .mockImplementationOnce(async () => service); + .mockImplementationOnce(async () => ({ service })); const { getByText, queryByTestId } = render( wrapInTestApp( @@ -272,7 +253,7 @@ describe('PageDutyCard', () => { }); it('Handles custom error for missing token', async () => { - mockPagerDutyApi.getServiceByServiceId = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() .mockRejectedValueOnce(new UnauthorizedError()); @@ -292,7 +273,7 @@ describe('PageDutyCard', () => { }); it('Handles custom NotFoundError', async () => { - mockPagerDutyApi.getServiceByServiceId = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() .mockRejectedValueOnce(new NotFoundError()); @@ -310,7 +291,7 @@ describe('PageDutyCard', () => { }); it('handles general error', async () => { - mockPagerDutyApi.getServiceByServiceId = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() .mockRejectedValueOnce(new Error('An error occurred')); const { getByText, queryByTestId } = render( @@ -332,9 +313,9 @@ describe('PageDutyCard', () => { }); it('disables the Create Incident button', async () => { - mockPagerDutyApi.getServiceByServiceId = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() - .mockImplementationOnce(async () => service); + .mockImplementationOnce(async () => ({ service })); const { queryByTestId, getByTitle } = render( wrapInTestApp( @@ -346,7 +327,6 @@ describe('PageDutyCard', () => { ), ); await waitFor(() => !queryByTestId('progress')); - expect(queryByTestId('trigger-dialoger')).not.toBeInTheDocument(); expect( getByTitle('Must provide an integration-key to create incidents') .className, @@ -356,22 +336,20 @@ describe('PageDutyCard', () => { describe('when entity has all annotations', () => { it('queries by integration key', async () => { - mockPagerDutyApi.getServiceByIntegrationKey = jest + mockPagerDutyApi.getServiceByEntity = jest .fn() - .mockImplementationOnce(async () => [service]); - mockPagerDutyApi.getServiceByServiceId = jest.fn(); + .mockImplementationOnce(async () => ({ service })); const { getByText, queryByTestId } = render( wrapInTestApp( - + , ), ); await waitFor(() => !queryByTestId('progress')); - expect(mockPagerDutyApi.getServiceByServiceId).not.toHaveBeenCalled(); expect(getByText('Service Directory')).toBeInTheDocument(); expect(getByText('Create Incident')).toBeInTheDocument(); expect(getByText('Nice! No incidents found!')).toBeInTheDocument(); diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index e089cf817c..174caf4900 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -29,7 +29,6 @@ import { usePagerdutyEntity } from '../../hooks'; import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID } from '../constants'; import { TriggerDialog } from '../TriggerDialog'; import { ChangeEvents } from '../ChangeEvents'; -import { Service } from '../types'; import { useApi } from '@backstage/core-plugin-api'; import { NotFoundError } from '@backstage/errors'; @@ -53,7 +52,7 @@ export const isPluginApplicableToEntity = (entity: Entity) => ); export const PagerDutyCard = () => { - const { integrationKey, serviceId } = usePagerdutyEntity(); + const pagerDutyEntity = usePagerdutyEntity(); const api = useApi(pagerDutyApiRef); const [refreshIncidents, setRefreshIncidents] = useState(false); const [refreshChangeEvents, setRefreshChangeEvents] = @@ -77,17 +76,9 @@ export const PagerDutyCard = () => { loading, error, } = useAsync(async () => { - let foundService: Service; - - if (integrationKey) { - const services = await api.getServiceByIntegrationKey( - integrationKey as string, - ); - foundService = services[0]; - if (!foundService) throw new NotFoundError(); - } else { - foundService = await api.getServiceByServiceId(serviceId!); - } + const { service: foundService } = await api.getServiceByEntity( + pagerDutyEntity, + ); return { id: foundService.id, @@ -138,7 +129,7 @@ export const PagerDutyCard = () => { * There is no guarantee the current user entity has a valid email association, so instead just * only allow triggering incidents when an integration key is present. */ - const createIncidentDisabled = !integrationKey; + const createIncidentDisabled = !pagerDutyEntity.integrationKey; const triggerLink: IconLinkVerticalProps = { label: 'Create Incident', onClick: showDialog, From 8fe1113c96468277217cc59f9d886babc779aedb Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 15:14:53 -0700 Subject: [PATCH 079/590] feat(plugins/pagerduty): remove unused getServiceByServiceId Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 10 ---------- plugins/pagerduty/src/api/types.ts | 6 ------ 2 files changed, 16 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index e6f4eb4aef..50428e0a18 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -67,16 +67,6 @@ export class PagerDutyClient implements PagerDutyApi { return services; } - async getServiceByServiceId(serviceId: string): Promise { - const params = commonGetServiceParams; - const url = `${await this.config.discoveryApi.getBaseUrl( - 'proxy', - )}/pagerduty/services/${serviceId}?${params}`; - const { service } = await this.getByUrl(url); - - return service; - } - async getServiceByEntity( pagerDutyEntity: PagerDutyEntity, ): Promise { diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index a0736304f0..421a0f9772 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -32,12 +32,6 @@ export interface PagerDutyApi { */ getServiceByIntegrationKey(integrationKey: string): Promise; - /** - * Fetches the service for the provided service id. - * - */ - getServiceByServiceId(serviceId: string): Promise; - /** * Fetches the service for the provided PagerDutyEntity. * From 9b8438fd7216cffe8376213b9ee454c0e126e14b Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 15:15:29 -0700 Subject: [PATCH 080/590] feat(plugins/pagerduty): remove unused getServiceByIntegrationKey Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 10 ---------- plugins/pagerduty/src/api/types.ts | 6 ------ 2 files changed, 16 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 50428e0a18..50d9c7cdd9 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -57,16 +57,6 @@ export class PagerDutyClient implements PagerDutyApi { } constructor(private readonly config: ClientApiConfig) {} - async getServiceByIntegrationKey(integrationKey: string): Promise { - const params = `${commonGetServiceParams}&query=${integrationKey}`; - const url = `${await this.config.discoveryApi.getBaseUrl( - 'proxy', - )}/pagerduty/services?${params}`; - const { services } = await this.getByUrl(url); - - return services; - } - async getServiceByEntity( pagerDutyEntity: PagerDutyEntity, ): Promise { diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 421a0f9772..8ec95c285b 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -26,12 +26,6 @@ export type TriggerAlarmRequest = { }; export interface PagerDutyApi { - /** - * Fetches a list of services, filtered by the provided integration key. - * - */ - getServiceByIntegrationKey(integrationKey: string): Promise; - /** * Fetches the service for the provided PagerDutyEntity. * From 206fc1f60199ad0fd9042761a072fcaff40ef5ce Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 15:27:48 -0700 Subject: [PATCH 081/590] feat(plugins/pagerduty): update getIncidentsByServiceId response to be Promise Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 5 ++--- plugins/pagerduty/src/api/types.ts | 2 +- .../src/components/Incident/Incidents.test.tsx | 11 ++++++----- .../pagerduty/src/components/Incident/Incidents.tsx | 7 ++++++- .../src/components/PagerDutyCard/index.test.tsx | 2 +- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 50d9c7cdd9..ac5afdae79 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -88,14 +88,13 @@ export class PagerDutyClient implements PagerDutyApi { return response; } - async getIncidentsByServiceId(serviceId: string): Promise { + async getIncidentsByServiceId(serviceId: string): Promise { const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/incidents?${params}`; - const { incidents } = await this.getByUrl(url); - return incidents; + return await this.getByUrl(url); } async getChangeEventsByServiceId(serviceId: string): Promise { diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 8ec95c285b..9ecd233bab 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -38,7 +38,7 @@ export interface PagerDutyApi { * Fetches a list of incidents a provided service has. * */ - getIncidentsByServiceId(serviceId: string): Promise; + getIncidentsByServiceId(serviceId: string): Promise; /** * Fetches a list of change events a provided service has. diff --git a/plugins/pagerduty/src/components/Incident/Incidents.test.tsx b/plugins/pagerduty/src/components/Incident/Incidents.test.tsx index 74e7d82e8b..ad69bc083e 100644 --- a/plugins/pagerduty/src/components/Incident/Incidents.test.tsx +++ b/plugins/pagerduty/src/components/Incident/Incidents.test.tsx @@ -30,7 +30,7 @@ describe('Incidents', () => { it('Renders an empty state when there are no incidents', async () => { mockPagerDutyApi.getIncidentsByServiceId = jest .fn() - .mockImplementationOnce(async () => []); + .mockImplementationOnce(async () => ({ incidents: [] })); const { getByText, queryByTestId } = render( wrapInTestApp( @@ -44,9 +44,10 @@ describe('Incidents', () => { }); it('Renders all incidents', async () => { - mockPagerDutyApi.getIncidentsByServiceId = jest.fn().mockImplementationOnce( - async () => - [ + mockPagerDutyApi.getIncidentsByServiceId = jest + .fn() + .mockImplementationOnce(async () => ({ + incidents: [ { id: 'id1', status: 'triggered', @@ -83,7 +84,7 @@ describe('Incidents', () => { serviceId: 'sId2', }, ] as Incident[], - ); + })); const { getByText, getAllByTitle, queryByTestId } = render( wrapInTestApp( diff --git a/plugins/pagerduty/src/components/Incident/Incidents.tsx b/plugins/pagerduty/src/components/Incident/Incidents.tsx index 06dd50bdaa..2e0e201c79 100644 --- a/plugins/pagerduty/src/components/Incident/Incidents.tsx +++ b/plugins/pagerduty/src/components/Incident/Incidents.tsx @@ -34,7 +34,12 @@ export const Incidents = ({ serviceId, refreshIncidents }: Props) => { const api = useApi(pagerDutyApiRef); const [{ value: incidents, loading, error }, getIncidents] = useAsyncFn( - async () => await api.getIncidentsByServiceId(serviceId), + async () => { + const { incidents: foundIncidents } = await api.getIncidentsByServiceId( + serviceId, + ); + return foundIncidents; + }, ); useEffect(() => { diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index 68eea5990c..dce1bb536a 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -92,7 +92,7 @@ const service: Service = { const mockPagerDutyApi: Partial = { getServiceByEntity: async () => ({ service }), getOnCallByPolicyId: async () => [], - getIncidentsByServiceId: async () => [], + getIncidentsByServiceId: async () => ({ incidents: [] }), }; const apis = TestApiRegistry.from( From 7378e1710cb3430d33b4a163a8a2b0afdecd43c5 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 16:59:59 -0700 Subject: [PATCH 082/590] feat(plugins/pagerduty): update getChangeEventsByServiceId response to be Promise Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 8 +- plugins/pagerduty/src/api/types.ts | 2 +- .../ChangeEvents/ChangeEvents.test.tsx | 122 +++++++++--------- .../components/ChangeEvents/ChangeEvents.tsx | 5 +- 4 files changed, 69 insertions(+), 68 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index ac5afdae79..bf6835ec2a 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -97,15 +97,15 @@ export class PagerDutyClient implements PagerDutyApi { return await this.getByUrl(url); } - async getChangeEventsByServiceId(serviceId: string): Promise { + async getChangeEventsByServiceId( + serviceId: string, + ): Promise { const params = `limit=5&time_zone=UTC&sort_by=timestamp`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/services/${serviceId}/change_events?${params}`; - const { change_events } = await this.getByUrl(url); - - return change_events; + return await this.getByUrl(url); } async getOnCallByPolicyId(policyId: string): Promise { diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 9ecd233bab..8914c4ed97 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -44,7 +44,7 @@ export interface PagerDutyApi { * Fetches a list of change events a provided service has. * */ - getChangeEventsByServiceId(serviceId: string): Promise; + getChangeEventsByServiceId(serviceId: string): Promise; /** * Fetches the list of users in an escalation policy. diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx index fca2422198..017e394de0 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx @@ -30,7 +30,7 @@ describe('Incidents', () => { it('Renders an empty state when there are no change events', async () => { mockPagerDutyApi.getChangeEventsByServiceId = jest .fn() - .mockImplementationOnce(async () => []); + .mockImplementationOnce(async () => ({ change_events: [] })); const { getByText, queryByTestId } = render( wrapInTestApp( @@ -46,37 +46,36 @@ describe('Incidents', () => { it('Renders all change events', async () => { mockPagerDutyApi.getChangeEventsByServiceId = jest .fn() - .mockImplementationOnce( - async () => - [ - { - id: 'id1', - source: 'changeSource1', - html_url: 'www.pdlink.com', - links: [ - { - href: 'www.externalLink1.com', - text: 'link1', - }, - ], - summary: 'summary of event', - timestamp: '2020-07-17T08:42:58.315+0000', - }, - { - id: 'id2', - source: 'changeSource1', - html_url: 'www.pdlink.com/link', - links: [ - { - href: 'www.externalLink1.com', - text: 'link1', - }, - ], - summary: 'sum of EVENT', - timestamp: '2020-07-18T08:42:58.315+0000', - }, - ] as ChangeEvent[], - ); + .mockImplementationOnce(async () => ({ + change_events: [ + { + id: 'id1', + source: 'changeSource1', + html_url: 'www.pdlink.com', + links: [ + { + href: 'www.externalLink1.com', + text: 'link1', + }, + ], + summary: 'summary of event', + timestamp: '2020-07-17T08:42:58.315+0000', + }, + { + id: 'id2', + source: 'changeSource1', + html_url: 'www.pdlink.com/link', + links: [ + { + href: 'www.externalLink1.com', + text: 'link1', + }, + ], + summary: 'sum of EVENT', + timestamp: '2020-07-18T08:42:58.315+0000', + }, + ] as ChangeEvent[], + })); const { getByText, getAllByTitle, queryByTestId } = render( wrapInTestApp( @@ -95,36 +94,35 @@ describe('Incidents', () => { it('Does not render a pagerduty link when html_url is not present in response', async () => { mockPagerDutyApi.getChangeEventsByServiceId = jest .fn() - .mockImplementationOnce( - async () => - [ - { - id: 'id1', - source: 'changeSource1', - links: [ - { - href: 'www.externalLink1.com', - text: 'link1', - }, - ], - summary: 'summary of event', - timestamp: '2020-07-17T08:42:58.315+0000', - }, - { - id: 'id2', - source: 'changeSource1', - html_url: 'www.pdlink.com/link', - links: [ - { - href: 'www.externalLink1.com', - text: 'link1', - }, - ], - summary: 'sum of EVENT', - timestamp: '2020-07-18T08:42:58.315+0000', - }, - ] as ChangeEvent[], - ); + .mockImplementationOnce(async () => ({ + change_events: [ + { + id: 'id1', + source: 'changeSource1', + links: [ + { + href: 'www.externalLink1.com', + text: 'link1', + }, + ], + summary: 'summary of event', + timestamp: '2020-07-17T08:42:58.315+0000', + }, + { + id: 'id2', + source: 'changeSource1', + html_url: 'www.pdlink.com/link', + links: [ + { + href: 'www.externalLink1.com', + text: 'link1', + }, + ], + summary: 'sum of EVENT', + timestamp: '2020-07-18T08:42:58.315+0000', + }, + ] as ChangeEvent[], + })); const { getByText, getAllByTitle, queryByTestId } = render( wrapInTestApp( diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.tsx index 58b4dd6acf..4b19257cdc 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.tsx @@ -33,7 +33,10 @@ export const ChangeEvents = ({ serviceId, refreshEvents }: Props) => { const api = useApi(pagerDutyApiRef); const [{ value: changeEvents, loading, error }, getChangeEvents] = useAsyncFn( - async () => await api.getChangeEventsByServiceId(serviceId), + async () => { + const { change_events } = await api.getChangeEventsByServiceId(serviceId); + return change_events; + }, ); useEffect(() => { From 48a7d96e7270fdce9728823b1d864aa9f2c9e221 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 17:05:34 -0700 Subject: [PATCH 083/590] feat(plugins/pagerduty): update getOnCallByPolicyId response to be Promise Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 5 ++-- plugins/pagerduty/src/api/types.ts | 2 +- .../components/Escalation/Escalation.test.tsx | 26 ++++++++++--------- .../Escalation/EscalationPolicy.tsx | 2 +- .../components/PagerDutyCard/index.test.tsx | 2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index bf6835ec2a..7f9f3d6c59 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -108,14 +108,13 @@ export class PagerDutyClient implements PagerDutyApi { return await this.getByUrl(url); } - async getOnCallByPolicyId(policyId: string): Promise { + async getOnCallByPolicyId(policyId: string): Promise { const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${policyId}`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/oncalls?${params}`; - const { oncalls } = await this.getByUrl(url); - return oncalls; + return await this.getByUrl(url); } triggerAlarm(request: TriggerAlarmRequest): Promise { diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 8914c4ed97..d2ab0290d3 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -50,7 +50,7 @@ export interface PagerDutyApi { * Fetches the list of users in an escalation policy. * */ - getOnCallByPolicyId(policyId: string): Promise; + getOnCallByPolicyId(policyId: string): Promise; /** * Triggers an incident to whoever is on-call. diff --git a/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx b/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx index 47f18002fe..33e8865f59 100644 --- a/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx +++ b/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx @@ -30,7 +30,7 @@ describe('Escalation', () => { it('Handles an empty response', async () => { mockPagerDutyApi.getOnCallByPolicyId = jest .fn() - .mockImplementationOnce(async () => []); + .mockImplementationOnce(async () => ({ oncalls: [] })); const { getByText, queryByTestId } = render( wrapInTestApp( @@ -48,17 +48,19 @@ describe('Escalation', () => { it('Render a list of users', async () => { mockPagerDutyApi.getOnCallByPolicyId = jest .fn() - .mockImplementationOnce(async () => [ - { - user: { - name: 'person1', - id: 'p1', - summary: 'person1', - email: 'person1@example.com', - html_url: 'http://a.com/id1', - } as User, - }, - ]); + .mockImplementationOnce(async () => ({ + oncalls: [ + { + user: { + name: 'person1', + id: 'p1', + summary: 'person1', + email: 'person1@example.com', + html_url: 'http://a.com/id1', + } as User, + }, + ], + })); const { getByText, queryByTestId } = render( wrapInTestApp( diff --git a/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx b/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx index 704887be58..8602733ee3 100644 --- a/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx +++ b/plugins/pagerduty/src/components/Escalation/EscalationPolicy.tsx @@ -37,7 +37,7 @@ export const EscalationPolicy = ({ policyId }: Props) => { loading, error, } = useAsync(async () => { - const oncalls = await api.getOnCallByPolicyId(policyId); + const { oncalls } = await api.getOnCallByPolicyId(policyId); const usersItem = oncalls .sort((a, b) => a.escalation_level - b.escalation_level) .map(oncall => oncall.user); diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index dce1bb536a..9a6e9a3ed2 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -91,7 +91,7 @@ const service: Service = { const mockPagerDutyApi: Partial = { getServiceByEntity: async () => ({ service }), - getOnCallByPolicyId: async () => [], + getOnCallByPolicyId: async () => ({ oncalls: [] }), getIncidentsByServiceId: async () => ({ incidents: [] }), }; From 0be087f637a58c382930e26d9f3b3b7c72e1b52e Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 17:07:32 -0700 Subject: [PATCH 084/590] fix(plugins/pagerduty): define responses types before utilizing them Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.ts | 1 - plugins/pagerduty/src/api/types.ts | 40 ++++++++++++++--------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index 7f9f3d6c59..ebf350add2 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { Service, Incident, ChangeEvent, OnCall } from '../components/types'; import { PagerDutyApi, TriggerAlarmRequest, diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index d2ab0290d3..ed6c1f222a 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -18,6 +18,26 @@ import { Incident, ChangeEvent, OnCall, Service } from '../components/types'; import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; import { PagerDutyEntity } from '../types'; +export type ServicesResponse = { + services: Service[]; +}; + +export type ServiceResponse = { + service: Service; +}; + +export type IncidentsResponse = { + incidents: Incident[]; +}; + +export type ChangeEventsResponse = { + change_events: ChangeEvent[]; +}; + +export type OnCallsResponse = { + oncalls: OnCall[]; +}; + export type TriggerAlarmRequest = { integrationKey: string; source: string; @@ -58,26 +78,6 @@ export interface PagerDutyApi { triggerAlarm(request: TriggerAlarmRequest): Promise; } -export type ServicesResponse = { - services: Service[]; -}; - -export type ServiceResponse = { - service: Service; -}; - -export type IncidentsResponse = { - incidents: Incident[]; -}; - -export type ChangeEventsResponse = { - change_events: ChangeEvent[]; -}; - -export type OnCallsResponse = { - oncalls: OnCall[]; -}; - export type ClientApiDependencies = { discoveryApi: DiscoveryApi; fetchApi: FetchApi; From f22f6050b4fcfada1823953afa83887fd752a748 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 17:31:01 -0700 Subject: [PATCH 085/590] feat(plugins/pagerduty): ensure proper types are exported and regenerate api-report Signed-off-by: Alec Jacobs --- plugins/pagerduty/api-report.md | 170 +++++++++++++++++++--- plugins/pagerduty/src/api/index.ts | 10 +- plugins/pagerduty/src/components/index.ts | 32 ++++ plugins/pagerduty/src/index.ts | 16 +- 4 files changed, 197 insertions(+), 31 deletions(-) create mode 100644 plugins/pagerduty/src/components/index.ts diff --git a/plugins/pagerduty/api-report.md b/plugins/pagerduty/api-report.md index c708a1ca4e..dd6155521b 100644 --- a/plugins/pagerduty/api-report.md +++ b/plugins/pagerduty/api-report.md @@ -13,11 +13,88 @@ import { Entity } from '@backstage/catalog-model'; import { FetchApi } from '@backstage/core-plugin-api'; import { ReactNode } from 'react'; +// Warning: (ae-missing-release-tag) "Assignee" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type Assignee = { + id: string; + summary: string; + html_url: string; +}; + +// Warning: (ae-missing-release-tag) "ChangeEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ChangeEvent = { + id: string; + integration: [ + { + service: Service; + }, + ]; + source: string; + html_url: string; + links: [ + { + href: string; + text: string; + }, + ]; + summary: string; + timestamp: string; +}; + +// Warning: (ae-missing-release-tag) "ChangeEventsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ChangeEventsResponse = { + change_events: ChangeEvent[]; +}; + +// Warning: (ae-missing-release-tag) "ClientApiConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ClientApiConfig = ClientApiDependencies & { + eventsBaseUrl?: string; +}; + +// Warning: (ae-missing-release-tag) "ClientApiDependencies" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ClientApiDependencies = { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; +}; + // Warning: (ae-missing-release-tag) "EntityPagerDutyCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const EntityPagerDutyCard: () => JSX.Element; +// Warning: (ae-missing-release-tag) "Incident" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type Incident = { + id: string; + title: string; + status: string; + html_url: string; + assignments: [ + { + assignee: Assignee; + }, + ]; + serviceId: string; + created_at: string; +}; + +// Warning: (ae-missing-release-tag) "IncidentsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type IncidentsResponse = { + incidents: Incident[]; +}; + // Warning: (ae-missing-release-tag) "isPluginApplicableToEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -25,6 +102,21 @@ const isPluginApplicableToEntity: (entity: Entity) => boolean; export { isPluginApplicableToEntity as isPagerDutyAvailable }; export { isPluginApplicableToEntity }; +// Warning: (ae-missing-release-tag) "OnCall" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type OnCall = { + user: User; + escalation_level: number; +}; + +// Warning: (ae-missing-release-tag) "OnCallsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type OnCallsResponse = { + oncalls: OnCall[]; +}; + // Warning: (ae-forgotten-export) The symbol "PagerDutyApi" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "pagerDutyApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -40,38 +132,35 @@ export const PagerDutyCard: () => JSX.Element; // // @public (undocumented) export class PagerDutyClient implements PagerDutyApi { - // Warning: (ae-forgotten-export) The symbol "ClientApiConfig" needs to be exported by the entry point index.d.ts constructor(config: ClientApiConfig); // (undocumented) static fromConfig( configApi: ConfigApi, - discoveryApi: DiscoveryApi, - fetchApi: FetchApi, + { discoveryApi, fetchApi }: ClientApiDependencies, ): PagerDutyClient; - // Warning: (ae-forgotten-export) The symbol "ChangeEvent" needs to be exported by the entry point index.d.ts - // // (undocumented) - getChangeEventsByServiceId(serviceId: string): Promise; - // Warning: (ae-forgotten-export) The symbol "Incident" needs to be exported by the entry point index.d.ts - // + getChangeEventsByServiceId(serviceId: string): Promise; // (undocumented) - getIncidentsByServiceId(serviceId: string): Promise; - // Warning: (ae-forgotten-export) The symbol "OnCall" needs to be exported by the entry point index.d.ts - // + getIncidentsByServiceId(serviceId: string): Promise; // (undocumented) - getOnCallByPolicyId(policyId: string): Promise; - // Warning: (ae-forgotten-export) The symbol "Service" needs to be exported by the entry point index.d.ts - // + getOnCallByPolicyId(policyId: string): Promise; // (undocumented) - getServiceByIntegrationKey(integrationKey: string): Promise; - // (undocumented) - getServiceByServiceId(serviceId: string): Promise; - // Warning: (ae-forgotten-export) The symbol "TriggerAlarmRequest" needs to be exported by the entry point index.d.ts - // + getServiceByEntity( + pagerDutyEntity: PagerDutyEntity, + ): Promise; // (undocumented) triggerAlarm(request: TriggerAlarmRequest): Promise; } +// Warning: (ae-missing-release-tag) "PagerDutyEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyEntity = { + integrationKey?: string; + serviceId?: string; + name: string; +}; + // Warning: (ae-missing-release-tag) "pagerDutyPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -79,6 +168,38 @@ const pagerDutyPlugin: BackstagePlugin<{}, {}>; export { pagerDutyPlugin }; export { pagerDutyPlugin as plugin }; +// Warning: (ae-missing-release-tag) "Service" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type Service = { + id: string; + name: string; + html_url: string; + integrationKey: string; + escalation_policy: { + id: string; + user: User; + html_url: string; + }; +}; + +// Warning: (ae-missing-release-tag) "ServiceResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ServiceResponse = { + service: Service; +}; + +// Warning: (ae-missing-release-tag) "TriggerAlarmRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type TriggerAlarmRequest = { + integrationKey: string; + source: string; + description: string; + userName: string; +}; + // Warning: (ae-forgotten-export) The symbol "TriggerButtonProps" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "TriggerButton" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -89,4 +210,15 @@ export function TriggerButton(props: TriggerButtonProps): JSX.Element; // // @public (undocumented) export class UnauthorizedError extends Error {} + +// Warning: (ae-missing-release-tag) "User" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type User = { + id: string; + summary: string; + email: string; + html_url: string; + name: string; +}; ``` diff --git a/plugins/pagerduty/src/api/index.ts b/plugins/pagerduty/src/api/index.ts index 015204b1e8..a88137b979 100644 --- a/plugins/pagerduty/src/api/index.ts +++ b/plugins/pagerduty/src/api/index.ts @@ -15,4 +15,12 @@ */ export { PagerDutyClient, pagerDutyApiRef, UnauthorizedError } from './client'; -export type { PagerDutyApi } from './types'; +export type { + ServiceResponse, + IncidentsResponse, + ChangeEventsResponse, + OnCallsResponse, + TriggerAlarmRequest, + ClientApiDependencies, + ClientApiConfig, +} from './types'; diff --git a/plugins/pagerduty/src/components/index.ts b/plugins/pagerduty/src/components/index.ts new file mode 100644 index 0000000000..a452c12e12 --- /dev/null +++ b/plugins/pagerduty/src/components/index.ts @@ -0,0 +1,32 @@ +/* + * 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 type { + ChangeEvent, + Incident, + Service, + OnCall, + Assignee, + User, +} from './types'; + +export { + isPluginApplicableToEntity, + isPluginApplicableToEntity as isPagerDutyAvailable, + PagerDutyCard, +} from './PagerDutyCard'; + +export { TriggerButton } from './TriggerButton'; diff --git a/plugins/pagerduty/src/index.ts b/plugins/pagerduty/src/index.ts index 8c970c01bb..2e0eddc9a8 100644 --- a/plugins/pagerduty/src/index.ts +++ b/plugins/pagerduty/src/index.ts @@ -25,14 +25,8 @@ export { pagerDutyPlugin as plugin, EntityPagerDutyCard, } from './plugin'; -export { - isPluginApplicableToEntity, - isPluginApplicableToEntity as isPagerDutyAvailable, - PagerDutyCard, -} from './components/PagerDutyCard'; -export { TriggerButton } from './components/TriggerButton'; -export { - PagerDutyClient, - pagerDutyApiRef, - UnauthorizedError, -} from './api/client'; + +export * from './components'; +export * from './api'; + +export type { PagerDutyEntity } from './types'; From 24511a3beb3f23959d0025cda1b618c163ca96f2 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 3 Jun 2022 17:42:49 -0700 Subject: [PATCH 086/590] chore: enhance changeset definition to call out all new breaking changes Signed-off-by: Alec Jacobs --- .changeset/weak-bananas-deliver.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.changeset/weak-bananas-deliver.md b/.changeset/weak-bananas-deliver.md index db76f396a8..2be1e87d29 100644 --- a/.changeset/weak-bananas-deliver.md +++ b/.changeset/weak-bananas-deliver.md @@ -5,9 +5,19 @@ Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ -**BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object as a third argument. +**BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to +accept 2 arguments: config and ClientApiDependencies The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests. +**BREAKING** A new query method `getServiceByEntity` that is used to query for Services by either the `integrationKey` or `serviceId` +annotation values if they are defined. The `integrationKey` value is preferred currently over `serviceId`. As such, the previous +`getServiceByIntegrationKey` method has been removed. + +**BREAKING** The return values for each Client query method has been changed to return an object instead of raw values. +For example, the `getIncidentsByServiceId` query method now returns an object in the shape of `{ incidents: Incident[] }` +instead of just `Incident[]`. +This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions. + In addition, various enhancements/bug fixes were introduced: - The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage From 2de3fc32316cf7256633a5cbb1b7306ce5cc33cc Mon Sep 17 00:00:00 2001 From: Maixmilian Ressel Date: Wed, 15 Jun 2022 17:18:44 +0200 Subject: [PATCH 087/590] Add documentation for allowedOwners and allowedRepos Signed-off-by: Maixmilian Ressel --- .../software-templates/writing-templates.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 27e6e76817..4b11cc4990 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -320,6 +320,30 @@ The `allowedHosts` part should be set to where you wish to enable this template to publish to. And it can be any host that is listed in your `integrations` config in `app-config.yaml`. +Besides specifying `allowedHosts` you can also restrict the template to publish to +repositories owned by specific users/groups/namespaces by setting the `allowedOwners` +option. With the `allowedRepos` option you are able to narrow it down further to a +specific set of repository names. A full example could look like this: + +```yaml +- title: Choose a location + required: + - repoUrl + properties: + repoUrl: + title: Repository Location + type: string + ui:field: RepoUrlPicker + ui:options: + allowedHosts: + - github.com + allowedOwners: + - backstage + - someGithubUser + allowedRepos: + - backstage +``` + The `RepoUrlPicker` is a custom field that we provide part of the `plugin-scaffolder`. You can provide your own custom fields by [writing your own Custom Field Extensions](./writing-custom-field-extensions.md) From 67f4f1bcc6a38b644c99decd188b95fe109c4d12 Mon Sep 17 00:00:00 2001 From: Quentin Rousseau Date: Wed, 15 Jun 2022 09:00:41 -0700 Subject: [PATCH 088/590] Add Rootly plugin to marketplace Signed-off-by: Quentin Rousseau --- microsite/data/plugins/rootly.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 microsite/data/plugins/rootly.yaml diff --git a/microsite/data/plugins/rootly.yaml b/microsite/data/plugins/rootly.yaml new file mode 100644 index 0000000000..6c5cfdf715 --- /dev/null +++ b/microsite/data/plugins/rootly.yaml @@ -0,0 +1,9 @@ +--- +title: Rootly +author: Rootly +authorUrl: https://rootly.com/ +category: Incident Management +description: Import your Backstage entities into Rootly services and view incidents & analytics. +documentation: https://github.com/backstage/backstage/blob/master/plugins/rootly/README.md +iconUrl: https://raw.githubusercontent.com/backstage/backstage/master/plugins/rootly/doc/logo.png +npmPackageName: '@backstage/plugin-rootly' From 99b222eea502e9545172835a4ea1f2ceb63cd2f8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 16:17:17 +0000 Subject: [PATCH 089/590] chore(deps): update dependency @types/node to v16.11.41 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 54c6f689de..200141f110 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6301,9 +6301,9 @@ integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== "@types/node@^16.0.0", "@types/node@^16.11.26", "@types/node@^16.9.2": - version "16.11.39" - resolved "https://registry.npmjs.org/@types/node/-/node-16.11.39.tgz#07223cd2bc332ad9d92135e3a522eebdee3b060e" - integrity sha512-K0MsdV42vPwm9L6UwhIxMAOmcvH/1OoVkZyCgEtVu4Wx7sElGloy/W7kMBNe/oJ7V/jW9BVt1F6RahH6e7tPXw== + version "16.11.41" + resolved "https://registry.npmjs.org/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" + integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" From bbf3e1393283e9ab82f1c1d5b07bf4ecdd1e849a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 16:33:52 +0000 Subject: [PATCH 090/590] chore(deps): update dependency @types/semver to v7.3.10 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 11549172c3..43b5864306 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6624,9 +6624,9 @@ integrity sha512-+beqKQOh9PYxuHvijhVl+tIHvT6tuwOrE9m14zd+MT2A38KoKZhh7pYJ0SNleLtwDsiIxHDsIk9bv01oOxvSvA== "@types/semver@^7.3.8": - version "7.3.9" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + version "7.3.10" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73" + integrity sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw== "@types/serve-handler@^6.1.0": version "6.1.1" From 7d47e7e512fba82c1ea9ee74bb378909d6964b4f Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Wed, 15 Jun 2022 12:33:41 -0400 Subject: [PATCH 091/590] feat(adrs): track discover event and result rank in AdrSearchResultListItem Signed-off-by: Phil Kuang --- .changeset/thick-radios-drive.md | 5 +++++ plugins/adr/api-report.md | 2 ++ plugins/adr/src/search/AdrSearchResultListItem.tsx | 13 ++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/thick-radios-drive.md diff --git a/.changeset/thick-radios-drive.md b/.changeset/thick-radios-drive.md new file mode 100644 index 0000000000..130030be59 --- /dev/null +++ b/.changeset/thick-radios-drive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-adr': patch +--- + +Track discover event and result rank for `AdrSearchResultListItem` diff --git a/plugins/adr/api-report.md b/plugins/adr/api-report.md index 61cf231784..fbe04b1dc4 100644 --- a/plugins/adr/api-report.md +++ b/plugins/adr/api-report.md @@ -47,10 +47,12 @@ export const AdrReader: { export const AdrSearchResultListItem: ({ lineClamp, highlight, + rank, result, }: { lineClamp?: number | undefined; highlight?: ResultHighlight | undefined; + rank?: number | undefined; result: AdrDocument; }) => JSX.Element; diff --git a/plugins/adr/src/search/AdrSearchResultListItem.tsx b/plugins/adr/src/search/AdrSearchResultListItem.tsx index 484bac336e..677e39fc11 100644 --- a/plugins/adr/src/search/AdrSearchResultListItem.tsx +++ b/plugins/adr/src/search/AdrSearchResultListItem.tsx @@ -24,6 +24,7 @@ import { makeStyles, } from '@material-ui/core'; import { Link } from '@backstage/core-components'; +import { useAnalytics } from '@backstage/core-plugin-api'; import { AdrDocument } from '@backstage/plugin-adr-common'; import { ResultHighlight } from '@backstage/plugin-search-common'; import { HighlightedSearchResultText } from '@backstage/plugin-search-react'; @@ -46,16 +47,26 @@ const useStyles = makeStyles({ export const AdrSearchResultListItem = ({ lineClamp = 5, highlight, + rank, result, }: { lineClamp?: number; highlight?: ResultHighlight; + rank?: number; result: AdrDocument; }) => { const classes = useStyles(); + const analytics = useAnalytics(); + + const handleClick = () => { + analytics.captureEvent('discover', result.title, { + attributes: { to: result.location }, + value: rank, + }); + }; return ( - + Date: Wed, 15 Jun 2022 18:59:43 +0200 Subject: [PATCH 092/590] Revert "fix(deps): update dependency glob to v8" Signed-off-by: Patrik Oldsberg --- .changeset/renovate-5618e69.md | 6 ------ packages/cli/package.json | 2 +- plugins/catalog-backend/package.json | 2 +- yarn.lock | 11 ----------- 4 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 .changeset/renovate-5618e69.md diff --git a/.changeset/renovate-5618e69.md b/.changeset/renovate-5618e69.md deleted file mode 100644 index 7745c5e157..0000000000 --- a/.changeset/renovate-5618e69.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/cli': patch -'@backstage/plugin-catalog-backend': patch ---- - -Updated dependency `glob` to `^8.0.0`. diff --git a/packages/cli/package.json b/packages/cli/package.json index 8387217861..071fc74f97 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -82,7 +82,7 @@ "express": "^4.17.1", "fork-ts-checker-webpack-plugin": "^7.0.0-alpha.8", "fs-extra": "10.1.0", - "glob": "^8.0.0", + "glob": "^7.1.7", "global-agent": "^3.0.0", "handlebars": "^4.7.3", "html-webpack-plugin": "^5.3.1", diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index fa2312b881..c33dccd8a7 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -54,7 +54,7 @@ "fast-json-stable-stringify": "^2.1.0", "fs-extra": "10.1.0", "git-url-parse": "^11.6.0", - "glob": "^8.0.0", + "glob": "^7.1.6", "knex": "^1.0.2", "lodash": "^4.17.21", "luxon": "^2.0.2", diff --git a/yarn.lock b/yarn.lock index 11549172c3..a190f8e765 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13543,17 +13543,6 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.0: - version "8.0.3" - resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - glob@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz#00308f5c035aa0b2a447cd37ead267ddff1577d3" From bc87604c26f012fdd5d60f1b4365fc98f30243cc Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 15 Jun 2022 19:17:16 +0200 Subject: [PATCH 093/590] create-app: added explicit node-gyp dependency Signed-off-by: Patrik Oldsberg --- .changeset/large-kangaroos-poke.md | 13 +++++++++++++ .../templates/default-app/package.json.hbs | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 .changeset/large-kangaroos-poke.md diff --git a/.changeset/large-kangaroos-poke.md b/.changeset/large-kangaroos-poke.md new file mode 100644 index 0000000000..3a9444cfa1 --- /dev/null +++ b/.changeset/large-kangaroos-poke.md @@ -0,0 +1,13 @@ +--- +'@backstage/create-app': patch +--- + +Added an explicit `node-gyp` dependency to the root `package.json`. This is to work around a bug in older versions of `node-gyp` that causes Python execution to fail on macOS. + +You can add this workaround to your existing project by adding `node-gyp` as a `devDependency` in your root `package.json` file: + +```diff + "devDependencies": { ++ "node-gyp": "^9.0.0" + }, +``` diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index d4cf4fb5fe..47fb0d622f 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -35,7 +35,8 @@ "concurrently": "^6.0.0", "lerna": "^4.0.0", "prettier": "^2.3.2", - "typescript": "~4.6.4" + "typescript": "~4.6.4", + "node-gyp": "^9.0.0" }, "resolutions": { "@types/react": "^17", From a906f6ce240b51210ad6c1d22d3e68cd4f6b6eba Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Tue, 14 Jun 2022 15:56:27 +0200 Subject: [PATCH 094/590] add stack overflow plugin to marketplace Signed-off-by: Emma Indal --- microsite/data/plugins/stack-overflow.yaml | 9 +++++++++ microsite/static/img/stack-overflow-logo.svg | 1 + plugins/stack-overflow/README.md | 2 ++ 3 files changed, 12 insertions(+) create mode 100644 microsite/data/plugins/stack-overflow.yaml create mode 100644 microsite/static/img/stack-overflow-logo.svg diff --git a/microsite/data/plugins/stack-overflow.yaml b/microsite/data/plugins/stack-overflow.yaml new file mode 100644 index 0000000000..23b952e93f --- /dev/null +++ b/microsite/data/plugins/stack-overflow.yaml @@ -0,0 +1,9 @@ +--- +title: Stack Overflow +author: Spotify +authorUrl: https://github.com/spotify +category: Discovery +description: Provides Stack Overflow specific functionality that can be used in different ways (e.g. for homepage and search) to compose your Backstage App. +documentation: https://github.com/backstage/backstage/blob/master/plugins/stack-overflow +iconUrl: img/stack-overflow-logo.svg +npmPackageName: '@backstage/plugin-adr' diff --git a/microsite/static/img/stack-overflow-logo.svg b/microsite/static/img/stack-overflow-logo.svg new file mode 100644 index 0000000000..d2fba99094 --- /dev/null +++ b/microsite/static/img/stack-overflow-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/stack-overflow/README.md b/plugins/stack-overflow/README.md index 6beb843c7d..96a8f524e3 100644 --- a/plugins/stack-overflow/README.md +++ b/plugins/stack-overflow/README.md @@ -23,6 +23,8 @@ This stack overflow frontend plugin is primarily responsible for the following: #### Use specific search result list item for Stack Overflow Question +> Note: For Stack Overflow specific search results to be returned, it needs to be indexed. Use the [stack-overflow-backend plugin](https://github.com/backstage/backstage/blob/master/plugins/stack-overflow-backend/README.md) to index Stack Overflow Questions to search. + When you have your `packages/app/src/components/search/SearchPage.tsx` file ready to make modifications, add the following code snippet to add the `StackOverflowSearchResultListItem` when the type of the search results are `stack-overflow`. ```tsx From c9ca0e917d9452eadbabc2cf539b0de51fef7705 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Tue, 14 Jun 2022 15:58:15 +0200 Subject: [PATCH 095/590] add support for icon property for StackOverflowQuestions homepage component Signed-off-by: Emma Indal --- .../home/StackOverflowQuestions/Content.tsx | 10 +++--- .../StackOverflowQuestions.stories.tsx | 16 +++++++++ .../src/icons/StackOverflowIcon.tsx | 34 +++++++++++++++++++ plugins/stack-overflow/src/icons/index.ts | 16 +++++++++ plugins/stack-overflow/src/index.ts | 2 ++ plugins/stack-overflow/src/types.ts | 1 + 6 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 plugins/stack-overflow/src/icons/StackOverflowIcon.tsx create mode 100644 plugins/stack-overflow/src/icons/index.ts diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx index c347399474..fbc3a90a9d 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/Content.tsx @@ -22,6 +22,7 @@ import { ListItem, ListItemText, ListItemSecondaryAction, + ListItemIcon, } from '@material-ui/core'; import OpenInNewIcon from '@material-ui/icons/OpenInNew'; import useAsync from 'react-use/lib/useAsync'; @@ -68,8 +69,9 @@ export const Content = (props: StackOverflowQuestionsContentProps) => { return ( {value.map(question => ( - - + + + {props.icon && {props.icon}} { - - + + ))} ); diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx index e19e0f807b..35ace44c14 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx @@ -20,6 +20,7 @@ import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; import { Grid } from '@material-ui/core'; import React, { ComponentType } from 'react'; +import { StackOverflowIcon } from '../../icons'; export default { title: 'Plugins/Home/Components/StackOverflow', @@ -60,3 +61,18 @@ export const Default = () => { ); }; + +export const WithIcon = () => { + return ( + + } + /> + + ); +}; diff --git a/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx b/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx new file mode 100644 index 0000000000..5e2139b4a8 --- /dev/null +++ b/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx @@ -0,0 +1,34 @@ +/* + * 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'; + +export const StackOverflowIcon = () => { + return ( + + + + + ); +}; diff --git a/plugins/stack-overflow/src/icons/index.ts b/plugins/stack-overflow/src/icons/index.ts new file mode 100644 index 0000000000..141d87d7b1 --- /dev/null +++ b/plugins/stack-overflow/src/icons/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 './StackOverflowIcon'; diff --git a/plugins/stack-overflow/src/index.ts b/plugins/stack-overflow/src/index.ts index 264a0d5d7c..5965d66983 100644 --- a/plugins/stack-overflow/src/index.ts +++ b/plugins/stack-overflow/src/index.ts @@ -18,11 +18,13 @@ * * @packageDocumentation */ + export { stackOverflowPlugin, StackOverflowSearchResultListItem, HomePageStackOverflowQuestions, } from './plugin'; +export { StackOverflowIcon } from './icons'; export type { StackOverflowQuestion, StackOverflowQuestionsContentProps, diff --git a/plugins/stack-overflow/src/types.ts b/plugins/stack-overflow/src/types.ts index c3fa08cc4f..8f2d8847ec 100644 --- a/plugins/stack-overflow/src/types.ts +++ b/plugins/stack-overflow/src/types.ts @@ -34,6 +34,7 @@ export type StackOverflowQuestion = { */ export type StackOverflowQuestionsContentProps = { requestParams: StackOverflowQuestionsRequestParams; + icon?: React.ReactNode; }; /** From 8d9f6bbe81f4f4c4b1ea47019a1b86311cece0dd Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Tue, 14 Jun 2022 16:06:18 +0200 Subject: [PATCH 096/590] add storybook example of stack overflow search result with icon Signed-off-by: Emma Indal --- ...StackOverflowSearchResultListItem.stories.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.stories.tsx b/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.stories.tsx index 1239cabcbe..df5b8038b0 100644 --- a/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.stories.tsx +++ b/plugins/stack-overflow/src/search/StackOverflowSearchResultListItem/StackOverflowSearchResultListItem.stories.tsx @@ -17,6 +17,7 @@ import { StackOverflowSearchResultListItem } from '../../plugin'; import { wrapInTestApp } from '@backstage/test-utils'; import React, { ComponentType } from 'react'; +import { StackOverflowIcon } from '../../icons'; export default { title: 'Plugins/Search/StackOverflowResultListItem', @@ -37,3 +38,18 @@ export const Default = () => { /> ); }; + +export const WithIcon = () => { + return ( + } + /> + ); +}; From 5907499e67c13bf62b65398ffb1560ddd1e30518 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Tue, 14 Jun 2022 16:24:16 +0200 Subject: [PATCH 097/590] update api report Signed-off-by: Emma Indal --- plugins/stack-overflow/api-report.md | 4 ++++ plugins/stack-overflow/src/icons/StackOverflowIcon.tsx | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/plugins/stack-overflow/api-report.md b/plugins/stack-overflow/api-report.md index 277b0272d1..e4912fcd18 100644 --- a/plugins/stack-overflow/api-report.md +++ b/plugins/stack-overflow/api-report.md @@ -16,6 +16,9 @@ export const HomePageStackOverflowQuestions: ( } & StackOverflowQuestionsContentProps, ) => JSX.Element; +// @public +export const StackOverflowIcon: () => JSX.Element; + // @public export const stackOverflowPlugin: BackstagePlugin<{}, {}>; @@ -31,6 +34,7 @@ export type StackOverflowQuestion = { // @public export type StackOverflowQuestionsContentProps = { requestParams: StackOverflowQuestionsRequestParams; + icon?: React.ReactNode; }; // @public diff --git a/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx b/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx index 5e2139b4a8..8befe53177 100644 --- a/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx +++ b/plugins/stack-overflow/src/icons/StackOverflowIcon.tsx @@ -15,6 +15,10 @@ */ import React from 'react'; +/** + * Stack Overflow Icon + * @public + */ export const StackOverflowIcon = () => { return ( Date: Tue, 14 Jun 2022 16:38:30 +0200 Subject: [PATCH 098/590] fixup Signed-off-by: Emma Indal --- microsite/data/plugins/stack-overflow.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/stack-overflow.yaml b/microsite/data/plugins/stack-overflow.yaml index 23b952e93f..0d734446d7 100644 --- a/microsite/data/plugins/stack-overflow.yaml +++ b/microsite/data/plugins/stack-overflow.yaml @@ -6,4 +6,4 @@ category: Discovery description: Provides Stack Overflow specific functionality that can be used in different ways (e.g. for homepage and search) to compose your Backstage App. documentation: https://github.com/backstage/backstage/blob/master/plugins/stack-overflow iconUrl: img/stack-overflow-logo.svg -npmPackageName: '@backstage/plugin-adr' +npmPackageName: '@backstage/plugin-stack-overflow' From 12ae3eed2f873a53ef1f16207031a117533632ec Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Tue, 14 Jun 2022 16:42:37 +0200 Subject: [PATCH 099/590] add changeset Signed-off-by: Emma Indal --- .changeset/modern-ducks-lay.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/modern-ducks-lay.md diff --git a/.changeset/modern-ducks-lay.md b/.changeset/modern-ducks-lay.md new file mode 100644 index 0000000000..bd62c309ba --- /dev/null +++ b/.changeset/modern-ducks-lay.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-stack-overflow': patch +--- + +- Publicly exports `StackOverflowIcon`. +- `HomePageStackOverflowQuestions` accepts optional icon property. From b8409a0d972b7506da6921ee40d1877487564257 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 17:44:22 +0000 Subject: [PATCH 100/590] chore(deps): update dependency concurrently to v7.2.2 Signed-off-by: Renovate Bot --- yarn.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 43b5864306..66cb6493e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9772,14 +9772,14 @@ concurrently@6.5.1: yargs "^16.2.0" concurrently@^7.0.0: - version "7.2.1" - resolved "https://registry.npmjs.org/concurrently/-/concurrently-7.2.1.tgz#88b144060443403060aad46f837dd17451f7e55e" - integrity sha512-7cab/QyqipqghrVr9qZmoWbidu0nHsmxrpNqQ7r/67vfl1DWJElexehQnTH1p+87tDkihaAjM79xTZyBQh7HLw== + version "7.2.2" + resolved "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz#4ad4a4dfd3945f668d727379de2a29502e6a531c" + integrity sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw== dependencies: chalk "^4.1.0" date-fns "^2.16.1" lodash "^4.17.21" - rxjs "^6.6.3" + rxjs "^7.0.0" shell-quote "^1.7.3" spawn-command "^0.0.2-1" supports-color "^8.1.0" @@ -22260,7 +22260,7 @@ request@^2.88.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -22598,7 +22598,7 @@ run-script-webpack-plugin@^0.0.14: resolved "https://registry.npmjs.org/run-script-webpack-plugin/-/run-script-webpack-plugin-0.0.14.tgz#fe2362b32c1dab7a8af7a6f1246fc043690cedd7" integrity sha512-DXe6lzzEVXjBr/74zd4m4yOfmz5P6GMjzhQxDDsViOmwG7cap8UCE6RgD5rT7zf4wM83a+ToHnpB3v4efUv5IA== -rxjs@7.5.5, rxjs@^7.1.0, rxjs@^7.2.0, rxjs@^7.5.1, rxjs@^7.5.5: +rxjs@7.5.5, rxjs@^7.0.0, rxjs@^7.1.0, rxjs@^7.2.0, rxjs@^7.5.1, rxjs@^7.5.5: version "7.5.5" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== @@ -23361,7 +23361,7 @@ space-separated-tokens@^2.0.0: spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== spawndamnit@^2.0.0: version "2.0.0" From a7c0b34d706051b15dfb4f0d24f951ecf126870c Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Wed, 15 Jun 2022 13:22:47 -0400 Subject: [PATCH 101/590] refactor(ListTasksPage): swap MaterialTable with Table Signed-off-by: Phil Kuang --- .changeset/wicked-icons-grin.md | 5 +++++ plugins/scaffolder/package.json | 3 +-- .../src/components/ListTasksPage/ListTasksPage.tsx | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/wicked-icons-grin.md diff --git a/.changeset/wicked-icons-grin.md b/.changeset/wicked-icons-grin.md new file mode 100644 index 0000000000..8d26a9255e --- /dev/null +++ b/.changeset/wicked-icons-grin.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Swap usage of `MaterialTable` with `Table` from `core-components` diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 54824c7699..fd8161646c 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -49,15 +49,14 @@ "@backstage/plugin-scaffolder-common": "^1.1.1", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", - "@codemirror/legacy-modes": "^0.20.0", "@codemirror/language": "^0.20.0", + "@codemirror/legacy-modes": "^0.20.0", "@codemirror/view": "^0.20.2", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@react-hookz/web": "^13.0.0", "@rjsf/core": "^3.2.1", - "@material-table/core": "^3.1.0", "@rjsf/material-ui": "^3.2.1", "@types/json-schema": "^7.0.9", "@uiw/react-codemirror": "^4.7.0", diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx index d45d6f1ae7..0b00879d43 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx @@ -22,14 +22,15 @@ import { Link, Page, Progress, + Table, } from '@backstage/core-components'; import { useApi, useRouteRef } from '@backstage/core-plugin-api'; import { CatalogFilterLayout } from '@backstage/plugin-catalog-react'; import useAsync from 'react-use/lib/useAsync'; -import MaterialTable from '@material-table/core'; import React, { useState } from 'react'; import { scaffolderApiRef } from '../../api'; import { rootRouteRef } from '../../routes'; +import { ScaffolderTask } from '../../types'; import { OwnerListPicker } from './OwnerListPicker'; import { CreatedAtColumn, @@ -88,7 +89,7 @@ const ListTaskPageContent = (props: MyTaskPageProps) => { /> - data={value?.tasks ?? []} title="Tasks" columns={[ From d93c357018c17fcfb652968130643378d0807304 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 18:51:38 +0000 Subject: [PATCH 102/590] chore(deps): update graphqlcodegenerator monorepo Signed-off-by: Renovate Bot --- yarn.lock | 112 +++++++++++++++++++++++++++--------------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/yarn.lock b/yarn.lock index 66cb6493e2..a11a80e574 100644 --- a/yarn.lock +++ b/yarn.lock @@ -100,6 +100,29 @@ dependencies: xss "^1.0.8" +"@ardatan/relay-compiler@12.0.0": + version "12.0.0" + resolved "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" + integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + "@asyncapi/avro-schema-parser@^0.3.0": version "0.3.0" resolved "https://registry.npmjs.org/@asyncapi/avro-schema-parser/-/avro-schema-parser-0.3.0.tgz#6922acc559ef999c57e81297d78ffe680fc92b3c" @@ -2150,13 +2173,13 @@ tslib "~2.3.0" "@graphql-codegen/graphql-modules-preset@^2.3.2": - version "2.3.12" - resolved "https://registry.npmjs.org/@graphql-codegen/graphql-modules-preset/-/graphql-modules-preset-2.3.12.tgz#e2e128eaab2ca5600bb137c8fec9e3f52c5f243b" - integrity sha512-Xz5RsiythN/6ivt+9n43ciHWZ6ngUK1mpBBG/0EYISfUUVaTBLBVKoAhqPHcquqrsByppE0Nclw5sUuOLQUjiA== + version "2.3.13" + resolved "https://registry.npmjs.org/@graphql-codegen/graphql-modules-preset/-/graphql-modules-preset-2.3.13.tgz#181ab8acacf376c38d572d6d50aad609aba3cd3d" + integrity sha512-hi/vKUrVa62d5W2euSapUqTNf2ysfq4RjRc0Pcren7zPqMzD3QgbYRLjDtPsXXQntZDmDxoJVd1BEzjpPGD2/g== dependencies: "@graphql-codegen/plugin-helpers" "^2.4.0" - "@graphql-codegen/visitor-plugin-common" "2.9.0" - "@graphql-tools/utils" "8.6.12" + "@graphql-codegen/visitor-plugin-common" "2.9.1" + "@graphql-tools/utils" "8.6.13" change-case-all "1.0.14" parse-filepath "^1.0.2" tslib "~2.4.0" @@ -2183,36 +2206,36 @@ tslib "~2.3.0" "@graphql-codegen/typescript-resolvers@^2.4.3": - version "2.6.5" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.6.5.tgz#f22635ae76218dbc12c39d32f84a3979a791c764" - integrity sha512-vzREbHyiYHhy/C90V8HKnfD7hnJIeioqZIYssX9WTQ5pVHqdeO/k4Gbw9ljcFe4OsP5d9GFHzhtU+/GnQlCyaA== + version "2.6.6" + resolved "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-2.6.6.tgz#c42cabbc05103b44a29df5ac4a015f2a8e8ab4aa" + integrity sha512-6yVU0rojI64qZbAtGy4+5kA1xJbolcWbefd4y/nwLOn2g99QBHt9nQRCVl96rppfBNinLPkiJCtQ0thOHu9glg== dependencies: "@graphql-codegen/plugin-helpers" "^2.4.0" - "@graphql-codegen/typescript" "^2.5.0" - "@graphql-codegen/visitor-plugin-common" "2.9.0" + "@graphql-codegen/typescript" "^2.5.1" + "@graphql-codegen/visitor-plugin-common" "2.9.1" "@graphql-tools/utils" "^8.1.1" auto-bind "~4.0.0" tslib "~2.4.0" -"@graphql-codegen/typescript@^2.4.2", "@graphql-codegen/typescript@^2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.5.0.tgz#5ae121db92120fecb6badb34aa361ac464bc23d3" - integrity sha512-eCCebNyhV5NcNyfrNOdur1b4zPSyj2o89yaSliEMSShf4WolfFOv4aYpL4tFXjhkw3n2pR7MYFDUnrzmDpfmNw== +"@graphql-codegen/typescript@^2.4.2", "@graphql-codegen/typescript@^2.5.1": + version "2.5.1" + resolved "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.5.1.tgz#5131485ff3ac83d5bc0aae11a2af0c9bdc08854c" + integrity sha512-D/9V2VfVIE4Mu5UiMGQtxyFU5xe1ZkAZi8g/IsqymW8rqlhTwsGhtk4JR55qPfOYxR8G94RJSJpzgNakRneytw== dependencies: "@graphql-codegen/plugin-helpers" "^2.4.0" "@graphql-codegen/schema-ast" "^2.4.1" - "@graphql-codegen/visitor-plugin-common" "2.9.0" + "@graphql-codegen/visitor-plugin-common" "2.9.1" auto-bind "~4.0.0" tslib "~2.4.0" -"@graphql-codegen/visitor-plugin-common@2.9.0": - version "2.9.0" - resolved "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.9.0.tgz#a13556c805e72b63ee9d80fb437b9ba2eb0a9fa2" - integrity sha512-w353lPpXlgsQT6dxfcHw3hQdodGnfSwsxofHVfROqrIBZIjH0kNiFHOt8rnewYkLGEa75bWDVaM1ofyXEaN+3w== +"@graphql-codegen/visitor-plugin-common@2.9.1": + version "2.9.1" + resolved "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.9.1.tgz#17dfe33e19e846e7475ab9d4ff43de5130e18397" + integrity sha512-j9eGOSGt+sJcwv0ijhZiQ2cF/0ponscekNVoF+vHdOT4RB0qgOQxykPBk6EbKxIHECnkdV8ARdPVTA21A93/QQ== dependencies: "@graphql-codegen/plugin-helpers" "^2.4.0" "@graphql-tools/optimize" "^1.0.1" - "@graphql-tools/relay-operation-optimizer" "^6.3.7" + "@graphql-tools/relay-operation-optimizer" "^6.4.14" "@graphql-tools/utils" "^8.3.0" auto-bind "~4.0.0" change-case-all "1.0.14" @@ -2390,14 +2413,14 @@ tslib "~2.3.0" yaml-ast-parser "^0.0.43" -"@graphql-tools/relay-operation-optimizer@^6.3.7": - version "6.4.9" - resolved "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.4.9.tgz#f3e1960ac8e6429a09156836701a03ebf523f0e1" - integrity sha512-fHMR1bNyx+ryBnmtXWnYmxvQLEx0O3yIG0MTVB1Mp6GlsyKTGI3O9njvjv0EI2JmCszs1uakT/6BW0LO37E6tQ== +"@graphql-tools/relay-operation-optimizer@^6.4.14": + version "6.4.14" + resolved "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.4.14.tgz#812f32123a1351615a72b4e832852daac7bd64b3" + integrity sha512-vqch2M/sIUfMmlRJ4eCupiHlVPXWOPVpHX9yCZwRrpNg0Eaokyc57NSjJuKVV3KcvcJKf03qfMK2PxFbfDvN9A== dependencies: - "@graphql-tools/utils" "8.6.9" - relay-compiler "12.0.0" - tslib "~2.3.0" + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "8.6.13" + tslib "^2.4.0" "@graphql-tools/schema@8.3.10", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.1.1", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.3.1": version "8.3.10" @@ -2431,12 +2454,12 @@ value-or-promise "^1.0.11" ws "^8.3.0" -"@graphql-tools/utils@8.6.12": - version "8.6.12" - resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.12.tgz#0a550dc0331fd9b097fe7223d65cbbee720556e4" - integrity sha512-WQ91O40RC+UJgZ9K+IzevSf8oolR1QE+WQ21Oyc2fgDYYiqT0eSf+HVyhZr/8x9rVjn3N9HeqCsywbdmbljg0w== +"@graphql-tools/utils@8.6.13": + version "8.6.13" + resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.13.tgz#2b4fb7f9f8a29b25eecd44551fb95974de32f969" + integrity sha512-FiVqrQzj4cgz0HcZ3CxUs8NtBGPZFpmsVyIgwmL6YCwIhjJQnT72h8G3/vk5zVfjfesht85YGp0inWWuoCKWzg== dependencies: - tslib "~2.4.0" + tslib "^2.4.0" "@graphql-tools/utils@8.6.9", "@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.5.2", "@graphql-tools/utils@^8.6.0": version "8.6.9" @@ -22095,29 +22118,6 @@ relateurl@^0.2.7: resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -relay-compiler@12.0.0: - version "12.0.0" - resolved "https://registry.npmjs.org/relay-compiler/-/relay-compiler-12.0.0.tgz#9f292d483fb871976018704138423a96c8a45439" - integrity sha512-SWqeSQZ+AMU/Cr7iZsHi1e78Z7oh00I5SvR092iCJq79aupqJ6Ds+I1Pz/Vzo5uY5PY0jvC4rBJXzlIN5g9boQ== - dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/runtime" "^7.0.0" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - babel-preset-fbjs "^3.4.0" - chalk "^4.0.0" - fb-watchman "^2.0.0" - fbjs "^3.0.0" - glob "^7.1.1" - immutable "~3.7.6" - invariant "^2.2.4" - nullthrows "^1.1.1" - relay-runtime "12.0.0" - signedsource "^1.0.0" - yargs "^15.3.1" - relay-runtime@12.0.0: version "12.0.0" resolved "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" @@ -24776,7 +24776,7 @@ tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@~2.4.0: +tslib@^2.1.0, tslib@^2.4.0, tslib@~2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== From 0791af993f7eb861c2b73d781d39aedd9cce6d75 Mon Sep 17 00:00:00 2001 From: Matthew Clarke Date: Wed, 15 Jun 2022 15:18:35 -0400 Subject: [PATCH 103/590] refactor: prepare kubernetes backend fan out handler for new endpoint (#11952) * refactor: prepare kubernetes backend fan out handler for new endpoint Signed-off-by: Matthew Clarke * add changeset Signed-off-by: Matthew Clarke * PR api report feedback Signed-off-by: Matthew Clarke * update api docs Signed-off-by: Matthew Clarke * fix api report warnings Signed-off-by: Matthew Clarke --- .changeset/short-olives-train.md | 6 + plugins/kubernetes-backend/api-report.md | 119 +++++------- .../GoogleKubernetesAuthTranslator.ts | 6 +- .../KubernetesAuthTranslatorGenerator.test.ts | 6 +- .../KubernetesAuthTranslatorGenerator.ts | 4 +- ...tor.ts => NoopKubernetesAuthTranslator.ts} | 6 +- .../OidcKubernetesAuthTranslator.test.ts | 15 +- .../OidcKubernetesAuthTranslator.ts | 7 +- .../src/kubernetes-auth-translator/types.ts | 4 +- .../MultiTenantServiceLocator.test.ts | 55 +++--- .../MultiTenantServiceLocator.ts | 8 +- .../src/service/KubernetesBuilder.test.ts | 17 +- .../src/service/KubernetesBuilder.ts | 17 +- .../service/KubernetesFanOutHandler.test.ts | 172 ++++++++++-------- .../src/service/KubernetesFanOutHandler.ts | 101 +++++++--- .../kubernetes-backend/src/service/router.ts | 6 + plugins/kubernetes-backend/src/types/types.ts | 110 ++++++++++- plugins/kubernetes-common/api-report.md | 19 +- plugins/kubernetes-common/src/types.ts | 14 +- 19 files changed, 430 insertions(+), 262 deletions(-) create mode 100644 .changeset/short-olives-train.md rename plugins/kubernetes-backend/src/kubernetes-auth-translator/{ServiceAccountKubernetesAuthTranslator.ts => NoopKubernetesAuthTranslator.ts} (80%) diff --git a/.changeset/short-olives-train.md b/.changeset/short-olives-train.md new file mode 100644 index 0000000000..594d95f073 --- /dev/null +++ b/.changeset/short-olives-train.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': minor +'@backstage/plugin-kubernetes-common': minor +--- + +Refactor `KubernetesObjectsProvider` with new methods, `KubernetesServiceLocator` now takes an `Entity` instead of `serviceId` diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index be81b4d5dd..41748f240b 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -5,18 +5,18 @@ ```ts import { Config } from '@backstage/config'; import { Duration } from 'luxon'; +import { Entity } from '@backstage/catalog-model'; import express from 'express'; import type { FetchResponse } from '@backstage/plugin-kubernetes-common'; import type { JsonObject } from '@backstage/types'; import type { KubernetesFetchError } from '@backstage/plugin-kubernetes-common'; +import type { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; import type { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { Logger } from 'winston'; import type { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; import { PodStatus } from '@kubernetes/client-node/dist/top'; -// Warning: (ae-missing-release-tag) "AWSClusterDetails" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface AWSClusterDetails extends ClusterDetails { // (undocumented) assumeRole?: string; @@ -24,14 +24,10 @@ export interface AWSClusterDetails extends ClusterDetails { externalId?: string; } -// Warning: (ae-missing-release-tag) "AzureClusterDetails" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface AzureClusterDetails extends ClusterDetails {} -// Warning: (ae-missing-release-tag) "ClusterDetails" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface ClusterDetails { // (undocumented) authProvider: string; @@ -51,27 +47,28 @@ export interface ClusterDetails { url: string; } -// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public @deprecated +// @alpha @deprecated export function createRouter(options: RouterOptions): Promise; -// Warning: (ae-missing-release-tag) "CustomResource" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface CustomResource extends ObjectToFetch { // (undocumented) objectType: 'customresources'; } -// Warning: (ae-missing-release-tag) "DEFAULT_OBJECTS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) +export type CustomResourceMatcher = Omit; + +// @alpha (undocumented) +export interface CustomResourcesByEntity extends KubernetesObjectsByEntity { + // (undocumented) + customResources: CustomResourceMatcher[]; +} + +// @alpha (undocumented) export const DEFAULT_OBJECTS: ObjectToFetch[]; -// Warning: (ae-missing-release-tag) "FetchResponseWrapper" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface FetchResponseWrapper { // (undocumented) errors: KubernetesFetchError[]; @@ -79,14 +76,10 @@ export interface FetchResponseWrapper { responses: FetchResponse[]; } -// Warning: (ae-missing-release-tag) "GKEClusterDetails" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface GKEClusterDetails extends ClusterDetails {} -// Warning: (ae-missing-release-tag) "KubernetesBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export class KubernetesBuilder { constructor(env: KubernetesEnvironment); // (undocumented) @@ -145,7 +138,7 @@ export class KubernetesBuilder { setServiceLocator(serviceLocator?: KubernetesServiceLocator): this; } -// @public +// @alpha export type KubernetesBuilderReturn = Promise<{ router: express.Router; clusterSupplier: KubernetesClustersSupplier; @@ -155,16 +148,12 @@ export type KubernetesBuilderReturn = Promise<{ serviceLocator: KubernetesServiceLocator; }>; -// Warning: (ae-missing-release-tag) "KubernetesClustersSupplier" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha export interface KubernetesClustersSupplier { getClusters(): Promise; } -// Warning: (ae-missing-release-tag) "KubernetesEnvironment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface KubernetesEnvironment { // (undocumented) config: Config; @@ -172,9 +161,7 @@ export interface KubernetesEnvironment { logger: Logger; } -// Warning: (ae-missing-release-tag) "KubernetesFetcher" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha export interface KubernetesFetcher { // (undocumented) fetchObjectsForService( @@ -187,19 +174,27 @@ export interface KubernetesFetcher { ): Promise; } -// Warning: (ae-missing-release-tag) "KubernetesObjectsProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) +export interface KubernetesObjectsByEntity { + // (undocumented) + auth: KubernetesRequestAuth; + // (undocumented) + entity: Entity; +} + +// @alpha (undocumented) export interface KubernetesObjectsProvider { + // (undocumented) + getCustomResourcesByEntity( + customResourcesByEntity: CustomResourcesByEntity, + ): Promise; // (undocumented) getKubernetesObjectsByEntity( - request: ObjectsByEntityRequest, + kubernetesObjectsByEntity: KubernetesObjectsByEntity, ): Promise; } -// Warning: (ae-missing-release-tag) "KubernetesObjectsProviderOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface KubernetesObjectsProviderOptions { // (undocumented) customResources: CustomResource[]; @@ -213,9 +208,7 @@ export interface KubernetesObjectsProviderOptions { serviceLocator: KubernetesServiceLocator; } -// Warning: (ae-missing-release-tag) "KubernetesObjectTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export type KubernetesObjectTypes = | 'pods' | 'services' @@ -229,17 +222,15 @@ export type KubernetesObjectTypes = | 'customresources' | 'statefulsets'; -// Warning: (ae-missing-release-tag) "KubernetesServiceLocator" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha export interface KubernetesServiceLocator { // (undocumented) - getClustersByServiceId(serviceId: string): Promise; + getClustersByEntity(entity: Entity): Promise<{ + clusters: ClusterDetails[]; + }>; } -// Warning: (ae-missing-release-tag) "ObjectFetchParams" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface ObjectFetchParams { // (undocumented) clusterDetails: @@ -259,14 +250,10 @@ export interface ObjectFetchParams { serviceId: string; } -// Warning: (ae-missing-release-tag) "ObjectsByEntityRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export type ObjectsByEntityRequest = KubernetesRequestBody; -// Warning: (ae-missing-release-tag) "ObjectToFetch" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface ObjectToFetch { // (undocumented) apiVersion: string; @@ -278,9 +265,7 @@ export interface ObjectToFetch { plural: string; } -// Warning: (ae-missing-release-tag) "RouterOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface RouterOptions { // (undocumented) clusterSupplier?: KubernetesClustersSupplier; @@ -290,13 +275,9 @@ export interface RouterOptions { logger: Logger; } -// Warning: (ae-missing-release-tag) "ServiceAccountClusterDetails" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export interface ServiceAccountClusterDetails extends ClusterDetails {} -// Warning: (ae-missing-release-tag) "ServiceLocatorMethod" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @alpha (undocumented) export type ServiceLocatorMethod = 'multiTenant' | 'http'; ``` diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/GoogleKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/GoogleKubernetesAuthTranslator.ts index 8c74945ec7..741e6b2533 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/GoogleKubernetesAuthTranslator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/GoogleKubernetesAuthTranslator.ts @@ -16,20 +16,20 @@ import { KubernetesAuthTranslator } from './types'; import { GKEClusterDetails } from '../types/types'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; export class GoogleKubernetesAuthTranslator implements KubernetesAuthTranslator { async decorateClusterDetailsWithAuth( clusterDetails: GKEClusterDetails, - requestBody: KubernetesRequestBody, + authConfig: KubernetesRequestAuth, ): Promise { const clusterDetailsWithAuthToken: GKEClusterDetails = Object.assign( {}, clusterDetails, ); - const authToken: string | undefined = requestBody.auth?.google; + const authToken: string | undefined = authConfig.google; if (authToken) { clusterDetailsWithAuthToken.serviceAccountToken = authToken; diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts index 123b05456c..f8abdde9cf 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.test.ts @@ -17,7 +17,7 @@ import { KubernetesAuthTranslator } from './types'; import { GoogleKubernetesAuthTranslator } from './GoogleKubernetesAuthTranslator'; import { KubernetesAuthTranslatorGenerator } from './KubernetesAuthTranslatorGenerator'; -import { ServiceAccountKubernetesAuthTranslator } from './ServiceAccountKubernetesAuthTranslator'; +import { NoopKubernetesAuthTranslator } from './NoopKubernetesAuthTranslator'; import { AwsIamKubernetesAuthTranslator } from './AwsIamKubernetesAuthTranslator'; import { OidcKubernetesAuthTranslator } from './OidcKubernetesAuthTranslator'; import { getVoidLogger } from '@backstage/backend-common'; @@ -42,9 +42,7 @@ describe('getKubernetesAuthTranslatorInstance', () => { it('can return an auth translator for serviceAccount auth', () => { const authTranslator: KubernetesAuthTranslator = sut.getKubernetesAuthTranslatorInstance('serviceAccount', { logger }); - expect( - authTranslator instanceof ServiceAccountKubernetesAuthTranslator, - ).toBe(true); + expect(authTranslator instanceof NoopKubernetesAuthTranslator).toBe(true); }); it('can return an auth translator for oidc auth', () => { diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts index fa69ad42b5..c2df3e6c23 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/KubernetesAuthTranslatorGenerator.ts @@ -17,7 +17,7 @@ import { Logger } from 'winston'; import { KubernetesAuthTranslator } from './types'; import { GoogleKubernetesAuthTranslator } from './GoogleKubernetesAuthTranslator'; -import { ServiceAccountKubernetesAuthTranslator } from './ServiceAccountKubernetesAuthTranslator'; +import { NoopKubernetesAuthTranslator } from './NoopKubernetesAuthTranslator'; import { AwsIamKubernetesAuthTranslator } from './AwsIamKubernetesAuthTranslator'; import { GoogleServiceAccountAuthTranslator } from './GoogleServiceAccountAuthProvider'; import { AzureIdentityKubernetesAuthTranslator } from './AzureIdentityKubernetesAuthTranslator'; @@ -41,7 +41,7 @@ export class KubernetesAuthTranslatorGenerator { return new AzureIdentityKubernetesAuthTranslator(options.logger); } case 'serviceAccount': { - return new ServiceAccountKubernetesAuthTranslator(); + return new NoopKubernetesAuthTranslator(); } case 'googleServiceAccount': { return new GoogleServiceAccountAuthTranslator(); diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/ServiceAccountKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/NoopKubernetesAuthTranslator.ts similarity index 80% rename from plugins/kubernetes-backend/src/kubernetes-auth-translator/ServiceAccountKubernetesAuthTranslator.ts rename to plugins/kubernetes-backend/src/kubernetes-auth-translator/NoopKubernetesAuthTranslator.ts index ec90f82c91..d68b1a4365 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/ServiceAccountKubernetesAuthTranslator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/NoopKubernetesAuthTranslator.ts @@ -16,14 +16,10 @@ import { KubernetesAuthTranslator } from './types'; import { ServiceAccountClusterDetails } from '../types/types'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; -export class ServiceAccountKubernetesAuthTranslator - implements KubernetesAuthTranslator -{ +export class NoopKubernetesAuthTranslator implements KubernetesAuthTranslator { async decorateClusterDetailsWithAuth( clusterDetails: ServiceAccountClusterDetails, - _requestBody: KubernetesRequestBody, ): Promise { return clusterDetails; } diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.test.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.test.ts index 9f983aedc3..68f24bd020 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.test.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.test.ts @@ -16,15 +16,9 @@ import { OidcKubernetesAuthTranslator } from './OidcKubernetesAuthTranslator'; import { ClusterDetails } from '../types/types'; -import { Entity } from '@backstage/catalog-model'; describe('OidcKubernetesAuthTranslator tests', () => { const at = new OidcKubernetesAuthTranslator(); - const entity: Entity = { - apiVersion: 'v1', - kind: 'service', - metadata: { name: 'test' }, - }; const baseClusterDetails: ClusterDetails = { name: 'test', authProvider: 'oidc', @@ -38,10 +32,7 @@ describe('OidcKubernetesAuthTranslator tests', () => { ...baseClusterDetails, }, { - auth: { - oidc: { okta: 'fakeToken' }, - }, - entity, + oidc: { okta: 'fakeToken' }, }, ); @@ -50,7 +41,7 @@ describe('OidcKubernetesAuthTranslator tests', () => { it('returns error when oidcTokenProvider is not configured', async () => { await expect( - at.decorateClusterDetailsWithAuth(baseClusterDetails, { entity }), + at.decorateClusterDetailsWithAuth(baseClusterDetails, {}), ).rejects.toThrow( 'oidc authProvider requires a configured oidcTokenProvider', ); @@ -60,7 +51,7 @@ describe('OidcKubernetesAuthTranslator tests', () => { await expect( at.decorateClusterDetailsWithAuth( { oidcTokenProvider: 'okta', ...baseClusterDetails }, - { entity }, + {}, ), ).rejects.toThrow('Auth token not found under oidc.okta in request body'); }); diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.ts index c53269abf3..8ca546a25b 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/OidcKubernetesAuthTranslator.ts @@ -16,12 +16,12 @@ import { KubernetesAuthTranslator } from './types'; import { ClusterDetails } from '../types/types'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; export class OidcKubernetesAuthTranslator implements KubernetesAuthTranslator { async decorateClusterDetailsWithAuth( clusterDetails: ClusterDetails, - requestBody: KubernetesRequestBody, + authConfig: KubernetesRequestAuth, ): Promise { const clusterDetailsWithAuthToken: ClusterDetails = Object.assign( {}, @@ -36,8 +36,7 @@ export class OidcKubernetesAuthTranslator implements KubernetesAuthTranslator { ); } - const authToken: string | undefined = - requestBody.auth?.oidc?.[oidcTokenProvider]; + const authToken: string | undefined = authConfig.oidc?.[oidcTokenProvider]; if (authToken) { clusterDetailsWithAuthToken.serviceAccountToken = authToken; diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/types.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/types.ts index f14ba877b7..640a20303e 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/types.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/types.ts @@ -15,11 +15,11 @@ */ import { ClusterDetails } from '../types/types'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import { KubernetesRequestAuth } from '@backstage/plugin-kubernetes-common'; export interface KubernetesAuthTranslator { decorateClusterDetailsWithAuth( clusterDetails: ClusterDetails, - requestBody: KubernetesRequestBody, + authConfig: KubernetesRequestAuth, ): Promise; } diff --git a/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.test.ts b/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.test.ts index 0dce2305bf..2ead460848 100644 --- a/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.test.ts +++ b/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.test.ts @@ -15,6 +15,7 @@ */ import '@backstage/backend-common'; +import { Entity } from '@backstage/catalog-model'; import { MultiTenantServiceLocator } from './MultiTenantServiceLocator'; describe('MultiTenantConfigClusterLocator', () => { @@ -23,9 +24,9 @@ describe('MultiTenantConfigClusterLocator', () => { getClusters: async () => [], }); - const result = await sut.getClustersByServiceId('ignored'); + const result = await sut.getClustersByEntity({} as Entity); - expect(result).toStrictEqual([]); + expect(result).toStrictEqual({ clusters: [] }); }); it('one clusters returns one cluster details', async () => { @@ -42,16 +43,18 @@ describe('MultiTenantConfigClusterLocator', () => { }, }); - const result = await sut.getClustersByServiceId('ignored'); + const result = await sut.getClustersByEntity({} as Entity); - expect(result).toStrictEqual([ - { - name: 'cluster1', - serviceAccountToken: '12345', - url: 'http://localhost:8080', - authProvider: 'serviceAccount', - }, - ]); + expect(result).toStrictEqual({ + clusters: [ + { + name: 'cluster1', + serviceAccountToken: '12345', + url: 'http://localhost:8080', + authProvider: 'serviceAccount', + }, + ], + }); }); it('two clusters returns two cluster details', async () => { @@ -73,20 +76,22 @@ describe('MultiTenantConfigClusterLocator', () => { }, }); - const result = await sut.getClustersByServiceId('ignored'); + const result = await sut.getClustersByEntity({} as Entity); - expect(result).toStrictEqual([ - { - name: 'cluster1', - serviceAccountToken: 'token', - url: 'http://localhost:8080', - authProvider: 'serviceAccount', - }, - { - name: 'cluster2', - url: 'http://localhost:8081', - authProvider: 'google', - }, - ]); + expect(result).toStrictEqual({ + clusters: [ + { + name: 'cluster1', + serviceAccountToken: 'token', + url: 'http://localhost:8080', + authProvider: 'serviceAccount', + }, + { + name: 'cluster2', + url: 'http://localhost:8081', + authProvider: 'google', + }, + ], + }); }); }); diff --git a/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.ts b/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.ts index 30c66a38d1..7bafbb10f3 100644 --- a/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.ts +++ b/plugins/kubernetes-backend/src/service-locator/MultiTenantServiceLocator.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { Entity } from '@backstage/catalog-model'; import { ClusterDetails, KubernetesClustersSupplier, @@ -30,8 +31,9 @@ export class MultiTenantServiceLocator implements KubernetesServiceLocator { } // As this implementation always returns all clusters serviceId is ignored here - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async getClustersByServiceId(_serviceId: string): Promise { - return this.clusterSupplier.getClusters(); + getClustersByEntity( + _entity: Entity, + ): Promise<{ clusters: ClusterDetails[] }> { + return this.clusterSupplier.getClusters().then(clusters => ({ clusters })); } } diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts index 37dad8c3e4..ecaf9f3095 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts @@ -15,6 +15,7 @@ */ import { getVoidLogger } from '@backstage/backend-common'; +import { Entity } from '@backstage/catalog-model'; import { Config, ConfigReader } from '@backstage/config'; import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; import express from 'express'; @@ -207,8 +208,10 @@ describe('KubernetesBuilder', () => { }; const serviceLocator: KubernetesServiceLocator = { - getClustersByServiceId(_serviceId: string): Promise { - return Promise.resolve([someCluster]); + getClustersByEntity( + _entity: Entity, + ): Promise<{ clusters: ClusterDetails[] }> { + return Promise.resolve({ clusters: [someCluster] }); }, }; @@ -244,7 +247,15 @@ describe('KubernetesBuilder', () => { .build(); app = express().use(router); - const response = await request(app).post('/services/test-service'); + const response = await request(app) + .post('/services/test-service') + .send({ + entity: { + metadata: { + name: 'thing', + }, + }, + }); expect(response.body).toEqual(result); expect(response.status).toEqual(200); diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts index 18c3fdc931..1b058752c9 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts @@ -38,6 +38,10 @@ import { } from './KubernetesFanOutHandler'; import { KubernetesClientBasedFetcher } from './KubernetesFetcher'; +/** + * + * @alpha + */ export interface KubernetesEnvironment { logger: Logger; config: Config; @@ -46,7 +50,7 @@ export interface KubernetesEnvironment { /** * The return type of the `KubernetesBuilder.build` method * - * @public + * @alpha */ export type KubernetesBuilderReturn = Promise<{ router: express.Router; @@ -57,6 +61,10 @@ export type KubernetesBuilderReturn = Promise<{ serviceLocator: KubernetesServiceLocator; }>; +/** + * + * @alpha + */ export class KubernetesBuilder { private clusterSupplier?: KubernetesClustersSupplier; private defaultClusterRefreshInterval: Duration = Duration.fromObject({ @@ -227,9 +235,10 @@ export class KubernetesBuilder { const serviceId = req.params.serviceId; const requestBody: ObjectsByEntityRequest = req.body; try { - const response = await objectsProvider.getKubernetesObjectsByEntity( - requestBody, - ); + const response = await objectsProvider.getKubernetesObjectsByEntity({ + entity: requestBody.entity, + auth: requestBody.auth || {}, + }); res.json(response); } catch (e) { logger.error( diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index da8f703ba0..176498839d 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -22,7 +22,7 @@ import { PodStatus } from '@kubernetes/client-node/dist/top'; const fetchObjectsForService = jest.fn(); const fetchPodMetricsByNamespace = jest.fn(); -const getClustersByServiceId = jest.fn(); +const getClustersByEntity = jest.fn(); const POD_METRICS_FIXTURE = { containers: [], @@ -166,13 +166,15 @@ describe('handleGetKubernetesObjectsForService', () => { }); it('retrieve objects for one cluster', async () => { - getClustersByServiceId.mockImplementation(() => - Promise.resolve([ - { - name: 'test-cluster', - authProvider: 'serviceAccount', - }, - ]), + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + ], + }), ); mockFetch(fetchObjectsForService); @@ -185,7 +187,7 @@ describe('handleGetKubernetesObjectsForService', () => { fetchPodMetricsByNamespace, }, serviceLocator: { - getClustersByServiceId, + getClustersByEntity, }, customResources: [], }); @@ -207,9 +209,10 @@ describe('handleGetKubernetesObjectsForService', () => { owner: 'joe', }, }, + auth: {}, }); - expect(getClustersByServiceId.mock.calls.length).toBe(1); + expect(getClustersByEntity.mock.calls.length).toBe(1); expect(fetchObjectsForService.mock.calls.length).toBe(1); expect(fetchPodMetricsByNamespace.mock.calls.length).toBe(1); expect(fetchPodMetricsByNamespace.mock.calls[0][1]).toBe( @@ -265,13 +268,15 @@ describe('handleGetKubernetesObjectsForService', () => { }); it('dont call top for the same namespace twice', async () => { - getClustersByServiceId.mockImplementation(() => - Promise.resolve([ - { - name: 'test-cluster', - authProvider: 'serviceAccount', - }, - ]), + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + ], + }), ); fetchObjectsForService.mockImplementation((_: ObjectFetchParams) => @@ -314,7 +319,7 @@ describe('handleGetKubernetesObjectsForService', () => { fetchPodMetricsByNamespace, }, serviceLocator: { - getClustersByServiceId, + getClustersByEntity, }, customResources: [], }); @@ -336,9 +341,10 @@ describe('handleGetKubernetesObjectsForService', () => { owner: 'joe', }, }, + auth: {}, }); - expect(getClustersByServiceId.mock.calls.length).toBe(1); + expect(getClustersByEntity.mock.calls.length).toBe(1); expect(fetchObjectsForService.mock.calls.length).toBe(1); expect(fetchPodMetricsByNamespace.mock.calls.length).toBe(2); expect(fetchPodMetricsByNamespace.mock.calls[0][1]).toBe('ns-a'); @@ -383,18 +389,20 @@ describe('handleGetKubernetesObjectsForService', () => { }); it('retrieve objects for two clusters', async () => { - getClustersByServiceId.mockImplementation(() => - Promise.resolve([ - { - name: 'test-cluster', - authProvider: 'serviceAccount', - dashboardUrl: 'https://k8s.foo.coom', - }, - { - name: 'other-cluster', - authProvider: 'google', - }, - ]), + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + dashboardUrl: 'https://k8s.foo.coom', + }, + { + name: 'other-cluster', + authProvider: 'google', + }, + ], + }), ); mockFetch(fetchObjectsForService); @@ -407,15 +415,12 @@ describe('handleGetKubernetesObjectsForService', () => { fetchPodMetricsByNamespace, }, serviceLocator: { - getClustersByServiceId, + getClustersByEntity, }, customResources: [], }); const result = await sut.getKubernetesObjectsByEntity({ - auth: { - google: 'google_token_123', - }, entity: { apiVersion: 'backstage.io/v1beta1', kind: 'Component', @@ -432,9 +437,12 @@ describe('handleGetKubernetesObjectsForService', () => { owner: 'joe', }, }, + auth: { + google: 'google_token_123', + }, }); - expect(getClustersByServiceId.mock.calls.length).toBe(1); + expect(getClustersByEntity.mock.calls.length).toBe(1); expect(fetchObjectsForService.mock.calls.length).toBe(2); expect(result).toStrictEqual({ items: [ @@ -527,21 +535,23 @@ describe('handleGetKubernetesObjectsForService', () => { }); }); it('retrieve objects for three clusters, only two have resources and show in ui', async () => { - getClustersByServiceId.mockImplementation(() => - Promise.resolve([ - { - name: 'test-cluster', - authProvider: 'serviceAccount', - }, - { - name: 'other-cluster', - authProvider: 'google', - }, - { - name: 'empty-cluster', - authProvider: 'google', - }, - ]), + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + { + name: 'other-cluster', + authProvider: 'google', + }, + { + name: 'empty-cluster', + authProvider: 'google', + }, + ], + }), ); mockFetch(fetchObjectsForService); @@ -554,15 +564,12 @@ describe('handleGetKubernetesObjectsForService', () => { fetchPodMetricsByNamespace, }, serviceLocator: { - getClustersByServiceId, + getClustersByEntity, }, customResources: [], }); const result = await sut.getKubernetesObjectsByEntity({ - auth: { - google: 'google_token_123', - }, entity: { apiVersion: 'backstage.io/v1beta1', kind: 'Component', @@ -579,9 +586,12 @@ describe('handleGetKubernetesObjectsForService', () => { owner: 'joe', }, }, + auth: { + google: 'google_token_123', + }, }); - expect(getClustersByServiceId.mock.calls.length).toBe(1); + expect(getClustersByEntity.mock.calls.length).toBe(1); expect(fetchObjectsForService.mock.calls.length).toBe(3); expect(result).toStrictEqual({ items: [ @@ -673,25 +683,27 @@ describe('handleGetKubernetesObjectsForService', () => { }); }); it('retrieve objects for four clusters, two have resources and one error cluster', async () => { - getClustersByServiceId.mockImplementation(() => - Promise.resolve([ - { - name: 'test-cluster', - authProvider: 'serviceAccount', - }, - { - name: 'other-cluster', - authProvider: 'google', - }, - { - name: 'empty-cluster', - authProvider: 'google', - }, - { - name: 'error-cluster', - authProvider: 'google', - }, - ]), + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + { + name: 'other-cluster', + authProvider: 'google', + }, + { + name: 'empty-cluster', + authProvider: 'google', + }, + { + name: 'error-cluster', + authProvider: 'google', + }, + ], + }), ); mockFetch(fetchObjectsForService); @@ -704,15 +716,12 @@ describe('handleGetKubernetesObjectsForService', () => { fetchPodMetricsByNamespace, }, serviceLocator: { - getClustersByServiceId, + getClustersByEntity, }, customResources: [], }); const result = await sut.getKubernetesObjectsByEntity({ - auth: { - google: 'google_token_123', - }, entity: { apiVersion: 'backstage.io/v1beta1', kind: 'Component', @@ -729,9 +738,12 @@ describe('handleGetKubernetesObjectsForService', () => { owner: 'joe', }, }, + auth: { + google: 'google_token_123', + }, }); - expect(getClustersByServiceId.mock.calls.length).toBe(1); + expect(getClustersByEntity.mock.calls.length).toBe(1); expect(fetchObjectsForService.mock.calls.length).toBe(4); expect(result).toStrictEqual({ items: [ diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 427165e4f1..ac2ffaf2ed 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -14,16 +14,20 @@ * limitations under the License. */ +import { Entity } from '@backstage/catalog-model'; import { Logger } from 'winston'; import { ClusterDetails, - CustomResource, KubernetesFetcher, KubernetesObjectsProviderOptions, KubernetesServiceLocator, ObjectsByEntityRequest, FetchResponseWrapper, ObjectToFetch, + CustomResource, + CustomResourceMatcher, + CustomResourcesByEntity, + KubernetesObjectsByEntity, } from '../types/types'; import { KubernetesAuthTranslator } from '../kubernetes-auth-translator/types'; import { KubernetesAuthTranslatorGenerator } from '../kubernetes-auth-translator/KubernetesAuthTranslatorGenerator'; @@ -35,6 +39,7 @@ import { FetchResponse, ObjectsByEntityResponse, PodFetchResponse, + KubernetesRequestAuth, } from '@backstage/plugin-kubernetes-common'; import { ContainerStatus, @@ -42,6 +47,10 @@ import { PodStatus, } from '@kubernetes/client-node'; +/** + * + * @alpha + */ export const DEFAULT_OBJECTS: ObjectToFetch[] = [ { group: '', @@ -178,26 +187,44 @@ export class KubernetesFanOutHandler { this.authTranslators = {}; } - async getKubernetesObjectsByEntity( - requestBody: KubernetesRequestBody, - ): Promise { - const entityName = - requestBody.entity?.metadata?.annotations?.[ - 'backstage.io/kubernetes-id' - ] || requestBody.entity?.metadata?.name; - - const clusterDetails: ClusterDetails[] = - await this.serviceLocator.getClustersByServiceId(entityName); - - // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them - const promises: Promise[] = clusterDetails.map(cd => { - return this.getAuthTranslator( - cd.authProvider, - ).decorateClusterDetailsWithAuth(cd, requestBody); - }); - const clusterDetailsDecoratedForAuth: ClusterDetails[] = await Promise.all( - promises, + async getCustomResourcesByEntity({ + entity, + auth, + customResources, + }: CustomResourcesByEntity): Promise { + // Don't fetch the default object types only the provided custom resources + return this.fanOutRequests( + entity, + auth, + new Set(), + customResources, ); + } + + async getKubernetesObjectsByEntity({ + entity, + auth, + }: KubernetesObjectsByEntity): Promise { + return this.fanOutRequests( + entity, + auth, + this.objectTypesToFetch, + this.customResources, + ); + } + + private async fanOutRequests( + entity: Entity, + auth: KubernetesRequestAuth, + objectTypesToFetch: Set, + customResources: CustomResourceMatcher[], + ) { + const entityName = + entity.metadata?.annotations?.['backstage.io/kubernetes-id'] || + entity.metadata?.name; + + const clusterDetailsDecoratedForAuth: ClusterDetails[] = + await this.decorateClusterDetailsWithAuth(entity, auth); this.logger.info( `entity.metadata.name=${entityName} clusterDetails=[${clusterDetailsDecoratedForAuth @@ -206,14 +233,12 @@ export class KubernetesFanOutHandler { ); const labelSelector: string = - requestBody.entity?.metadata?.annotations?.[ + entity.metadata?.annotations?.[ 'backstage.io/kubernetes-label-selector' ] || `backstage.io/kubernetes-id=${entityName}`; const namespace = - requestBody.entity?.metadata?.annotations?.[ - 'backstage.io/kubernetes-namespace' - ]; + entity.metadata?.annotations?.['backstage.io/kubernetes-namespace']; return Promise.all( clusterDetailsDecoratedForAuth.map(clusterDetailsItem => { @@ -221,9 +246,12 @@ export class KubernetesFanOutHandler { .fetchObjectsForService({ serviceId: entityName, clusterDetails: clusterDetailsItem, - objectTypesToFetch: this.objectTypesToFetch, + objectTypesToFetch: objectTypesToFetch, labelSelector, - customResources: this.customResources, + customResources: customResources.map(c => ({ + ...c, + objectType: 'customresources', + })), namespace, }) .then(result => this.getMetricsForPods(clusterDetailsItem, result)) @@ -232,6 +260,27 @@ export class KubernetesFanOutHandler { ).then(this.toObjectsByEntityResponse); } + private async decorateClusterDetailsWithAuth( + entity: Entity, + auth: KubernetesRequestAuth, + ) { + const clusterDetails: ClusterDetails[] = await ( + await this.serviceLocator.getClustersByEntity(entity) + ).clusters; + + // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them + return await Promise.all( + clusterDetails.map(cd => { + const kubernetesAuthTranslator: KubernetesAuthTranslator = + this.getAuthTranslator(cd.authProvider); + return kubernetesAuthTranslator.decorateClusterDetailsWithAuth( + cd, + auth, + ); + }), + ); + } + toObjectsByEntityResponse( clusterObjects: ClusterObjects[], ): ObjectsByEntityResponse { diff --git a/plugins/kubernetes-backend/src/service/router.ts b/plugins/kubernetes-backend/src/service/router.ts index 61082267be..7bd7cca8a9 100644 --- a/plugins/kubernetes-backend/src/service/router.ts +++ b/plugins/kubernetes-backend/src/service/router.ts @@ -20,6 +20,10 @@ import { KubernetesClustersSupplier } from '../types/types'; import express from 'express'; import { KubernetesBuilder } from './KubernetesBuilder'; +/** + * + * @alpha + */ export interface RouterOptions { logger: Logger; config: Config; @@ -38,6 +42,8 @@ export interface RouterOptions { * config, * }).build(); * ``` + * + * @alpha */ export async function createRouter( options: RouterOptions, diff --git a/plugins/kubernetes-backend/src/types/types.ts b/plugins/kubernetes-backend/src/types/types.ts index 67456d12c8..6302a49fa5 100644 --- a/plugins/kubernetes-backend/src/types/types.ts +++ b/plugins/kubernetes-backend/src/types/types.ts @@ -14,16 +14,22 @@ * limitations under the License. */ +import { Entity } from '@backstage/catalog-model'; import { Logger } from 'winston'; import type { JsonObject } from '@backstage/types'; import type { FetchResponse, KubernetesFetchError, + KubernetesRequestAuth, KubernetesRequestBody, ObjectsByEntityResponse, } from '@backstage/plugin-kubernetes-common'; import { PodStatus } from '@kubernetes/client-node/dist/top'; +/** + * + * @alpha + */ export interface ObjectFetchParams { serviceId: string; clusterDetails: @@ -37,8 +43,11 @@ export interface ObjectFetchParams { namespace?: string; } -// Fetches information from a kubernetes cluster using the cluster details object -// to target a specific cluster +/** + * Fetches information from a kubernetes cluster using the cluster details object to target a specific cluster + * + * @alpha + */ export interface KubernetesFetcher { fetchObjectsForService( params: ObjectFetchParams, @@ -49,13 +58,19 @@ export interface KubernetesFetcher { ): Promise; } +/** + * + * @alpha + */ export interface FetchResponseWrapper { errors: KubernetesFetchError[]; responses: FetchResponse[]; } -// TODO fairly sure there's a easier way to do this - +/** + * + * @alpha + */ export interface ObjectToFetch { objectType: KubernetesObjectTypes; group: string; @@ -63,10 +78,24 @@ export interface ObjectToFetch { plural: string; } +/** + * + * @alpha + */ export interface CustomResource extends ObjectToFetch { objectType: 'customresources'; } +/** + * + * @alpha + */ +export type CustomResourceMatcher = Omit; + +/** + * + * @alpha + */ export type KubernetesObjectTypes = | 'pods' | 'services' @@ -80,7 +109,10 @@ export type KubernetesObjectTypes = | 'customresources' | 'statefulsets'; -// Used to load cluster details from different sources +/** + * Used to load cluster details from different sources + * @alpha + */ export interface KubernetesClustersSupplier { /** * Returns the cached list of clusters. @@ -91,13 +123,24 @@ export interface KubernetesClustersSupplier { getClusters(): Promise; } -// Used to locate which cluster(s) a service is running on +/** + * Used to locate which cluster(s) a service is running on + * @alpha + */ export interface KubernetesServiceLocator { - getClustersByServiceId(serviceId: string): Promise; + getClustersByEntity(entity: Entity): Promise<{ clusters: ClusterDetails[] }>; } +/** + * + * @alpha + */ export type ServiceLocatorMethod = 'multiTenant' | 'http'; // TODO implement http +/** + * + * @alpha + */ export interface ClusterDetails { /** * Specifies the name of the Kubernetes cluster. @@ -151,14 +194,37 @@ export interface ClusterDetails { dashboardParameters?: JsonObject; } +/** + * + * @alpha + */ export interface GKEClusterDetails extends ClusterDetails {} + +/** + * + * @alpha + */ export interface AzureClusterDetails extends ClusterDetails {} + +/** + * + * @alpha + */ export interface ServiceAccountClusterDetails extends ClusterDetails {} + +/** + * + * @alpha + */ export interface AWSClusterDetails extends ClusterDetails { assumeRole?: string; externalId?: string; } +/** + * + * @alpha + */ export interface KubernetesObjectsProviderOptions { logger: Logger; fetcher: KubernetesFetcher; @@ -167,10 +233,38 @@ export interface KubernetesObjectsProviderOptions { objectTypesToFetch?: ObjectToFetch[]; } +/** + * + * @alpha + */ export type ObjectsByEntityRequest = KubernetesRequestBody; +/** + * + * @alpha + */ +export interface KubernetesObjectsByEntity { + entity: Entity; + auth: KubernetesRequestAuth; +} + +/** + * + * @alpha + */ +export interface CustomResourcesByEntity extends KubernetesObjectsByEntity { + customResources: CustomResourceMatcher[]; +} + +/** + * + * @alpha + */ export interface KubernetesObjectsProvider { getKubernetesObjectsByEntity( - request: ObjectsByEntityRequest, + kubernetesObjectsByEntity: KubernetesObjectsByEntity, + ): Promise; + getCustomResourcesByEntity( + customResourcesByEntity: CustomResourcesByEntity, ): Promise; } diff --git a/plugins/kubernetes-common/api-report.md b/plugins/kubernetes-common/api-report.md index cca4a9760f..d59db7422f 100644 --- a/plugins/kubernetes-common/api-report.md +++ b/plugins/kubernetes-common/api-report.md @@ -190,17 +190,24 @@ export interface KubernetesFetchError { statusCode?: number; } +// Warning: (ae-missing-release-tag) "KubernetesRequestAuth" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface KubernetesRequestAuth { + // (undocumented) + google?: string; + // (undocumented) + oidc?: { + [key: string]: string; + }; +} + // Warning: (ae-missing-release-tag) "KubernetesRequestBody" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export interface KubernetesRequestBody { // (undocumented) - auth?: { - google?: string; - oidc?: { - [key: string]: string; - }; - }; + auth?: KubernetesRequestAuth; // (undocumented) entity: Entity; } diff --git a/plugins/kubernetes-common/src/types.ts b/plugins/kubernetes-common/src/types.ts index 3d4746ca44..68fbe09301 100644 --- a/plugins/kubernetes-common/src/types.ts +++ b/plugins/kubernetes-common/src/types.ts @@ -29,13 +29,15 @@ import { } from '@kubernetes/client-node'; import { Entity } from '@backstage/catalog-model'; -export interface KubernetesRequestBody { - auth?: { - google?: string; - oidc?: { - [key: string]: string; - }; +export interface KubernetesRequestAuth { + google?: string; + oidc?: { + [key: string]: string; }; +} + +export interface KubernetesRequestBody { + auth?: KubernetesRequestAuth; entity: Entity; } From c216659278f7a5ee0d6b8b59ebf9106af72bc23d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 19:45:53 +0000 Subject: [PATCH 104/590] chore(deps): update storybook monorepo to v6.5.9 Signed-off-by: Renovate Bot --- storybook/yarn.lock | 682 ++++++++++++++++++++++---------------------- 1 file changed, 344 insertions(+), 338 deletions(-) diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 91530cccf6..39d0e2725f 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -18,9 +18,9 @@ "@babel/highlight" "^7.16.7" "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + version "7.18.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" + integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== "@babel/core@7.12.9": version "7.12.9" @@ -45,9 +45,9 @@ source-map "^0.5.0" "@babel/core@^7.12.10", "@babel/core@^7.7.5": - version "7.18.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" - integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + version "7.18.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" + integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.16.7" @@ -55,10 +55,10 @@ "@babel/helper-compilation-targets" "^7.18.2" "@babel/helper-module-transforms" "^7.18.0" "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.0" + "@babel/parser" "^7.18.5" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" + "@babel/traverse" "^7.18.5" + "@babel/types" "^7.18.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -299,10 +299,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": - version "7.18.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" - integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== +"@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.5": + version "7.18.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" + integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": version "7.17.12" @@ -763,9 +763,9 @@ babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.18.0": - version "7.18.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz#3d6fd9868c735cce8f38d6ae3a407fb7e61e6d46" - integrity sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg== + version "7.18.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz#87f11c44fbfd3657be000d4897e192d9cb535996" + integrity sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q== dependencies: "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-module-transforms" "^7.18.0" @@ -790,9 +790,9 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-transform-new-target@^7.17.12": - version "7.17.12" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" - integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== + version "7.18.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz#8c228c4a07501dd12c95c5f23d1622131cc23931" + integrity sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg== dependencies: "@babel/helper-plugin-utils" "^7.17.12" @@ -1075,10 +1075,10 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2": - version "7.18.2" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" - integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5": + version "7.18.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" + integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== dependencies: "@babel/code-frame" "^7.16.7" "@babel/generator" "^7.18.2" @@ -1086,12 +1086,12 @@ "@babel/helper-function-name" "^7.17.9" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.0" - "@babel/types" "^7.18.2" + "@babel/parser" "^7.18.5" + "@babel/types" "^7.18.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.2.0", "@babel/types@^7.4.4": +"@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.2.0", "@babel/types@^7.4.4": version "7.18.4" resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== @@ -1273,18 +1273,18 @@ source-map "^0.7.3" "@storybook/addon-a11y@^6.4.21": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-6.5.8.tgz#90ecf3490f0e7e2096ae04d6d6386bae5182fb94" - integrity sha512-nBP8t7wADsKoDLqeH4S4YbxuE+t9Xw9T+XpeG94xn9oJPE1Tj4A0x0X91sTIPbi/FF07lCiaUP+eq92Y1bAV+Q== + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-6.5.9.tgz#191fb8ea9be4feee67fd11553b98ab56ecfc1295" + integrity sha512-jRiuJ2xlN8quVq2lOqpxqyuwAj8xLcgVBPy+Mf220u7AZmmbS/0sONyHKROfEBjJoHQAQYqn2vSAeuQZuTWyVA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/api" "6.5.9" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/components" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.9" axe-core "^4.2.0" core-js "^3.8.2" global "^4.4.0" @@ -1295,17 +1295,17 @@ util-deprecate "^1.0.2" "@storybook/addon-actions@^6.4.21": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.8.tgz#c1f544acc016a4a0d5dcb373535dc991b5737c5f" - integrity sha512-9ciR1iWBTzQNBDlq0iQs9+TV7gng+FbQxW5mHNxNvT9SxY1dt02wCPHZeVE/5la61wBXZs/zpEepZA93VzVBDw== + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.9.tgz#d50d65631403e1a5b680961429d9c0d7bd383e68" + integrity sha512-wDYm3M1bN+zcYZV3Q24M03b/P8DDpvj1oSoY6VLlxDAi56h8qZB/voeIS2I6vWXOB79C5tbwljYNQO0GsufS0g== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/api" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/components" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.9" core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" @@ -1320,33 +1320,33 @@ uuid-browser "^3.1.0" "@storybook/addon-controls@^6.4.22": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.8.tgz#779407655d990f88e1d3bb734cf116bc419ab6ba" - integrity sha512-fB6p5DgVHUnJKUzOlT2mtvaSCincnO+vuYLyf++f+l4BlYK1Es9HNl/puaRoMgdW+LoGJjXPTIMcMByeHVIt6Q== + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.9.tgz#8f6ef939c87b3dbad98f8bda7e124f0b34f668d2" + integrity sha512-VvjkgK32bGURKyWU2No6Q2B0RQZjLZk8D3neVNCnrWxwrl1G82StegxjRPn/UZm9+MZVPvTvI46nj1VdgOktnw== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-common" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/api" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/components" "6.5.9" + "@storybook/core-common" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/node-logger" "6.5.8" - "@storybook/store" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/node-logger" "6.5.9" + "@storybook/store" "6.5.9" + "@storybook/theming" "6.5.9" core-js "^3.8.2" lodash "^4.17.21" ts-dedent "^2.0.0" "@storybook/addon-links@^6.4.21": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.8.tgz#ec4b640bf89dbb653592e6f05968ba771bb10b4a" - integrity sha512-UxzEPnT1PLPsuy3tt+o3UJTbI4Kihec+/yzpzzGKreUnCC8EWTsOhtMQAVVit2t4BMl4vNrxKO0mKSc8saT3Gw== + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.9.tgz#91cbca0c044796badf2498723fdd10dacea5748b" + integrity sha512-4BYC7pkxL3NLRnEgTA9jpIkObQKril+XFj1WtmY/lngF90vvK0Kc/TtvTA2/5tSgrHfxEuPevIdxMIyLJ4ejWQ== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.8" + "@storybook/router" "6.5.9" "@types/qs" "^6.9.5" core-js "^3.8.2" global "^4.4.0" @@ -1356,17 +1356,17 @@ ts-dedent "^2.0.0" "@storybook/addon-storysource@^6.4.21": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-6.5.8.tgz#6754b19b714fc19e6601fe5385fcf05c648a8f36" - integrity sha512-BujH4Xdhvegi4WvI1foBfrnUGnyJ18sLn47xJ2D26kQQXgC3qiGaUiQuEfGeETYgDuIxoxTkv5N4Y1ocjoOSkA== + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-6.5.9.tgz#8e5fb76b9314a69831a3b5e08e8570407c39de75" + integrity sha512-7KLw03mE1JJSJQrqNDftoVVp2BBq8wltd0qo7WHkpRVfir9dMO3g7Wy6S6UPsrb9th47ZjonwBJEc28GwAq0yg== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/router" "6.5.8" - "@storybook/source-loader" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/api" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/components" "6.5.9" + "@storybook/router" "6.5.9" + "@storybook/source-loader" "6.5.9" + "@storybook/theming" "6.5.9" core-js "^3.8.2" estraverse "^5.2.0" loader-utils "^2.0.0" @@ -1374,35 +1374,35 @@ react-syntax-highlighter "^15.4.5" regenerator-runtime "^0.13.7" -"@storybook/addons@6.5.8", "@storybook/addons@^6.4.21": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.8.tgz#c529a2989830a09d26308277a3e356228479053d" - integrity sha512-L3LmbsYP9tDHHvpr/yv8YuEkzym7SXp/jZ0km31tpG3EuZmgGu7MXPrZ2ymEw4PkAhQzztgRr23VTfKobGUojA== +"@storybook/addons@6.5.9", "@storybook/addons@^6.4.21": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.9.tgz#5a9d7395c579a9cbc44dfc122362fb3c95dfb9d5" + integrity sha512-adwdiXg+mntfPocLc1KXjZXyLgGk7Aac699Fwe+OUYPEC5tW347Rm/kFatcE556d42o5czcRiq3ZSIGWnm9ieQ== dependencies: - "@storybook/api" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/api" "6.5.9" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/router" "6.5.9" + "@storybook/theming" "6.5.9" "@types/webpack-env" "^1.16.0" core-js "^3.8.2" global "^4.4.0" regenerator-runtime "^0.13.7" -"@storybook/api@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/api/-/api-6.5.8.tgz#8bd400b8a5b18ec6bff5d35a898593d9c1c630f9" - integrity sha512-/MueV+wLCvy9gFA3ih4g7QYjDmn14i+D2ydonfaEC7R+agFGXxXwJGPKkz3yBNrRpNkBwcbY9mAmv8lE2AqgqQ== +"@storybook/api@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/api/-/api-6.5.9.tgz#303733214c9de0422d162f7c54ae05d088b89bf9" + integrity sha512-9ylztnty4Y+ALU/ehW3BML9czjCAFsWvrwuCi6UgcwNjswwjSX3VRLhfD1KT3pl16ho//95LgZ0LnSwROCcPOA== dependencies: - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.8" + "@storybook/router" "6.5.9" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.9" core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" @@ -1414,28 +1414,28 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/builder-webpack4@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.8.tgz#adfb4b91bd442c2f256d93649d50ca138c30663a" - integrity sha512-4/CVp/AlOxCeWZ/DF1TVS/TuzHao4l9KCq7DhL+utFEVl9c/dpgoZXc0Gy2FfHa2RXHKckrH/VUfV2KQk4TNSw== +"@storybook/builder-webpack4@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.9.tgz#4b37e1fa23a25aa4bfeaba640e5d318fcd511f95" + integrity sha512-YOeA4++9uRZ8Hog1wC60yjaxBOiI1FRQNtax7b9E7g+kP8UlSCPCGcv4gls9hFmzbzTOPfQTWnToA9Oa6jzRVw== dependencies: "@babel/core" "^7.12.10" - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/node-logger" "6.5.8" - "@storybook/preview-web" "6.5.8" - "@storybook/router" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/api" "6.5.9" + "@storybook/channel-postmessage" "6.5.9" + "@storybook/channels" "6.5.9" + "@storybook/client-api" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/components" "6.5.9" + "@storybook/core-common" "6.5.9" + "@storybook/core-events" "6.5.9" + "@storybook/node-logger" "6.5.9" + "@storybook/preview-web" "6.5.9" + "@storybook/router" "6.5.9" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.8" - "@storybook/theming" "6.5.8" - "@storybook/ui" "6.5.8" + "@storybook/store" "6.5.9" + "@storybook/theming" "6.5.9" + "@storybook/ui" "6.5.9" "@types/node" "^14.0.10 || ^16.0.0" "@types/webpack" "^4.41.26" autoprefixer "^9.8.6" @@ -1467,51 +1467,51 @@ webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.2.2" -"@storybook/channel-postmessage@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.8.tgz#989af9a55eba391b64487640f6b5b0cfd1fde2f9" - integrity sha512-6IkIKk+UMYKk05vN8gWHvvOV/EZNXpQG/5gesGDALjkCyvRmcktHak1a9tHpoihZ3L7/gDwXOZraCZmuy8vBcQ== +"@storybook/channel-postmessage@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.9.tgz#9cf4530f0364cee0d5e58f92d6fb5ce98e10257b" + integrity sha512-pX/0R8UW7ezBhCrafRaL20OvMRcmESYvQQCDgjqSzJyHkcG51GOhsd6Ge93eJ6QvRMm9+w0Zs93N2VKjVtz0Qw== dependencies: - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" core-js "^3.8.2" global "^4.4.0" qs "^6.10.0" telejson "^6.0.8" -"@storybook/channel-websocket@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.8.tgz#722743619f86ebc9325bbff026acf6eba13b21ca" - integrity sha512-lAtvgO0FWsyS3u7uFbsGIYp2aSWJfWU/LOtc3x1K5c84JJAd9fncYkyZMwP1gMbdNgYxJoxe8HXtVtfeNegPuQ== +"@storybook/channel-websocket@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.9.tgz#6b7a0127fec58ee5be4f6aebcf460adc564f2f34" + integrity sha512-xtHvSNwuOhkgALwVshKWsoFhDmuvcosdYfxcfFGEiYKXIu46tRS5ZXmpmgEC/0JAVkVoFj5nL8bV7IY5np6oaA== dependencies: - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" core-js "^3.8.2" global "^4.4.0" telejson "^6.0.8" -"@storybook/channels@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.8.tgz#e85ffd2076813b67336b1b9b274c37aa5f1b80e0" - integrity sha512-fNql1lEIvWlI1NiRtwFMWOOvfW6qxgeSP6xoqiAJ0b+QYegEFG9UxJDuEvVHq++S81FulgQ5U+p+5R9XSV19tQ== +"@storybook/channels@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.9.tgz#abfab89a6587a2688e9926d4aafeb11c9d8b2e79" + integrity sha512-FvGA35nV38UPXWOl9ERapFTJaxwSTamQ339s2Ev7E9riyRG+GRkgTWzf5kECJgS1PAYKd/7m/RqKJT9BVv6A5g== dependencies: core-js "^3.8.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-api@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.8.tgz#cf1b3d4a71a3a156636a9b6b51acc4239b259d86" - integrity sha512-mdU+qQ4+T2OUbEnl+3MWRKxEPju/EOIUg66hMgmif8c5u7YFYBFulUMUYLICMjll8Jlu+37+g+qO3K2eEz6CEw== +"@storybook/client-api@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.9.tgz#3e4a8ec1d277fd81325c5d959c553161a85fa182" + integrity sha512-pc7JKJoWLesixUKvG2nV36HukUuYoGRyAgD3PpIV7qSBS4JixqZ3VAHFUtqV1UzfOSQTovLSl4a0rIRnpie6gA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/channel-postmessage" "6.5.9" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.8" + "@storybook/store" "6.5.9" "@types/qs" "^6.9.5" "@types/webpack-env" "^1.16.0" core-js "^3.8.2" @@ -1526,44 +1526,45 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-logger@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.8.tgz#551f818c4448ef6e6adf9c3ad256e1ae61e2d75c" - integrity sha512-dH6HSaVuOIMHy1+rpsqcD3SJxVZEEbuEtsNpdUGwLJaIuduhUJJpM2xQfUW0siZDyrgwoa+znll+G0YNUbv7sg== +"@storybook/client-logger@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.9.tgz#dc1669abe8c45af1cc38f74c6f4b15ff33e63014" + integrity sha512-DOHL6p0uiDd3gV/Sb2FR+Vh6OiPrrf8BrA06uvXWsMRIIvEEvnparxv9EvPg7FlmUX0T3nq7d3juwjx4F8Wbcg== dependencies: core-js "^3.8.2" global "^4.4.0" -"@storybook/components@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/components/-/components-6.5.8.tgz#eb18cfcc4e88b7f4081b20b8a81b92d7ae9eaeac" - integrity sha512-YE+LZ1/GXoqertxodsf+L9ehcohbICRAxgE/iNqc7MZfk95SD3XRSUbxhCpGe8QTIZJpzs1tK4LFZ3Fg5w/+Lg== +"@storybook/components@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/components/-/components-6.5.9.tgz#97e07ffe11ab76c01ccee380888991bd161f75b2" + integrity sha512-BhfX980O9zn/1J4FNMeDo8ZvL1m5Ml3T4HRpfYmEBnf8oW5b5BeF6S2K2cwFStZRjWqm1feUcwNpZxCBVMkQnQ== dependencies: - "@storybook/client-logger" "6.5.8" + "@storybook/client-logger" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.9" "@types/react-syntax-highlighter" "11.0.5" core-js "^3.8.2" + memoizerific "^1.11.3" qs "^6.10.0" react-syntax-highlighter "^15.4.5" regenerator-runtime "^0.13.7" util-deprecate "^1.0.2" -"@storybook/core-client@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.8.tgz#4be4ce024a74b51c0650d346f1f3a11a0f921952" - integrity sha512-8x8qKQ2clvpfDcoWrNBmQ8Xt9z/i32TFIBp4PEZMcbB7eqo517nzfllLiXDipiJgO7BGxKtY5CRHQ9pAU9G27A== +"@storybook/core-client@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.9.tgz#ea6035d1c90d2c68e860e3cf629979491856cd88" + integrity sha512-LY0QbhShowO+PQx3gao3wdVjpKMH1AaSLmuI95FrcjoMmSXGf96jVLKQp9mJRGeHIsAa93EQBYuCihZycM3Kbg== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/channel-websocket" "6.5.8" - "@storybook/client-api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/channel-postmessage" "6.5.9" + "@storybook/channel-websocket" "6.5.9" + "@storybook/client-api" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/preview-web" "6.5.8" - "@storybook/store" "6.5.8" - "@storybook/ui" "6.5.8" + "@storybook/preview-web" "6.5.9" + "@storybook/store" "6.5.9" + "@storybook/ui" "6.5.9" airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" core-js "^3.8.2" @@ -1575,10 +1576,10 @@ unfetch "^4.2.0" util-deprecate "^1.0.2" -"@storybook/core-common@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.8.tgz#6972c7109477914f9ed72bedbe3769cec0eb8c56" - integrity sha512-ELGKLMx1d0oEA2LT+fsmo85X2RNE1EO+It7B1bw//g7jyf1hmZ7t3lXMZUCqt7eml1qy1N72LDkfmmU+H9H6ww== +"@storybook/core-common@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.9.tgz#7ca8258ea2634b1d64695c1e4262f71cc7457989" + integrity sha512-NxOK0mrOCo0TWZ7Npc5HU66EKoRHlrtg18/ZixblLDWQMIqY9XCck8K1kJ8QYpYCHla+aHIsYUArFe2vhlEfZA== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -1602,7 +1603,7 @@ "@babel/preset-react" "^7.12.10" "@babel/preset-typescript" "^7.12.7" "@babel/register" "^7.12.1" - "@storybook/node-logger" "6.5.8" + "@storybook/node-logger" "6.5.9" "@storybook/semver" "^7.3.2" "@types/node" "^14.0.10 || ^16.0.0" "@types/pretty-hrtime" "^1.0.0" @@ -1631,30 +1632,30 @@ util-deprecate "^1.0.2" webpack "4" -"@storybook/core-events@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.8.tgz#bc405d37d0ed1a6eafa2682fc085b2a7a992233c" - integrity sha512-lzG4Lg65WFYvjs2k/E3CP4+eyPexEGrDyRMO9Pbj9H9x+eosYptauEbT/wXF83bmUWZKLWWVUAZX7hDcxBO8cw== +"@storybook/core-events@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.9.tgz#5b0783c7d22a586c0f5e927a61fe1b1223e19637" + integrity sha512-tXt7a3ZvJOCeEKpNa/B5rQM5VI7UJLlOh3IHOImWn4HqoBRrZvbourmac+PRZAtXpos0h3c6554Hjapj/Sny5Q== dependencies: core-js "^3.8.2" -"@storybook/core-server@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.8.tgz#3ef53c4b0437e83c310f9e545607a0b1ce512ab6" - integrity sha512-ti7+MW1xzD9O0JLwgZTwulxhJx5YGPNu+hRpGhJSjKrqGX1h6K6ilmkBSHvyLqpiE+F4mxvqb5Rx3KBIEdEgbw== +"@storybook/core-server@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.9.tgz#749a881c1a81d7cf1a69f3782c06a7f0c39a505c" + integrity sha512-YeePGUrd5fQPvGzMhowh124KrcZURFpFXg1VB0Op3ESqCIsInoMZeObci4Gc+binMXC7vcv7aw3EwSLU37qJzQ== dependencies: "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-webpack4" "6.5.8" - "@storybook/core-client" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/builder-webpack4" "6.5.9" + "@storybook/core-client" "6.5.9" + "@storybook/core-common" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/csf-tools" "6.5.8" - "@storybook/manager-webpack4" "6.5.8" - "@storybook/node-logger" "6.5.8" + "@storybook/csf-tools" "6.5.9" + "@storybook/manager-webpack4" "6.5.9" + "@storybook/node-logger" "6.5.9" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.8" - "@storybook/telemetry" "6.5.8" + "@storybook/store" "6.5.9" + "@storybook/telemetry" "6.5.9" "@types/node" "^14.0.10 || ^16.0.0" "@types/node-fetch" "^2.5.7" "@types/pretty-hrtime" "^1.0.0" @@ -1689,18 +1690,18 @@ ws "^8.2.3" x-default-browser "^0.4.0" -"@storybook/core@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/core/-/core-6.5.8.tgz#cbe6acaf587e9ef66963bb104a067c213aeea990" - integrity sha512-+Fv4n1E5N4Avty9GcRbz4vB2IWH//se2OUU+RTT3vneCOGjyus5bj0Or6GU5wef5UGuvHF78mHg/frhWpguzsw== +"@storybook/core@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/core/-/core-6.5.9.tgz#da4f237391d99aed1228323f24b335cafbdf3499" + integrity sha512-Mt3TTQnjQt2/pa60A+bqDsAOrYpohapdtt4DDZEbS8h0V6u11KyYYh3w7FCySlL+sPEyogj63l5Ec76Jah3l2w== dependencies: - "@storybook/core-client" "6.5.8" - "@storybook/core-server" "6.5.8" + "@storybook/core-client" "6.5.9" + "@storybook/core-server" "6.5.9" -"@storybook/csf-tools@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.8.tgz#5788aa1e862ee613d11d6528f27c8e267e4dd3a7" - integrity sha512-4VrjIMxKcp29OFSMDub52aQOMP4EvtZ5eWZkPeORRNQoJsnQaxhF9GGf71QdSaAQZhMoxdvmpA47ehrFk8Rnfw== +"@storybook/csf-tools@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.9.tgz#8e01df2305b53e228229f0b45ada3720e6e42a1c" + integrity sha512-RAdhsO2XmEDyWy0qNQvdKMLeIZAuyfD+tYlUwBHRU6DbByDucvwgMOGy5dF97YNJFmyo93EUYJzXjUrJs3U1LQ== dependencies: "@babel/core" "^7.12.10" "@babel/generator" "^7.12.11" @@ -1724,33 +1725,33 @@ dependencies: lodash "^4.17.15" -"@storybook/docs-tools@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.8.tgz#6189fd20fafa9eb2aa4a19e311d65295992dd105" - integrity sha512-CWMW+3LSstvQmHKV5ggPR1beQZTpwCXEhfysZ9u4Yp/4fcoDIuQ7DTOK5uNFynGCGl1FG3lATriEOhEZ3bZCvQ== +"@storybook/docs-tools@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.9.tgz#5ff304f881e972ce14923a5ffcfed3f052094889" + integrity sha512-UoTaXLvec8x+q+4oYIk/t8DBju9C3ZTGklqOxDIt+0kS3TFAqEgI3JhKXqQOXgN5zDcvLVSxi8dbVAeSxk2ktA== dependencies: "@babel/core" "^7.12.10" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.8" + "@storybook/store" "6.5.9" core-js "^3.8.2" doctrine "^3.0.0" lodash "^4.17.21" regenerator-runtime "^0.13.7" -"@storybook/manager-webpack4@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.8.tgz#9e4d3dcebac9bd0b07abd630632dc15130ae03f1" - integrity sha512-qW5/L3cJHvtNi5ylDxObALZWaAHMsWQlPP8GRxm95NHpff4CfRo/qs7puY9ZeLmJSic0KchoHEH/8AScflLOgA== +"@storybook/manager-webpack4@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.9.tgz#c75d2cced4550c8a786f00b0e57b203d613e706c" + integrity sha512-49LZlHqWc7zj9tQfOOANixPYmLxqWTTZceA6DSXnKd9xDiO2Gl23Y+l/CSPXNZGDB8QFAwpimwqyKJj/NLH45A== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-transform-template-literals" "^7.12.1" "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.5.8" - "@storybook/core-client" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/node-logger" "6.5.8" - "@storybook/theming" "6.5.8" - "@storybook/ui" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/core-client" "6.5.9" + "@storybook/core-common" "6.5.9" + "@storybook/node-logger" "6.5.9" + "@storybook/theming" "6.5.9" + "@storybook/ui" "6.5.9" "@types/node" "^14.0.10 || ^16.0.0" "@types/webpack" "^4.41.26" babel-loader "^8.0.0" @@ -1795,10 +1796,10 @@ prettier ">=2.2.1 <=2.3.0" ts-dedent "^2.0.0" -"@storybook/node-logger@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.8.tgz#d1244c846da5a296a7432444f8682f77853fb81e" - integrity sha512-BHdkSipgjnfsh4FRYbV2R0npM5gVx9JLRsDQ0KiTolRpN4SU98kT/6885zb9jZg6I0EY+UG9Qdr3fvL9VLpY1g== +"@storybook/node-logger@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.9.tgz#129cfe0d0f79cab4f6a2ba194d39516680b1626f" + integrity sha512-nZZNZG2Wtwv6Trxi3FrnIqUmB55xO+X/WQGPT5iKlqNjdRIu/T72mE7addcp4rbuWCQfZUhcDDGpBOwKtBxaGg== dependencies: "@types/npmlog" "^4.1.2" chalk "^4.1.0" @@ -1806,17 +1807,17 @@ npmlog "^5.0.1" pretty-hrtime "^1.0.3" -"@storybook/preview-web@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.8.tgz#b1c86d56e99032c02ba47bab628c36d76a0385b6" - integrity sha512-jEEAgvTVZfFA0B20mRJfLW6dPA5mG5PxUJtjMx6wH4Yw4+i3Sld/U63hTRt7ktpKdrcu4lX9E+PuaRLPq7S2kg== +"@storybook/preview-web@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.9.tgz#557d919e6df50d66259521aa36ebf4055bbd236e" + integrity sha512-4eMrO2HJyZUYyL/j+gUaDvry6iGedshwT5MQqe7J9FaA+Q2pNARQRB1X53f410w7S4sObRmYIAIluWPYdWym9w== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/channel-postmessage" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.8" + "@storybook/store" "6.5.9" ansi-to-html "^0.6.11" core-js "^3.8.2" global "^4.4.0" @@ -1842,23 +1843,23 @@ tslib "^2.0.0" "@storybook/react@^6.4.21": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/react/-/react-6.5.8.tgz#8a9e15416a18ceb5c11c89ffe9f38357d442efa9" - integrity sha512-LdObfhhPb9gAFBtRNb3awYJe1qMiYeda1ppkj0ZvccbV04YrmbW5bzYvfOCvU6D34ugbQJhJyWuvraO/0EJK6w== + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/react/-/react-6.5.9.tgz#687ec1f6b785822a392b7ac115b61800f69fb7cd" + integrity sha512-Rp+QaTQAzxJhwuzJXVd49mnIBLQRlF8llTxPT2YoGHdrGkku/zl/HblQ6H2yzEf15367VyzaAv/BpLsO9Jlfxg== dependencies: "@babel/preset-flow" "^7.12.1" "@babel/preset-react" "^7.12.10" "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core" "6.5.8" - "@storybook/core-common" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core" "6.5.9" + "@storybook/core-common" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/docs-tools" "6.5.8" - "@storybook/node-logger" "6.5.8" + "@storybook/docs-tools" "6.5.9" + "@storybook/node-logger" "6.5.9" "@storybook/react-docgen-typescript-plugin" "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.8" + "@storybook/store" "6.5.9" "@types/estree" "^0.0.51" "@types/node" "^14.14.20 || ^16.0.0" "@types/webpack-env" "^1.16.0" @@ -1882,13 +1883,15 @@ util-deprecate "^1.0.2" webpack ">=4.43.0 <6.0.0" -"@storybook/router@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/router/-/router-6.5.8.tgz#241e3842bdd174e0eeeb9d1de6adb2975615884d" - integrity sha512-tseNJpZ2ZzVYowjekUMpGJVVRMrwOkttieD9mRbHrhh+2n7b+SoMKnuLi3ow0xeOyPL8ZDng2FgRjQzQHXA5Sw== +"@storybook/router@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/router/-/router-6.5.9.tgz#4740248f8517425b2056273fb366ace8a17c65e8" + integrity sha512-G2Xp/2r8vU2O34eelE+G5VbEEVFDeHcCURrVJEROh6dq2asFJAPbzslVXSeCqgOTNLSpRDJ2NcN5BckkNqmqJg== dependencies: - "@storybook/client-logger" "6.5.8" + "@storybook/client-logger" "6.5.9" core-js "^3.8.2" + memoizerific "^1.11.3" + qs "^6.10.0" regenerator-runtime "^0.13.7" "@storybook/semver@^7.3.2": @@ -1899,13 +1902,13 @@ core-js "^3.6.5" find-up "^4.1.0" -"@storybook/source-loader@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.8.tgz#106694fe821f5e42abc4e8e653e5f268a043e470" - integrity sha512-3bVxXKE2o6lS4WGga/S7WwgITxPQ96qsY+pQ1I7A+e4/cKSmZxlVWM9qfMW2ScmHTVoZE0Ujsmn6DWftxzCyrQ== +"@storybook/source-loader@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.9.tgz#7b6f065c6a6108c4b4ca7e45bfd78707373d84ac" + integrity sha512-H03nFKaP6borfWMTTa9igBA+Jm2ph+FoVJImWC/X+LAmLSJYYSXuqSgmiZ/DZvbjxS4k8vccE2HXogne1IvaRA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/client-logger" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" core-js "^3.8.2" estraverse "^5.2.0" @@ -1915,14 +1918,14 @@ prettier ">=2.2.1 <=2.3.0" regenerator-runtime "^0.13.7" -"@storybook/store@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/store/-/store-6.5.8.tgz#528bf9a2decf5121045fb0a19b8caf795b4a5647" - integrity sha512-5rhGjN/O0oLebRv947B0vgapq48qBBBYYOgq4krRUYU2ecS6LUgtAHR/kTa324o9aBO8cnIXHH78jZcSvMiJlQ== +"@storybook/store@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/store/-/store-6.5.9.tgz#dc9963fc013636569082bd8f7200804866373735" + integrity sha512-80pcDTcCwK6wUA63aWOp13urI77jfipIVee9mpVvbNyfrNN8kGv1BS0z/JHDxuV6rC4g7LG1fb+BurR0yki7BA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/core-events" "6.5.9" "@storybook/csf" "0.0.2--canary.4566f4d.1" core-js "^3.8.2" fast-deep-equal "^3.1.3" @@ -1936,13 +1939,13 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/telemetry@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.8.tgz#2acf9734292d421f84f7f2ac6c17d887c2cb0df4" - integrity sha512-QnAhYF8CwcjC1bT2PK7Zqvo6E42TPl0MY6JS+H6qSZU/BmYeS0It8ZURNfPsA/OzVVLHUkQs96CisKh3N0WWaw== +"@storybook/telemetry@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.9.tgz#8e1e0d4a89fc2387620045e5ea96c109d16a7247" + integrity sha512-JluoHCRhHAr4X0eUNVBSBi1JIBA92404Tu1TPdbN7x6gCZxHXXPTSUTAnspXp/21cTdMhY2x+kfZQ8fmlGK4MQ== dependencies: - "@storybook/client-logger" "6.5.8" - "@storybook/core-common" "6.5.8" + "@storybook/client-logger" "6.5.9" + "@storybook/core-common" "6.5.9" chalk "^4.1.0" core-js "^3.8.2" detect-package-manager "^2.0.1" @@ -1954,30 +1957,33 @@ read-pkg-up "^7.0.1" regenerator-runtime "^0.13.7" -"@storybook/theming@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.8.tgz#240a3c83ea53a9c7b1f3a2c47d6324f38ecb8771" - integrity sha512-1VaKHqj38Ls1bJwDpg3+aEOlvVib/DCFkP6WYrP/AQtNAzxiyw5WkaoRlTVJZvCdu5TxjpG4O6/Ai5TI9QftIg== +"@storybook/theming@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.9.tgz#13f60a3a3cd73ceb5caf9f188e1627e79f1891aa" + integrity sha512-KM0AMP5jMQPAdaO8tlbFCYqx9uYM/hZXGSVUhznhLYu7bhNAIK7ZVmXxyE/z/khM++8eUHzRoZGiO/cwCkg9Xw== dependencies: - "@storybook/client-logger" "6.5.8" + "@storybook/client-logger" "6.5.9" core-js "^3.8.2" + memoizerific "^1.11.3" regenerator-runtime "^0.13.7" -"@storybook/ui@6.5.8": - version "6.5.8" - resolved "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.8.tgz#acd8dadd221c68f65c4963c4ab86b4a757860591" - integrity sha512-rL09kxgY9pCVbxr/VUK4b5FL5VbALfciZR+50sNT1EcTDb9k0OPeqx7a4Ptc+KNkgyPdSTxUGvhzVqH5PYrhZQ== +"@storybook/ui@6.5.9": + version "6.5.9" + resolved "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.9.tgz#41e59279323cccc0d613974ec9782d797220c8a7" + integrity sha512-ryuPxJgtbb0gPXKGgGAUC+Z185xGAd1IvQ0jM5fJ0SisHXI8jteG3RaWhntOehi9qCg+64Vv6eH/cj9QYNHt1Q== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/router" "6.5.8" + "@storybook/addons" "6.5.9" + "@storybook/api" "6.5.9" + "@storybook/channels" "6.5.9" + "@storybook/client-logger" "6.5.9" + "@storybook/components" "6.5.9" + "@storybook/core-events" "6.5.9" + "@storybook/router" "6.5.9" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.9" core-js "^3.8.2" + memoizerific "^1.11.3" + qs "^6.10.0" regenerator-runtime "^0.13.7" resolve-from "^5.0.0" @@ -2070,14 +2076,14 @@ form-data "^3.0.0" "@types/node@*": - version "17.0.41" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.41.tgz#1607b2fd3da014ae5d4d1b31bc792a39348dfb9b" - integrity sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw== + version "17.0.44" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.44.tgz#16dd0bb5338f016d8ca10631789f0d0612fe5d5b" + integrity sha512-gWYiOlu6Y4oyLYBvsJAPlwHbC8H4tX+tLsHy6Ee976wedwwZKrG2hFl3Y/HiH6bIyLTbDWQexQF/ohwKkOpUCg== "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0": - version "16.11.39" - resolved "https://registry.npmjs.org/@types/node/-/node-16.11.39.tgz#07223cd2bc332ad9d92135e3a522eebdee3b060e" - integrity sha512-K0MsdV42vPwm9L6UwhIxMAOmcvH/1OoVkZyCgEtVu4Wx7sElGloy/W7kMBNe/oJ7V/jW9BVt1F6RahH6e7tPXw== + version "16.11.41" + resolved "https://registry.npmjs.org/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" + integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2146,9 +2152,9 @@ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/uglify-js@*": - version "3.13.3" - resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.3.tgz#556fd2ac75cc649aba21f87e0be7b1a7e9915bfe" - integrity sha512-9dmBYXt/rKxedUXfCvXSxyiPvpDXLkiRlv17DnqdhS+pRustL1967rI1jZVt1xysTO+xJGMoZzcy3cWC9+b6Tw== + version "3.16.0" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.16.0.tgz#2cf74a0e6ebb6cd54c0d48e509d5bd91160a9602" + integrity sha512-0yeUr92L3r0GLRnBOvtYK1v2SjqMIqQDHMl7GLb+l2L8+6LSFWEEWEIgVsPdMn5ImLM8qzWT8xFPtQYpp8co0g== dependencies: source-map "^0.6.1" @@ -3128,7 +3134,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.3: +browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.4: version "4.20.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== @@ -3306,9 +3312,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001349: - version "1.0.30001350" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001350.tgz#f0acc6472469d066a4357765eb73be5973eda918" - integrity sha512-NZBql38Pzd+rAu5SPXv+qmTWGQuFsRiemHCJCAPvkoDxWV19/xqL2YHF32fDJ9SDLdLqfax8+S0CO3ncDCp9Iw== + version "1.0.30001354" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz#95c5efdb64148bb4870771749b9a619304755ce5" + integrity sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg== case-sensitive-paths-webpack-plugin@^2.3.0: version "2.4.0" @@ -3649,22 +3655,22 @@ copy-descriptor@^0.1.0: integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.8.1: - version "3.22.8" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz#46fa34ce1ddf742acd7f95f575f66bbb21e05d62" - integrity sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg== + version "3.23.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.1.tgz#23d44d9f209086e60dabf9130cea7719af6e199b" + integrity sha512-KeYrEc8t6FJsKYB2qnDwRHWaC0cJNaqlHfCpMe5q3j/W1nje3moib/txNklddLPCtGb+etcBIyJ8zuMa/LN5/A== dependencies: - browserslist "^4.20.3" + browserslist "^4.20.4" semver "7.0.0" core-js-pure@^3.8.1: - version "3.22.8" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz#f2157793b58719196ccf9673cc14f3683adc0957" - integrity sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w== + version "3.23.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.1.tgz#0b27e4c3ad46178b84e790dbbb81987218ab82ad" + integrity sha512-3qNgf6TqI3U1uhuSYRzJZGfFd4T+YlbyVPl+jgRiKjdZopvG4keZQwWZDAWpu1UH9nCgTpUzIV3GFawC7cJsqg== core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: - version "3.22.8" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz#23f860b1fe60797cc4f704d76c93fea8a2f60631" - integrity sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA== + version "3.23.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.23.1.tgz#9f9a9255115f62c512db56d567f636da32ca0b78" + integrity sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w== core-util-is@~1.0.0: version "1.0.3" @@ -4083,9 +4089,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.147: - version "1.4.148" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.148.tgz#437430e03c58ccd1d05701f66980afe54d2253ec" - integrity sha512-8MJk1bcQUAYkuvCyWZxaldiwoDG0E0AMzBGA6cv3WfuvJySiPgfidEPBFCRRH3cZm6SVZwo/oRlK1ehi1QNEIQ== + version "1.4.156" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.156.tgz#fc398e1bfbe586135351ebfaf198473a82923af5" + integrity sha512-/Wj5NC7E0wHaMCdqxWz9B0lv7CcycDTiHyXCtbbu3pXM9TV2AOp8BtMqkVuqvJNdEvltBG6LxT2Q+BxY4LUCIA== element-resize-detector@^1.2.2: version "1.2.4" @@ -7396,9 +7402,9 @@ react-docgen-typescript@^2.1.1: integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== react-docgen@^5.0.0: - version "5.4.1" - resolved "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.1.tgz#867168accce39e25095a23a922eaa90722e9d182" - integrity sha512-TZqD1aApirw86NV6tHrmDoxUn8wlinkVyutFarzbdwuhEurAzDN0y5sSj64o+BrHLPqjwpH9tunpfwgy+3Uyww== + version "5.4.2" + resolved "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.2.tgz#697ec899e8dd493bb7ba0d50ec0aa5e49f41d3fa" + integrity sha512-4Z5XYpHsn2bbUfaflxoS30VhUvQLBe4GCwwM5v1e1FUOeDdaoJi6wUGSmYp6OdXYEISEAOEIaSPBk4iezNCKBw== dependencies: "@babel/core" "^7.7.5" "@babel/generator" "^7.12.11" @@ -8120,7 +8126,7 @@ source-map-url@^0.4.0: source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" @@ -8202,7 +8208,7 @@ state-toggle@^1.0.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -8333,7 +8339,7 @@ string_decoder@~1.1.1: strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" @@ -8347,7 +8353,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== dependencies: is-utf8 "^0.2.0" @@ -8359,7 +8365,7 @@ strip-final-newline@^2.0.0: strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA== dependencies: get-stdin "^4.0.1" @@ -8525,9 +8531,9 @@ terser@^4.1.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4, terser@^5.7.2: - version "5.14.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz#eefeec9af5153f55798180ee2617f390bdd285e2" - integrity sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g== + version "5.14.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" + integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -8580,24 +8586,24 @@ timers-browserify@^2.0.4: to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -8627,12 +8633,12 @@ toidentifier@1.0.1: tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== trim-trailing-lines@^1.0.0: version "1.1.4" @@ -8642,7 +8648,7 @@ trim-trailing-lines@^1.0.0: trim@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== trough@^1.0.0: version "1.0.5" @@ -8672,12 +8678,12 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== type-check@~0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -8707,7 +8713,7 @@ type-is@~1.6.18: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== uglify-js@^3.1.4: version "3.16.0" @@ -8862,12 +8868,12 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -8875,7 +8881,7 @@ unset-value@^1.0.0: untildify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" - integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= + integrity sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig== dependencies: os-homedir "^1.0.0" @@ -8894,7 +8900,7 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-loader@^4.1.1: version "4.1.1" @@ -8908,7 +8914,7 @@ url-loader@^4.1.1: url@^0.11.0: version "0.11.0" resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== dependencies: punycode "1.3.2" querystring "0.2.0" @@ -8921,7 +8927,7 @@ use@^3.1.0: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util.promisify@1.0.0: version "1.0.0" @@ -8934,7 +8940,7 @@ util.promisify@1.0.0: util@0.10.3: version "0.10.3" resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== dependencies: inherits "2.0.1" @@ -8948,17 +8954,17 @@ util@^0.11.0: utila@~0.4: version "0.4.0" resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utils-merge@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid-browser@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" - integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= + integrity sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg== uuid@^3.3.2: version "3.4.0" @@ -8985,7 +8991,7 @@ validate-npm-package-license@^3.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" @@ -9049,7 +9055,7 @@ web-namespaces@^1.0.0: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webpack-dev-middleware@^3.7.3: version "3.7.3" @@ -9167,7 +9173,7 @@ webpack@4: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -9212,7 +9218,7 @@ word-wrap@~1.2.3: wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== worker-farm@^1.7.0: version "1.7.0" @@ -9240,17 +9246,17 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^8.2.3: - version "8.7.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz#eaf9d874b433aa00c0e0d8752532444875db3957" - integrity sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg== + version "8.8.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" + integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== x-default-browser@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481" - integrity sha1-cM8NqF2nwKtcsPFaiX8jIqa91IE= + integrity sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw== optionalDependencies: default-browser-id "^1.0.4" From 483333c7866d223d995fd85435ffa9d218cb1bef Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 20:20:52 +0000 Subject: [PATCH 105/590] fix(deps): update dependency @azure/identity to v2.0.5 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a11a80e574..4b954cba6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -271,9 +271,9 @@ tslib "^2.0.0" "@azure/identity@^2.0.1", "@azure/identity@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@azure/identity/-/identity-2.0.4.tgz#f5cfde0daf1b9ebaaff3ed6c504f50d7d7c939a5" - integrity sha512-ZgFubAsmo7dji63NLPaot6O7pmDfceAUPY57uphSCr0hmRj+Cakqb4SUz5SohCHFtscrhcmejRU903Fowz6iXg== + version "2.0.5" + resolved "https://registry.npmjs.org/@azure/identity/-/identity-2.0.5.tgz#4475f1222a3cbf5c5ddec644dd3fb293256703d3" + integrity sha512-fSQTu9dS0P+lw1Gfct6t7TuRYybULL/E3wJjXLc1xr6RQXpmenJspi0lKzq3XFjLP5MzBlToKY3ZkYoAXPz1zA== dependencies: "@azure/abort-controller" "^1.0.0" "@azure/core-auth" "^1.3.0" From 4b78817b72cb5358cb1c729dda532d3977aec4c4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 21:20:59 +0000 Subject: [PATCH 106/590] fix(deps): update dependency @types/node-fetch to v2.6.2 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4b954cba6e..b9ce188637 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6322,9 +6322,9 @@ "@types/through" "*" "@types/node-fetch@^2.5.0", "@types/node-fetch@^2.5.12", "@types/node-fetch@^2.5.7": - version "2.6.1" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + version "2.6.2" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" From 42e826af8b902158892dac94cded3caf08c44b6a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 22:11:51 +0000 Subject: [PATCH 107/590] fix(deps): update dependency @types/passport to v1.0.9 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b9ce188637..9892463f71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6447,9 +6447,9 @@ "@types/passport" "*" "@types/passport@*", "@types/passport@^1.0.3": - version "1.0.8" - resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.8.tgz#cc3ee653777365ac02f630c3c08fb755567b7387" - integrity sha512-Gdcvis7+7G/Mobm+25AeFi+oe5teBhHzpbCOFWeN10Bj8tnoEE1L5lkraQjzmDEKkJQuM7xSJUGIFGl/giyRfQ== + version "1.0.9" + resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.9.tgz#b32fa8f7485dace77a9b58e82d0c92908f6e8387" + integrity sha512-9+ilzUhmZQR4JP49GdC2O4UdDE3POPLwpmaTC/iLkW7l0TZCXOo1zsTnnlXPq6rP1UsUZPfbAV4IUdiwiXyC7g== dependencies: "@types/express" "*" From 182b2c10a66b0aa4020265cdc416a560d5586087 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 15 Jun 2022 23:08:56 +0000 Subject: [PATCH 108/590] fix(deps): update dependency graphiql to v1.9.9 Signed-off-by: Renovate Bot --- yarn.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9892463f71..50f6e2736b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2094,17 +2094,17 @@ teeny-request "^8.0.0" uuid "^8.0.0" -"@graphiql/react@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@graphiql/react/-/react-0.4.1.tgz#c424951f4e1b2ffa22aa514b18663d7a848ff31f" - integrity sha512-YeB26Sc223zfv6wSzygKRfeJ7JeXZW40c6vY4Om/POXuytRyrxuKynuP1Z3ueGYY4Rji8YMg6dPAjtTOUDLjZw== +"@graphiql/react@^0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@graphiql/react/-/react-0.4.2.tgz#2a12c7cf0f3945022c2231ce4e814561f2363ef7" + integrity sha512-Df2BaA0HGRkzETCaUw4ZSDe///sfIAGZ6H436A08hmg7SU3yoWJboWGWGc/QD2NyBKVgVBMmzmHcgWhsYh03EA== dependencies: "@graphiql/toolkit" "^0.6.0" codemirror "^5.65.3" - codemirror-graphql "^1.3.1" + codemirror-graphql "^1.3.2" copy-to-clipboard "^3.2.0" escape-html "^1.0.3" - graphql-language-service "^5.0.5" + graphql-language-service "^5.0.6" markdown-it "^12.2.0" set-value "^4.1.0" @@ -9457,12 +9457,12 @@ code-point-at@^1.0.0: resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codemirror-graphql@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-1.3.1.tgz#c852b12b6909783681a5e37d61d1627a78f9c7a6" - integrity sha512-jlLwTARoMeuYLR5sQYbh5uYewIoYUYAn+0lOIKXpaHudk9X1rOrP/WtOqfDza1ETnyfnlpLidBnpieIMKktriQ== +codemirror-graphql@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-1.3.2.tgz#e9d1d18b4a160f0016a28465805284636ee42d2a" + integrity sha512-glwFsEVlH5TvxjSKGymZ1sNy37f3Mes58CB4fXOd0zy9+JzDL08Wti1b5ycy4vFZYghMDK1/Or/zRSjMAGtC2w== dependencies: - graphql-language-service "^5.0.5" + graphql-language-service "^5.0.6" codemirror@^5.65.3: version "5.65.3" @@ -13812,14 +13812,14 @@ grapheme-splitter@^1.0.4: integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== graphiql@^1.5.12, graphiql@^1.8.8: - version "1.9.7" - resolved "https://registry.npmjs.org/graphiql/-/graphiql-1.9.7.tgz#2edadea4fbbd723f9ba27a1f464f4ff5b20866bd" - integrity sha512-rn0njwDkCpFn5GwDbSuzt7GwjiFLhYCdgiscYm4n8Oq9EeOyGrIxQK/PjUz1YaR/+T7lg1raIBuRAX/Nei9KcQ== + version "1.9.9" + resolved "https://registry.npmjs.org/graphiql/-/graphiql-1.9.9.tgz#dfc1760e7552140247e591e3c66d1ccc389ea71f" + integrity sha512-eJ5kGpXFXw69QG/1SJrQs/mzGpDIv4XeGqohGSKQCOh7NtsAsQIxs/VMVR8Lvv9tx6YiIFUvAHp997NlyOwHbQ== dependencies: - "@graphiql/react" "^0.4.1" + "@graphiql/react" "^0.4.2" "@graphiql/toolkit" "^0.6.0" entities "^2.0.0" - graphql-language-service "^5.0.5" + graphql-language-service "^5.0.6" markdown-it "^12.2.0" graphlib@^2.1.8: @@ -13851,10 +13851,10 @@ graphql-executor@0.0.23: resolved "https://registry.npmjs.org/graphql-executor/-/graphql-executor-0.0.23.tgz#205c1764b39ee0fcf611553865770f37b45851a2" integrity sha512-3Ivlyfjaw3BWmGtUSnMpP/a4dcXCp0mJtj0PiPG14OKUizaMKlSEX+LX2Qed0LrxwniIwvU6B4w/koVjEPyWJg== -graphql-language-service@^5.0.5: - version "5.0.5" - resolved "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.0.5.tgz#894c08bee50070c97cc53ae514847aeef41bc0ac" - integrity sha512-hekBLI73r6ghShWrIMJ7Pe4Z+yJrda/U+kLenNJLNswuCrR0XfFOv5pNtnSXLcjFZkQfY1bwGV0D8IVKZEOW5Q== +graphql-language-service@^5.0.6: + version "5.0.6" + resolved "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.0.6.tgz#7fd1e6479e5c3074b070c760fa961d9ad1ed7c72" + integrity sha512-FjE23aTy45Lr5metxCv3ZgSKEZOzN7ERR+OFC1isV5mHxI0Ob8XxayLTYjQKrs8b3kOpvgTYmSmu6AyXOzYslg== dependencies: nullthrows "^1.0.0" vscode-languageserver-types "^3.15.1" From 6c0c6eb7864ee78f520a71b72128da67eb445d3e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 00:08:12 +0000 Subject: [PATCH 109/590] fix(deps): update dependency immer to v9.0.15 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 50f6e2736b..22f13f1445 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14559,9 +14559,9 @@ immer@9.0.7: integrity sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA== immer@^9.0.1, immer@^9.0.7: - version "9.0.14" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz#e05b83b63999d26382bb71676c9d827831248a48" - integrity sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw== + version "9.0.15" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" + integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== immutable@^3.x.x: version "3.8.2" From 310929961e41b8c3f67967ef730e820e800f8e1b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 01:05:51 +0000 Subject: [PATCH 110/590] chore(deps): update dependency esbuild to v0.14.44 Signed-off-by: Renovate Bot --- yarn.lock | 206 +++++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/yarn.lock b/yarn.lock index 22f13f1445..71207f9eb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11736,75 +11736,75 @@ es6-error@^4.1.1: resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild-android-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz#59bf3edad6863c27aa92bbb5c1d83a9a5c981495" - integrity sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg== +esbuild-android-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.44.tgz#62f5cb563d0ba318d898b6eb230c61ad3dc93619" + integrity sha512-dFPHBXmx385zuJULAD/Cmq/LyPRXiAWbf9ylZtY0wJ8iVyWfKYaCYxeJx8OAZUuj46ZwNa7MzW2GBAQLOeiemg== -esbuild-android-arm64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz#0258704edf92ce2463af6d2900b844b5423bed63" - integrity sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA== +esbuild-android-arm64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.44.tgz#ee7fcc9f47855b3395dfd1abcc2c43d8c53e57db" + integrity sha512-qqaqqyxHXjZ/0ddKU3I3Nb7lAvVM69ELMhb8+91FyomAUmQPlHtxe+TTiWxXGHE72XEzcgTEGq4VauqLNkN22g== -esbuild-darwin-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz#72a47295678d4aa0656979baa8cf6d5c8c92656f" - integrity sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg== +esbuild-darwin-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.44.tgz#75ea7f594687a7189a8ba62070d42f13178e68d0" + integrity sha512-RBmtGKGY06+AW6IOJ1LE/dEeF7HH34C1/Ces9FSitU4bIbIpL4KEuQpTFoxwb4ry5s2hyw7vbPhhtyOd18FH9g== -esbuild-darwin-arm64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz#5f5823170b8d85b888957f0794e186caac447aca" - integrity sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw== +esbuild-darwin-arm64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.44.tgz#550631fd135688abda042f4039b962a27f3a5f78" + integrity sha512-Bmhx5Cfo4Hdb7WyyyDupTB8HPmnFZ8baLfPlzLdYvF6OzsIbV+CY+m/AWf0OQvY40BlkzCLJ/7Lfwbb71Tngmg== -esbuild-freebsd-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz#e4a48b08181053837e6cd9bda19ae0af94d493b0" - integrity sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA== +esbuild-freebsd-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.44.tgz#f98069b964266ca79bb361cfb9d7454a05b7e8ca" + integrity sha512-O4HpWa5ZgxbNPQTF7URicLzYa+TidGlmGT/RAC3GjbGEQQYkd0R1Slyh69Yrmb2qmcOcPAgWHbNo1UhK4WmZ4w== -esbuild-freebsd-arm64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz#386e780d36c1dedf3a1cdab79e0bbacd873274e6" - integrity sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA== +esbuild-freebsd-arm64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.44.tgz#247a8553d6033a58b6c3ba4d539216300497d7f6" + integrity sha512-f0/jkAKccnDY7mg1F9l/AMzEm+VXWXK6c3IrOEmd13jyKfpTZKTIlt+yI04THPDCDZTzXHTRUBLozqp+m8Mg5Q== -esbuild-linux-32@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz#040ed6b9ebf06d73acdf2acce7f1cd0c12fbc6a5" - integrity sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw== +esbuild-linux-32@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.44.tgz#4b72747f9f367d3ee3c1d80bf75c617e6b109821" + integrity sha512-WSIhzLldMR7YUoEL7Ix319tC+NFmW9Pu7NgFWxUfOXeWsT0Wg484hm6bNgs7+oY2pGzg715y/Wrqi1uNOMmZJw== -esbuild-linux-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz#8abbb7594ab6a008f2aae72d95d8a4fdc59d9000" - integrity sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw== +esbuild-linux-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.44.tgz#6cd158fdd11f8d037c45139ccddb4fa5966f7ab6" + integrity sha512-zgscTrCMcRZRIsVugqBTP/B5lPLNchBlWjQ8sQq2Epnv+UDtYKgXEq1ctWAmibZNy2E9QRCItKMeIEqeTUT5kA== -esbuild-linux-arm64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz#4e8e9ce77cbf7efec65e79e512b3d2fbd2da398f" - integrity sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ== +esbuild-linux-arm64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.44.tgz#f14f3c8c3501067f5b2cef7a79c9a0058092cb22" + integrity sha512-H0H/2/wgiScTwBve/JR8/o+Zhabx5KPk8T2mkYZFKQGl1hpUgC+AOmRyqy/Js3p66Wim4F4Akv3I3sJA1sKg0w== -esbuild-linux-arm@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz#9e41ee5e099c0ffdfd150da154330c2c0226cc96" - integrity sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg== +esbuild-linux-arm@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.44.tgz#625478cc6ea4f64f5335e7fb07f80d6f659aeb5c" + integrity sha512-laPBPwGfsbBxGw6F6jnqic2CPXLyC1bPrmnSOeJ9oEnx1rcKkizd4HWCRUc0xv+l4z/USRfx/sEfYlWSLeqoJQ== -esbuild-linux-mips64le@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz#4b41f465a787f91cc4fe7dffa0dcabf655935a1a" - integrity sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA== +esbuild-linux-mips64le@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.44.tgz#593c909bb612998300af7f7db2809a63a0d62eec" + integrity sha512-ri3Okw0aleYy7o5n9zlIq+FCtq3tcMlctN6X1H1ucILjBJuH8pan2trJPKWeb8ppntFvE28I9eEXhwkWh6wYKg== -esbuild-linux-ppc64le@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz#ca15934f5b46728dd9ac05270e783e7feaca9eaf" - integrity sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA== +esbuild-linux-ppc64le@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.44.tgz#8fc2fcee671e322a5d44fcf8da6889095a187df9" + integrity sha512-96TqL/MvFRuIVXz+GtCIXzRQ43ZwEk4XTn0RWUNJduXXMDQ/V1iOV28U6x6Oe3NesK4xkoKSaK2+F3VHcU8ZrA== -esbuild-linux-riscv64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz#70fce2b5a0605a67e58b5a357b0e00be1029836d" - integrity sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw== +esbuild-linux-riscv64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.44.tgz#cc2b7158c8345b67e74458a0ec020c80ca777046" + integrity sha512-rrK9qEp2M8dhilsPn4T9gxUsAumkITc1kqYbpyNMr9EWo+J5ZBj04n3GYldULrcCw4ZCHAJ+qPjqr8b6kG2inA== -esbuild-linux-s390x@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz#318d03b4f4ccc7fa44ac7562121cf4a4529e477a" - integrity sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ== +esbuild-linux-s390x@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.44.tgz#5a1e87d5d6236a8791026820936478f3b9cf8e35" + integrity sha512-2YmTm9BrW5aUwBSe8wIEARd9EcnOQmkHp4+IVaO09Ez/C5T866x+ABzhG0bwx0b+QRo9q97CRMaQx2Ngb6/hfw== esbuild-loader@^2.18.0: version "2.19.0" @@ -11818,61 +11818,61 @@ esbuild-loader@^2.18.0: tapable "^2.2.0" webpack-sources "^2.2.0" -esbuild-netbsd-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz#86130ce204ef0162a96e863b55851efecc92f423" - integrity sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ== +esbuild-netbsd-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.44.tgz#8afb16880b530264ce2ed9fb3df26071eb841312" + integrity sha512-zypdzPmZTCqYS30WHxbcvtC0E6e/ECvl4WueUdbdWhs2dfWJt5RtCBME664EpTznixR3lSN1MQ2NhwQF8MQryw== -esbuild-openbsd-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz#0229dc2db2ded97b03bb93bba7646b30ffdf5d0d" - integrity sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg== +esbuild-openbsd-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.44.tgz#a87455be446d6f5b07a60f060e1eafad454c9d4b" + integrity sha512-8J43ab9ByYl7KteC03HGQjr2HY1ge7sN04lFnwMFWYk2NCn8IuaeeThvLeNjzOYhyT3I6K8puJP0uVXUu+D1xw== -esbuild-sunos-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz#17e316216eb9f1de25d52a9000356ae5b869e736" - integrity sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q== +esbuild-sunos-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.44.tgz#74ce7d5fd815fa60fe0a85b9db7549b1dcb32804" + integrity sha512-OH1/09CGUJwffA+HNM6mqPkSIyHVC3ZnURU/4CCIx7IqWUBn1Sh1HRLQC8/TWNgcs0/1u7ygnc2pgf/AHZJ/Ow== -esbuild-windows-32@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz#a173757bc6dfd0f2656ff40b64f7f9290745778e" - integrity sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw== +esbuild-windows-32@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.44.tgz#499e1c6cb46c216bdcb62f5b006fec3999bb06a7" + integrity sha512-mCAOL9/rRqwfOfxTu2sjq/eAIs7eAXGiU6sPBnowggI7QS953Iq6o3/uDu010LwfN7zr18c/lEj6/PTwwTB3AA== -esbuild-windows-64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz#c447b23126aad158c4fe6a394342cafd97926ed1" - integrity sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw== +esbuild-windows-64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.44.tgz#a8dae69a4615b17f62375859ce9536dd96940a06" + integrity sha512-AG6BH3+YG0s2Q/IfB1cm68FdyFnoE1P+GFbmgFO3tA4UIP8+BKsmKGGZ5I3+ZjcnzOwvT74bQRVrfnQow2KO5Q== -esbuild-windows-arm64@0.14.43: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz#3caed1b430d394d7a7836407b9d36c4750246e76" - integrity sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw== +esbuild-windows-arm64@0.14.44: + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.44.tgz#db73bb68aa75a880bdaa938ccacc0f17e7a4bfea" + integrity sha512-ygYPfYE5By4Sd6szsNr10B0RtWVNOSGmZABSaj4YQBLqh9b9i45VAjVWa8tyIy+UAbKF7WGwybi2wTbSVliO8A== esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.39: - version "0.14.43" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz#c227d585c512d3e0f23b88f50b8e16501147f647" - integrity sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA== + version "0.14.44" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.44.tgz#27fa3cd4f55d36780650c7f32cab581abc7a4473" + integrity sha512-Rn+lRRfj60r/3svI6NgAVnetzp3vMOj17BThuhshSj/gS1LR03xrjkDYyfPmrYG/0c3D68rC6FNYMQ3yRbiXeQ== optionalDependencies: - esbuild-android-64 "0.14.43" - esbuild-android-arm64 "0.14.43" - esbuild-darwin-64 "0.14.43" - esbuild-darwin-arm64 "0.14.43" - esbuild-freebsd-64 "0.14.43" - esbuild-freebsd-arm64 "0.14.43" - esbuild-linux-32 "0.14.43" - esbuild-linux-64 "0.14.43" - esbuild-linux-arm "0.14.43" - esbuild-linux-arm64 "0.14.43" - esbuild-linux-mips64le "0.14.43" - esbuild-linux-ppc64le "0.14.43" - esbuild-linux-riscv64 "0.14.43" - esbuild-linux-s390x "0.14.43" - esbuild-netbsd-64 "0.14.43" - esbuild-openbsd-64 "0.14.43" - esbuild-sunos-64 "0.14.43" - esbuild-windows-32 "0.14.43" - esbuild-windows-64 "0.14.43" - esbuild-windows-arm64 "0.14.43" + esbuild-android-64 "0.14.44" + esbuild-android-arm64 "0.14.44" + esbuild-darwin-64 "0.14.44" + esbuild-darwin-arm64 "0.14.44" + esbuild-freebsd-64 "0.14.44" + esbuild-freebsd-arm64 "0.14.44" + esbuild-linux-32 "0.14.44" + esbuild-linux-64 "0.14.44" + esbuild-linux-arm "0.14.44" + esbuild-linux-arm64 "0.14.44" + esbuild-linux-mips64le "0.14.44" + esbuild-linux-ppc64le "0.14.44" + esbuild-linux-riscv64 "0.14.44" + esbuild-linux-s390x "0.14.44" + esbuild-netbsd-64 "0.14.44" + esbuild-openbsd-64 "0.14.44" + esbuild-sunos-64 "0.14.44" + esbuild-windows-32 "0.14.44" + esbuild-windows-64 "0.14.44" + esbuild-windows-arm64 "0.14.44" escalade@^3.1.1: version "3.1.1" From cfd98d5ecb1ccf1bbdd9a6b219f510f1c7cab1e4 Mon Sep 17 00:00:00 2001 From: Nick Marinelli Date: Wed, 15 Jun 2022 22:43:12 -0400 Subject: [PATCH 111/590] export more artifacts from azure-devops Signed-off-by: Nick Marinelli --- plugins/azure-devops/src/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts index 48177ee830..32399b1dff 100644 --- a/plugins/azure-devops/src/index.ts +++ b/plugins/azure-devops/src/index.ts @@ -25,6 +25,10 @@ export { } from './plugin'; export { AzurePullRequestsIcon } from './components/AzurePullRequestsIcon'; +export { AzureGitTagsIcon } from './components/AzureGitTagsIcon'; + +export { azureDevOpsApiRef } from './api'; +export * from './hooks'; export { FilterType } from './components/PullRequestsPage'; export type { From ed8be85103f253f431e71cec9d03825e3acf1e74 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 02:44:14 +0000 Subject: [PATCH 112/590] fix(deps): update dependency marked to v4.0.17 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 71207f9eb5..7c7098e16e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17657,9 +17657,9 @@ markdown-table@^3.0.0: integrity sha512-CBbaYXKSGnE1uLRpKA1SWgIRb2PQrpkllNWpZtZe6VojOJ4ysqiq7/2glYcmKsOYN09QgH/HEBX5hIshAeiK6A== marked@^4.0.14: - version "4.0.16" - resolved "https://registry.npmjs.org/marked/-/marked-4.0.16.tgz#9ec18fc1a723032eb28666100344d9428cf7a264" - integrity sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA== + version "4.0.17" + resolved "https://registry.npmjs.org/marked/-/marked-4.0.17.tgz#1186193d85bb7882159cdcfc57d1dfccaffb3fe9" + integrity sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA== match-sorter@^6.0.2: version "6.3.1" From e049e410489548fac3402264f335ac8da55b7376 Mon Sep 17 00:00:00 2001 From: Nick Marinelli Date: Wed, 15 Jun 2022 22:55:43 -0400 Subject: [PATCH 113/590] changeset Signed-off-by: Nick Marinelli --- .changeset/smooth-sheep-hide.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smooth-sheep-hide.md diff --git a/.changeset/smooth-sheep-hide.md b/.changeset/smooth-sheep-hide.md new file mode 100644 index 0000000000..8a65602ca9 --- /dev/null +++ b/.changeset/smooth-sheep-hide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-azure-devops': patch +--- + +Exporting azureDevOpsApiRef, AzureGitTagsIcon, and all hooks for the benefit of other plugins. From 1d347fdd6a59fd23af709847252586a101e7df1e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 03:57:53 +0000 Subject: [PATCH 114/590] fix(deps): update dependency mini-css-extract-plugin to v2.6.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 7c7098e16e..d248c5306e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18351,9 +18351,9 @@ min-indent@^1.0.0: integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= mini-css-extract-plugin@^2.4.2: - version "2.6.0" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" - integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + version "2.6.1" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" + integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== dependencies: schema-utils "^4.0.0" From 25910ef3231c4a9543ea1d687a3b2a5f91f30122 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 05:00:13 +0000 Subject: [PATCH 115/590] fix(deps): update dependency react-ga to v3.3.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 d248c5306e..21ef414975 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21430,9 +21430,9 @@ react-fast-compare@^3.1.1: integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== react-ga@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/react-ga/-/react-ga-3.3.0.tgz#c91f407198adcb3b49e2bc5c12b3fe460039b3ca" - integrity sha512-o8RScHj6Lb8cwy3GMrVH6NJvL+y0zpJvKtc0+wmH7Bt23rszJmnqEQxRbyrqUzk9DTJIHoP42bfO5rswC9SWBQ== + version "3.3.1" + resolved "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz#d8e1f4e05ec55ed6ff944dcb14b99011dfaf9504" + integrity sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ== react-helmet@6.1.0: version "6.1.0" From 7db337bb985454b6a800c4cb941804b9ab9b0bb1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 05:54:14 +0000 Subject: [PATCH 116/590] chore(deps): update dependency @changesets/cli to v2.23.0 Signed-off-by: Renovate Bot --- yarn.lock | 424 +++++++++++++++++++++++++----------------------------- 1 file changed, 196 insertions(+), 228 deletions(-) diff --git a/yarn.lock b/yarn.lock index 21ef414975..e30e3ec737 100644 --- a/yarn.lock +++ b/yarn.lock @@ -679,7 +679,7 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" -"@babel/highlight@^7.0.0", "@babel/highlight@^7.16.7": +"@babel/highlight@^7.0.0": version "7.16.10" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== @@ -688,6 +688,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8": version "7.17.9" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" @@ -1424,13 +1433,20 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.17.7" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.10.4": + version "7.18.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" + integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -1522,10 +1538,10 @@ resolve-from "^5.0.0" semver "^5.4.1" -"@changesets/assemble-release-plan@^5.1.2": - version "5.1.2" - resolved "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.1.2.tgz#63ed3a00f62b5af08a82e83801a252ac9726c625" - integrity sha512-nOFyDw4APSkY/vh5WNwGEtThPgEjVShp03PKVdId6wZTJALVcAALCSLmDRfeqjE2z9EsGJb7hZdDlziKlnqZgw== +"@changesets/assemble-release-plan@^5.1.3": + version "5.1.3" + resolved "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.1.3.tgz#b415c5db64e5a30c53aed8c1adc5ab4c4aaad283" + integrity sha512-I+TTkUoqvxBEuDLoJfJYKDXIJ+nyiTbVJ8KGhpXEsLq4N/ms/AStSbouJwF2d/p3cB+RCPr5+gXh31GSN4kA7w== dependencies: "@babel/runtime" "^7.10.4" "@changesets/errors" "^0.1.4" @@ -1542,18 +1558,18 @@ "@changesets/types" "^5.0.0" "@changesets/cli@^2.14.0": - version "2.22.0" - resolved "https://registry.npmjs.org/@changesets/cli/-/cli-2.22.0.tgz#3bdbfb4a7a81ef37f63114e77da84e23f906b763" - integrity sha512-4bA3YoBkd5cm5WUxmrR2N9WYE7EeQcM+R3bVYMUj2NvffkQVpU3ckAI+z8UICoojq+HRl2OEwtz+S5UBmYY4zw== + version "2.23.0" + resolved "https://registry.npmjs.org/@changesets/cli/-/cli-2.23.0.tgz#e325b2d1b0484188671f684773b8cd5d42d068f1" + integrity sha512-Gi3tMi0Vr6eNd8GX6q73tbOm9XOzGfuLEm4PYVeWG2neg5DlRGNOjYwrFULJ/An3N9MHtHn4r5h1Qvnju9Ijug== dependencies: "@babel/runtime" "^7.10.4" "@changesets/apply-release-plan" "^6.0.0" - "@changesets/assemble-release-plan" "^5.1.2" + "@changesets/assemble-release-plan" "^5.1.3" "@changesets/changelog-git" "^0.1.11" "@changesets/config" "^2.0.0" "@changesets/errors" "^0.1.4" "@changesets/get-dependents-graph" "^1.3.2" - "@changesets/get-release-plan" "^3.0.8" + "@changesets/get-release-plan" "^3.0.9" "@changesets/git" "^1.3.2" "@changesets/logger" "^0.0.5" "@changesets/pre" "^1.0.11" @@ -1563,6 +1579,7 @@ "@manypkg/get-packages" "^1.1.3" "@types/is-ci" "^3.0.0" "@types/semver" "^6.0.0" + ansi-colors "^4.1.3" chalk "^2.1.0" enquirer "^2.3.0" external-editor "^3.1.0" @@ -1577,7 +1594,7 @@ semver "^5.4.1" spawndamnit "^2.0.0" term-size "^2.1.0" - tty-table "^2.8.10" + tty-table "^4.1.5" "@changesets/config@^2.0.0": version "2.0.0" @@ -1610,13 +1627,13 @@ fs-extra "^7.0.1" semver "^5.4.1" -"@changesets/get-release-plan@^3.0.8": - version "3.0.8" - resolved "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.8.tgz#2ac7c4f7903aedede3d27af66311ad1db7937e5d" - integrity sha512-TJYiWNuP0Lzu2dL/KHuk75w7TkiE5HqoYirrXF7SJIxkhlgH9toQf2C7IapiFTObtuF1qDN8HJAX1CuIOwXldg== +"@changesets/get-release-plan@^3.0.9": + version "3.0.9" + resolved "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.9.tgz#d445660f3679cb65e05e02adfbca037a25b45943" + integrity sha512-5C1r4DcOjVxcCvPmXpymeyT6mdSTLCNiB2L+5uf19BRkDKndJdIQorH5Fe2XBR2nHUcZQFT+2TXDzCepat969w== dependencies: "@babel/runtime" "^7.10.4" - "@changesets/assemble-release-plan" "^5.1.2" + "@changesets/assemble-release-plan" "^5.1.3" "@changesets/config" "^2.0.0" "@changesets/pre" "^1.0.11" "@changesets/read" "^0.5.5" @@ -6642,9 +6659,9 @@ integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== "@types/semver@^6.0.0": - version "6.2.1" - resolved "https://registry.npmjs.org/@types/semver/-/semver-6.2.1.tgz#a236185670a7860f1597cf73bea2e16d001461ba" - integrity sha512-+beqKQOh9PYxuHvijhVl+tIHvT6tuwOrE9m14zd+MT2A38KoKZhh7pYJ0SNleLtwDsiIxHDsIk9bv01oOxvSvA== + version "6.2.3" + resolved "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" + integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== "@types/semver@^7.3.8": version "7.3.10" @@ -7476,10 +7493,10 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^3.0.0: version "3.2.0" @@ -7873,6 +7890,16 @@ array-unique@^0.3.2: resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.3: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + array.prototype.flat@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" @@ -7900,7 +7927,7 @@ arraybuffer.slice@~0.0.7: arrify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== arrify@^2.0.0, arrify@^2.0.1: version "2.0.1" @@ -9221,9 +9248,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.1.0, ci-info@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" - integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + version "3.3.2" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -9407,7 +9434,7 @@ clone@2.x, clone@^2.1.1, clone@^2.1.2: clone@^1.0.2: version "1.0.4" resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== cloneable-readable@^1.0.0: version "1.1.3" @@ -9514,7 +9541,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" @@ -10180,7 +10207,7 @@ cross-fetch@3.1.5, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.3, c cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -10456,30 +10483,30 @@ csstype@^3.0.2, csstype@^3.0.6: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== -csv-generate@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/csv-generate/-/csv-generate-3.2.4.tgz#440dab9177339ee0676c9e5c16f50e2b3463c019" - integrity sha512-qNM9eqlxd53TWJeGtY1IQPj90b563Zx49eZs8e0uMyEvPgvNVmX1uZDtdzAcflB3PniuH9creAzcFOdyJ9YGvA== +csv-generate@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" + integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== -csv-parse@^4.8.8: - version "4.12.0" - resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-4.12.0.tgz#fd42d6291bbaadd51d3009f6cadbb3e53b4ce026" - integrity sha512-wPQl3H79vWLPI8cgKFcQXl0NBgYYEqVnT1i6/So7OjMpsI540oD7p93r3w6fDSyPvwkTepG05F69/7AViX2lXg== +csv-parse@^4.16.3: + version "4.16.3" + resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" + integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== -csv-stringify@^5.3.6: - version "5.5.1" - resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.5.1.tgz#f42cdd379b0f7f142933a11f674b1a91ebd0fcd0" - integrity sha512-HM0/86Ks8OwFbaYLd495tqTs1NhscZL52dC4ieKYumy8+nawQYC0xZ63w1NqLf0M148T2YLYqowoImc1giPn0g== +csv-stringify@^5.6.5: + version "5.6.5" + resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" + integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== -csv@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/csv/-/csv-5.3.2.tgz#50b344e25dfbb8c62684a1bcec18c22468b2161e" - integrity sha512-odDyucr9OgJTdGM2wrMbJXbOkJx3nnUX3Pt8SFOwlAMOpsUQlz1dywvLMXJWX/4Ib0rjfOsaawuuwfI5ucqBGQ== +csv@^5.5.0: + version "5.5.3" + resolved "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" + integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== dependencies: - csv-generate "^3.2.4" - csv-parse "^4.8.8" - csv-stringify "^5.3.6" - stream-transform "^2.0.1" + csv-generate "^3.4.3" + csv-parse "^4.16.3" + csv-stringify "^5.6.5" + stream-transform "^2.1.3" cypress-plugin-snapshots@^1.4.4: version "1.4.4" @@ -10886,7 +10913,7 @@ debuglog@^1.0.1: decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -10894,7 +10921,7 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js-light@^2.4.1: version "2.5.0" @@ -10969,7 +10996,7 @@ default-gateway@^6.0.3: defaults@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== dependencies: clone "^1.0.2" @@ -10988,14 +11015,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-properties@^1.1.4: +define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== @@ -11103,9 +11123,9 @@ detect-indent@^5.0.0: integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= detect-indent@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" - integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-libc@^1.0.3: version "1.0.3" @@ -11655,7 +11675,7 @@ error@^10.4.0: resolved "https://registry.npmjs.org/error/-/error-10.4.0.tgz#6fcf0fd64bceb1e750f8ed9a3dd880f00e46a487" integrity sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw== -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es-abstract@^1.19.1: +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.19.1: version "1.19.1" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== @@ -11681,7 +11701,7 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.19.0, es- string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" -es-abstract@^1.19.2, es-abstract@^1.19.5: +es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5: version "1.20.1" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== @@ -11892,7 +11912,7 @@ escape-html@^1.0.3, escape-html@~1.0.3: escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -13377,13 +13397,13 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.1.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" get-monorepo-packages@^1.1.0: version "1.2.0" @@ -13796,12 +13816,12 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.9" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -13998,12 +14018,7 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-bigints@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -14023,7 +14038,7 @@ has-cors@1.1.0: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -14037,12 +14052,7 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-symbols@^1.0.3: +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -14909,7 +14919,7 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" @@ -14917,9 +14927,11 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" @@ -14929,11 +14941,12 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.1.5: version "1.1.6" @@ -14971,14 +14984,14 @@ is-ci@^3.0.0, is-ci@^3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.1.0, is-core-module@^2.2.0, is-core-module@^2.8.0: +is-core-module@^2.1.0, is-core-module@^2.2.0: version "2.8.1" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" -is-core-module@^2.8.1: +is-core-module@^2.8.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -15000,9 +15013,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-decimal@^1.0.0: version "1.0.4" @@ -15151,12 +15166,7 @@ is-module@^1.0.0: resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-negative-zero@^2.0.2: +is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -15172,9 +15182,11 @@ is-npm@^5.0.0: integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -15318,12 +15330,7 @@ is-scoped@^2.1.0: dependencies: scoped-regex "^2.0.0" -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - -is-shared-array-buffer@^1.0.2: +is-shared-array-buffer@^1.0.1, is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== @@ -15365,18 +15372,18 @@ is-string@^1.0.5, is-string@^1.0.7: has-tostringtag "^1.0.0" is-subdir@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-subdir/-/is-subdir-1.1.1.tgz#423e66902f9c5f159b9cc4826c820df083059538" - integrity sha512-VYpq0S7gPBVkkmfwkvGnx1EL9UVIo87NQyNcgMiNUdQCws3CJm5wj2nB+XPL7zigvjxhuZgp3bl2yBcKkSIj1w== + version "1.2.0" + resolved "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" + integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== dependencies: better-path-resolve "1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-text-path@^1.0.1: version "1.0.1" @@ -15425,14 +15432,7 @@ is-utf8@^0.2.0, is-utf8@^0.2.1: resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== - dependencies: - call-bind "^1.0.0" - -is-weakref@^1.0.2: +is-weakref@^1.0.1, is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -16424,7 +16424,7 @@ jsonc-parser@^3.0.0: jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -16711,7 +16711,7 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.0.3: +kleur@^4.0.3, kleur@^4.1.4: version "4.1.4" resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== @@ -16909,9 +16909,9 @@ lilconfig@^2.0.3: integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-it@^3.0.1: version "3.0.2" @@ -17292,7 +17292,7 @@ lodash.sortby@^4.7.0: lodash.startcase@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg= + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== lodash.template@^4.5.0: version "4.5.0" @@ -17621,7 +17621,7 @@ map-cache@^0.2.0, map-cache@^0.2.2: map-obj@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0, map-obj@^4.1.0: version "4.3.0" @@ -18346,9 +18346,9 @@ min-document@^2.19.0: dom-walk "^0.1.0" min-indent@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" - integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.4.2: version "2.6.1" @@ -19256,17 +19256,12 @@ object-hash@^2.0.1: resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -object-inspect@^1.12.0, object-inspect@^1.12.2: +object-inspect@^1.11.0, object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -19527,7 +19522,7 @@ os-name@^3.1.0: os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== ospath@^1.2.2: version "1.2.2" @@ -19585,13 +19580,20 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: p-try "^2.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" @@ -19886,17 +19888,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -parse-json@^5.2.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -21070,7 +21062,7 @@ ps-tree@1.2.0: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28, psl@^1.1.33: version "1.8.0" @@ -22324,7 +22316,7 @@ resolve.exports@^1.1.0: resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: version "1.21.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== @@ -22333,7 +22325,7 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.22.0: +resolve@^1.10.0, resolve@^1.22.0: version "1.22.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -22959,7 +22951,7 @@ shallowequal@^1.1.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -22973,7 +22965,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -23114,11 +23106,12 @@ smart-buffer@^4.2.0: resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -smartwrap@^1.2.3: - version "1.2.5" - resolved "https://registry.npmjs.org/smartwrap/-/smartwrap-1.2.5.tgz#45ee3e09ac234e5f7f17c16e916f511834f3cd23" - integrity sha512-bzWRwHwu0RnWjwU7dFy7tF68pDAx/zMSu3g7xr9Nx5J0iSImYInglwEVExyHLxXljy6PWMjkSAbwF7t2mPnRmg== +smartwrap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" + integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== dependencies: + array.prototype.flat "^1.2.3" breakword "^1.0.5" grapheme-splitter "^1.0.4" strip-ansi "^6.0.0" @@ -23372,30 +23365,30 @@ spawndamnit@^2.0.0: signal-exit "^3.0.2" spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.11" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== spdy-transport@^3.0.0: version "3.0.0" @@ -23473,7 +23466,7 @@ sprintf-js@^1.1.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sqlstring@^2.3.2: version "2.3.2" @@ -23658,7 +23651,7 @@ stream-shift@^1.0.0: resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -stream-transform@^2.0.1: +stream-transform@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== @@ -23765,15 +23758,7 @@ string.prototype.matchall@^4.0.7: regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimend@^1.0.5: +string.prototype.trimend@^1.0.4, string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== @@ -23782,15 +23767,7 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.5: +string.prototype.trimstart@^1.0.4, string.prototype.trimstart@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== @@ -23873,7 +23850,7 @@ strip-bom@^2.0.0: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -24305,9 +24282,9 @@ temp@^0.8.4: rimraf "~2.6.2" term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + version "2.2.1" + resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== terminal-link@^2.0.0: version "2.1.1" @@ -24793,17 +24770,18 @@ tty-browserify@0.0.0: resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -tty-table@^2.8.10: - version "2.8.13" - resolved "https://registry.npmjs.org/tty-table/-/tty-table-2.8.13.tgz#d484a416381973eaebbdf19c79136b390e5c6d70" - integrity sha512-eVV/+kB6fIIdx+iUImhXrO22gl7f6VmmYh0Zbu6C196fe1elcHXd7U6LcLXu0YoVPc2kNesWiukYcdK8ZmJ6aQ== +tty-table@^4.1.5: + version "4.1.6" + resolved "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz#6bd58338f36c94cce478c3337934d8a65ab40a73" + integrity sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw== dependencies: - chalk "^3.0.0" - csv "^5.3.1" - smartwrap "^1.2.3" + chalk "^4.1.2" + csv "^5.5.0" + kleur "^4.1.4" + smartwrap "^2.0.2" strip-ansi "^6.0.0" wcwidth "^1.0.1" - yargs "^15.1.0" + yargs "^17.1.1" tunnel-agent@^0.6.0: version "0.6.0" @@ -24961,17 +24939,7 @@ uid2@0.0.3, uid2@0.0.x: resolved "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unbox-primitive@^1.0.2: +unbox-primitive@^1.0.1, unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== @@ -25843,7 +25811,7 @@ which-module@^1.0.0: which-module@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-pm@2.0.0: version "2.0.0" @@ -26201,7 +26169,7 @@ y18n@^5.0.5: yallist@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.2: version "3.1.1" @@ -26289,7 +26257,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.0, yargs@^17.1.1, yargs@^17.2.1: +yargs@^17.0.0, yargs@^17.2.1: version "17.3.1" resolved "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== @@ -26302,7 +26270,7 @@ yargs@^17.0.0, yargs@^17.1.1, yargs@^17.2.1: y18n "^5.0.5" yargs-parser "^21.0.0" -yargs@^17.3.1: +yargs@^17.1.1, yargs@^17.3.1: version "17.5.1" resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== From 6cf0b868c59a49d7a21f5654ef84144b7cc0e1ef Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 06:54:24 +0000 Subject: [PATCH 117/590] chore(deps): update dependency cypress to v10.1.0 Signed-off-by: Renovate Bot --- cypress/yarn.lock | 52 +++++++++++++++++++++++------------------------ yarn.lock | 6 +++--- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/cypress/yarn.lock b/cypress/yarn.lock index 53f61fd113..46f9a158fd 100644 --- a/cypress/yarn.lock +++ b/cypress/yarn.lock @@ -40,14 +40,14 @@ lodash.once "^4.1.1" "@types/node@*": - version "17.0.40" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.40.tgz#76ee88ae03650de8064a6cf75b8d95f9f4a16090" - integrity sha512-UXdBxNGqTMtm7hCwh9HtncFVLrXoqA3oJW30j6XWp5BH/wu3mVeaxo7cq5benFdBw34HB3XDT2TRPI7rXZ+mDg== + version "18.0.0" + resolved "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" + integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== "@types/node@^14.14.31": - version "14.18.20" - resolved "https://registry.npmjs.org/@types/node/-/node-14.18.20.tgz#268f028b36eaf51181c3300252f605488c4f0650" - integrity sha512-Q8KKwm9YqEmUBRsqJ2GWJDtXltBDxTdC4m5vTdXBolu2PeQh8LX+f6BTwU+OuXPu37fLxoN6gidqBmnky36FXA== + version "14.18.21" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz#0155ee46f6be28b2ff0342ca1a9b9fd4468bef41" + integrity sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q== "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" @@ -121,9 +121,9 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.0: - version "3.2.3" - resolved "https://registry.npmjs.org/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" @@ -217,9 +217,9 @@ check-more-types@^2.24.0: integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== ci-info@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" - integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== + version "3.3.2" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== clean-stack@^2.0.0: version "2.2.0" @@ -263,9 +263,9 @@ color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.16: - version "2.0.17" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" - integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -304,9 +304,9 @@ cross-spawn@^7.0.0: which "^2.0.1" cypress@^10.0.0: - version "10.0.3" - resolved "https://registry.npmjs.org/cypress/-/cypress-10.0.3.tgz#889b4bef863b7d1ef1b608b85b964394ad350c5f" - integrity sha512-8C82XTybsEmJC9POYSNITGUhMLCRwB9LadP0x33H+52QVoBjhsWvIzrI+ybCe0+TyxaF0D5/9IL2kSTgjqCB9A== + version "10.1.0" + resolved "https://registry.npmjs.org/cypress/-/cypress-10.1.0.tgz#6514a26c721822a02bc194e9a7f72c3142aea174" + integrity sha512-aQ4JVZVib4Xd9FZW8IRZfKelUvqF4y5A+oUbNvn8TlsBmEfIg3m5Xd6Mt6PVU/jHiVJ9Psl905B3ZPnrDcmyuQ== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -878,7 +878,7 @@ qs@~6.5.2: request-progress@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== dependencies: throttleit "^1.0.0" @@ -1014,12 +1014,12 @@ supports-color@^8.1.1: throttleit@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@~0.2.1: version "0.2.1" @@ -1044,14 +1044,14 @@ tslib@^2.1.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-fest@^0.21.3: version "0.21.3" @@ -1081,7 +1081,7 @@ uuid@^8.3.2: verror@1.10.0: version "1.10.0" resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -1115,7 +1115,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yallist@^4.0.0: version "4.0.0" @@ -1125,7 +1125,7 @@ yallist@^4.0.0: yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" diff --git a/yarn.lock b/yarn.lock index e30e3ec737..04a19c757f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10530,9 +10530,9 @@ cypress-plugin-snapshots@^1.4.4: unidiff "1.0.2" cypress@^10.0.0: - version "10.0.3" - resolved "https://registry.npmjs.org/cypress/-/cypress-10.0.3.tgz#889b4bef863b7d1ef1b608b85b964394ad350c5f" - integrity sha512-8C82XTybsEmJC9POYSNITGUhMLCRwB9LadP0x33H+52QVoBjhsWvIzrI+ybCe0+TyxaF0D5/9IL2kSTgjqCB9A== + version "10.1.0" + resolved "https://registry.npmjs.org/cypress/-/cypress-10.1.0.tgz#6514a26c721822a02bc194e9a7f72c3142aea174" + integrity sha512-aQ4JVZVib4Xd9FZW8IRZfKelUvqF4y5A+oUbNvn8TlsBmEfIg3m5Xd6Mt6PVU/jHiVJ9Psl905B3ZPnrDcmyuQ== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" From cec1cd45786f0b3d4b822b28860d7ec2915f5420 Mon Sep 17 00:00:00 2001 From: ivgo Date: Thu, 16 Jun 2022 09:44:29 +0200 Subject: [PATCH 118/590] Add requested improvements to vault plugin Signed-off-by: ivgo --- plugins/vault-backend/api-report.md | 19 +-------- plugins/vault-backend/config.d.ts | 1 + plugins/vault-backend/package.json | 2 +- .../src/service/VaultBuilder.tsx | 21 +--------- .../src/service/vaultApi.test.ts | 3 +- plugins/vault-backend/src/service/vaultApi.ts | 38 +++++++---------- plugins/vault/api-report.md | 25 +++++++++++ plugins/vault/package.json | 1 + plugins/vault/src/api.test.ts | 42 ++++++++++--------- plugins/vault/src/api.ts | 40 +++++++++++++----- .../EntityVaultTable.test.tsx | 26 ++++++------ .../EntityVaultTable/EntityVaultTable.tsx | 21 ++++++---- plugins/vault/src/conditions.ts | 6 +++ plugins/vault/src/constants.ts | 4 ++ plugins/vault/src/index.ts | 4 ++ yarn.lock | 41 +++--------------- 16 files changed, 147 insertions(+), 147 deletions(-) diff --git a/plugins/vault-backend/api-report.md b/plugins/vault-backend/api-report.md index 1c7e669ef2..9f738b15e9 100644 --- a/plugins/vault-backend/api-report.md +++ b/plugins/vault-backend/api-report.md @@ -12,13 +12,6 @@ import { TaskRunner } from '@backstage/backend-tasks'; // @public export function createRouter(options: RouterOptions): express.Router; -// @public -export type RenewTokenResponse = { - auth: { - client_token: string; - }; -}; - // @public export interface RouterOptions { // (undocumented) @@ -33,7 +26,7 @@ export interface RouterOptions { export interface VaultApi { getFrontendSecretsUrl(): string; listSecrets(secretPath: string): Promise; - renewToken?(): Promise; + renewToken?(): Promise; } // @public @@ -45,7 +38,6 @@ export class VaultBuilder { enableTokenRenew(schedule?: TaskRunner): Promise; // (undocumented) protected readonly env: VaultEnvironment; - protected renewToken(vaultClient: VaultClient): Promise; setVaultClient(vaultClient: VaultClient): this; } @@ -62,7 +54,7 @@ export class VaultClient implements VaultApi { // (undocumented) listSecrets(secretPath: string): Promise; // (undocumented) - renewToken(): Promise; + renewToken(): Promise; } // @public @@ -82,12 +74,5 @@ export type VaultSecret = { editUrl: string; }; -// @public -export type VaultSecretList = { - data: { - keys: string[]; - }; -}; - // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/vault-backend/config.d.ts b/plugins/vault-backend/config.d.ts index b1f917463e..c7aac4db9d 100644 --- a/plugins/vault-backend/config.d.ts +++ b/plugins/vault-backend/config.d.ts @@ -19,6 +19,7 @@ export interface Config { vault?: { /** * The baseUrl for your Vault instance. + * @visibility frontend */ baseUrl: string; diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 651b95f98c..080398ea52 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -54,7 +54,7 @@ "@types/compression": "^1.7.2", "@types/supertest": "^2.0.8", "msw": "^0.42.0", - "supertest": "^4.0.2" + "supertest": "^6.1.6" }, "files": [ "dist", diff --git a/plugins/vault-backend/src/service/VaultBuilder.tsx b/plugins/vault-backend/src/service/VaultBuilder.tsx index aa2858345f..67260f45ca 100644 --- a/plugins/vault-backend/src/service/VaultBuilder.tsx +++ b/plugins/vault-backend/src/service/VaultBuilder.tsx @@ -45,9 +45,6 @@ export type VaultBuilderReturn = { * @public */ export class VaultBuilder { - // private vaultTokenRefreshInterval: Duration = Duration.fromObject({ - // minutes: 60, - // }); private vaultClient?: VaultClient; /** @@ -118,26 +115,12 @@ export class VaultBuilder { fn: async () => { this.env.logger.info('Renewing Vault token'); const vaultClient = this.vaultClient ?? new VaultClient(this.env); - await this.renewToken(vaultClient); + await vaultClient.renewToken(); }, }); return this; } - /** - * Renews the token for vault using a defined client. - * - * @param vaultClient - The vault client used to renew the token - */ - protected async renewToken(vaultClient: VaultClient) { - const result = await vaultClient.renewToken(); - if (!result) { - this.env.logger.warn('Error renewing vault token'); - } else { - this.env.logger.info('Vault token renewed'); - } - } - /** * Builds the backend routes for Vault. * @@ -159,7 +142,7 @@ export class VaultBuilder { } const secrets = await vaultClient.listSecrets(path); - res.json(secrets); + res.json({ items: secrets }); }); return router; diff --git a/plugins/vault-backend/src/service/vaultApi.test.ts b/plugins/vault-backend/src/service/vaultApi.test.ts index 5a29633933..e80703c99f 100644 --- a/plugins/vault-backend/src/service/vaultApi.test.ts +++ b/plugins/vault-backend/src/service/vaultApi.test.ts @@ -93,8 +93,7 @@ describe('VaultApi', () => { it('should return success token renew', async () => { setupHandlers(); const api = new VaultClient({ config }); - const apiRenew = await api.renewToken(); - expect(apiRenew).toBeTruthy(); + expect(await api.renewToken()).toBe(undefined); }); it('should render frontend url', () => { diff --git a/plugins/vault-backend/src/service/vaultApi.ts b/plugins/vault-backend/src/service/vaultApi.ts index 0623780654..ad399dc6ac 100644 --- a/plugins/vault-backend/src/service/vaultApi.ts +++ b/plugins/vault-backend/src/service/vaultApi.ts @@ -15,12 +15,13 @@ */ import { Config } from '@backstage/config'; +import { NotFoundError } from '@backstage/errors'; import fetch from 'cross-fetch'; import { getVaultConfig, VaultConfig } from '../config'; /** * Object received as a response from the Vault API when fetching secrets - * @public + * @internal */ export type VaultSecretList = { data: { @@ -40,9 +41,8 @@ export type VaultSecret = { /** * Object received as response when the token is renewed using the Vault API - * @public */ -export type RenewTokenResponse = { +type RenewTokenResponse = { auth: { client_token: string; }; @@ -63,10 +63,10 @@ export interface VaultApi { */ listSecrets(secretPath: string): Promise; /** - * Optional, to renew the token used to list the secrets. Returns true - * if the action was successfull, false otherwise. + * Optional, to renew the token used to list the secrets. Throws an + * error if the token renewal went wrong. */ - renewToken?(): Promise; + renewToken?(): Promise; } /** @@ -84,7 +84,7 @@ export class VaultClient implements VaultApi { path: string, query: { [key in string]: any }, method: string = 'GET', - ): Promise { + ): Promise { const url = new URL(path, this.vaultConfig.baseUrl); const response = await fetch( `${url.toString()}?${new URLSearchParams(query).toString()}`, @@ -96,15 +96,14 @@ export class VaultClient implements VaultApi { }, }, ); - if (response.status === 200) { + if (response.ok) { return (await response.json()) as T; + } else if (response.status === 404) { + throw new NotFoundError(`No secrets found in path '${path}'`); } - return undefined; - } - - private isFolder(secretName: string): boolean { - const regex = /^.*\/$/gm; - return regex.test(secretName); + throw new Error( + `Unexpected error while fetching secrets from path '${path}'`, + ); } getFrontendSecretsUrl(): string { @@ -117,14 +116,11 @@ export class VaultClient implements VaultApi { ? `v1/${this.vaultConfig.secretEngine}/metadata/${secretPath}` : `v1/${this.vaultConfig.secretEngine}/${secretPath}`; const result = await this.callApi(listUrl, { list: true }); - if (!result) { - return []; - } const secrets: VaultSecret[] = []; await Promise.all( result.data.keys.map(async secret => { - if (this.isFolder(secret)) { + if (secret.endsWith('/')) { secrets.push( ...(await this.listSecrets(`${secretPath}/${secret.slice(0, -1)}`)), ); @@ -141,17 +137,13 @@ export class VaultClient implements VaultApi { return secrets; } - async renewToken(): Promise { + async renewToken(): Promise { const result = await this.callApi( 'v1/auth/token/renew-self', {}, 'POST', ); - if (!result) { - return false; - } this.vaultConfig.token = result.auth.client_token; - return true; } } diff --git a/plugins/vault/api-report.md b/plugins/vault/api-report.md index a0b5773c70..215ee274ec 100644 --- a/plugins/vault/api-report.md +++ b/plugins/vault/api-report.md @@ -5,13 +5,38 @@ ```ts /// +import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; // @public export const EntityVaultCard: () => JSX.Element; +// Warning: (ae-missing-release-tag) "isVaultAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export function isVaultAvailable(entity: Entity): boolean; + +// @public (undocumented) +export const VAULT_SECRET_PATH_ANNOTATION = 'vault.io/secrets-path'; + +// @public +export interface VaultApi { + listSecrets(secretPath: string): Promise; +} + +// @public (undocumented) +export const vaultApiRef: ApiRef; + // @public export const vaultPlugin: BackstagePlugin<{}, {}>; +// @public +export type VaultSecret = { + name: string; + showUrl: string; + editUrl: string; +}; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 54fc7cfc90..c4b447eaca 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -37,6 +37,7 @@ "@backstage/catalog-model": "^1.0.3", "@backstage/core-components": "^0.9.5", "@backstage/core-plugin-api": "^1.0.3", + "@backstage/errors": "^1.0.0", "@backstage/plugin-catalog-react": "^1.1.1", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", diff --git a/plugins/vault/src/api.test.ts b/plugins/vault/src/api.test.ts index 70c6a553df..3733d8be0f 100644 --- a/plugins/vault/src/api.test.ts +++ b/plugins/vault/src/api.test.ts @@ -27,18 +27,20 @@ describe('api', () => { const mockBaseUrl = 'https://api-vault.com/api/vault'; const discoveryApi = UrlPatternDiscovery.compile(mockBaseUrl); - const mockSecretsResult: VaultSecret[] = [ - { - name: 'secret::one', - editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, - showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::one`, - }, - { - name: 'secret::two', - editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::two`, - showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::two`, - }, - ]; + const mockSecretsResult: { items: VaultSecret[] } = { + items: [ + { + name: 'secret::one', + editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, + showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::one`, + }, + { + name: 'secret::two', + editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::two`, + showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::two`, + }, + ], + }; const setupHandlers = () => { server.use( @@ -47,31 +49,33 @@ describe('api', () => { if (path === 'test/success') { return res(ctx.json(mockSecretsResult)); } else if (path === 'test/error') { - return res(ctx.json([])); + return res(ctx.json({ items: [] })); } return res(ctx.status(400)); }), + rest.get(`${mockBaseUrl}/v1/secrets/`, (_req, res, ctx) => { + return res(ctx.json(mockSecretsResult)); + }), ); }; it('should return secrets', async () => { setupHandlers(); const api = new VaultClient({ discoveryApi }); - const secrets = await api.listSecrets('test/success'); - expect(secrets).toEqual(mockSecretsResult); + expect(await api.listSecrets('test/success')).toEqual( + mockSecretsResult.items, + ); }); it('should return empty secret list', async () => { setupHandlers(); const api = new VaultClient({ discoveryApi }); expect(await api.listSecrets('test/error')).toEqual([]); - expect(await api.listSecrets('')).toEqual([]); }); - it('should return no secrets', async () => { + it('should return all the secrets if no path defined', async () => { setupHandlers(); const api = new VaultClient({ discoveryApi }); - const secrets = await api.listSecrets(''); - expect(secrets).toEqual([]); + expect(await api.listSecrets('')).toEqual(mockSecretsResult.items); }); }); diff --git a/plugins/vault/src/api.ts b/plugins/vault/src/api.ts index 74b212429f..6c17e34d9a 100644 --- a/plugins/vault/src/api.ts +++ b/plugins/vault/src/api.ts @@ -14,21 +14,41 @@ * limitations under the License. */ import { DiscoveryApi, createApiRef } from '@backstage/core-plugin-api'; +import { NotFoundError } from '@backstage/errors'; +/** + * @public + */ export const vaultApiRef = createApiRef({ id: 'plugin.vault.service', }); +/** + * Object containing the secret name and some links. + * @public + */ export type VaultSecret = { name: string; showUrl: string; editUrl: string; }; +/** + * Interface for the VaultApi. + * @public + */ export interface VaultApi { + /** + * Returns a list of secrets used to show in a table. + * @param secretPath - The path where the secrets are stored in Vault + */ listSecrets(secretPath: string): Promise; } +/** + * Default implementation of the VaultApi. + * @public + */ export class VaultClient implements VaultApi { private readonly discoveryApi: DiscoveryApi; @@ -39,7 +59,7 @@ export class VaultClient implements VaultApi { private async callApi( path: string, query: { [key in string]: any }, - ): Promise { + ): Promise { const apiUrl = `${await this.discoveryApi.getBaseUrl('vault')}`; const response = await fetch( `${apiUrl}/${path}?${new URLSearchParams(query).toString()}`, @@ -49,23 +69,21 @@ export class VaultClient implements VaultApi { }, }, ); - if (response.status === 200) { + if (response.ok) { return (await response.json()) as T; + } else if (response.status === 404) { + throw new NotFoundError(`No secrets found in path '${path}'`); } - return undefined; + throw new Error( + `Unexpected error while fetching secrets from path '${path}'`, + ); } async listSecrets(secretPath: string): Promise { - if (secretPath === '') { - return []; - } - const result = await this.callApi( + const result = await this.callApi<{ items: VaultSecret[] }>( `v1/secrets/${encodeURIComponent(secretPath)}`, {}, ); - if (!result) { - return []; - } - return result; + return result.items; } } diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx index f2b181562a..f3d7748b3e 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx @@ -68,18 +68,20 @@ describe('EntityVaultTable', () => { }, }; - const mockSecretsResult: VaultSecret[] = [ - { - name: 'secret::one', - editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, - showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::one`, - }, - { - name: 'secret::two', - editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::two`, - showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::two`, - }, - ]; + const mockSecretsResult: { items: VaultSecret[] } = { + items: [ + { + name: 'secret::one', + editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, + showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::one`, + }, + { + name: 'secret::two', + editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::two`, + showUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/show/test/success/secret::two`, + }, + ], + }; const setupHandlers = () => { server.use( diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx index 197c82c5b8..8311dea2aa 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; import { Entity } from '@backstage/catalog-model'; -import { Table, TableColumn } from '@backstage/core-components'; +import { Link, Table, TableColumn } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; import { Box, Typography } from '@material-ui/core'; import Edit from '@material-ui/icons/Edit'; @@ -27,7 +27,7 @@ import { VAULT_SECRET_PATH_ANNOTATION } from '../../constants'; export const vaultSecretPath = (entity: Entity) => { const secretPath = - entity.metadata.annotations?.[VAULT_SECRET_PATH_ANNOTATION] ?? ''; + entity.metadata.annotations?.[VAULT_SECRET_PATH_ANNOTATION]; return { secretPath }; }; @@ -35,6 +35,11 @@ export const vaultSecretPath = (entity: Entity) => { export const EntityVaultTable = ({ entity }: { entity: Entity }) => { const vaultApi = useApi(vaultApiRef); const { secretPath } = vaultSecretPath(entity); + if (!secretPath) { + throw Error( + `The secret path is undefined. Please, define the annotation ${VAULT_SECRET_PATH_ANNOTATION}`, + ); + } const { value, loading, error } = useAsync(async (): Promise< VaultSecret[] > => { @@ -51,22 +56,22 @@ export const EntityVaultTable = ({ entity }: { entity: Entity }) => { return { secret: secret.name, view: ( - - + ), edit: ( - - + ), }; }); diff --git a/plugins/vault/src/conditions.ts b/plugins/vault/src/conditions.ts index 0ce34085e0..091c7117c2 100644 --- a/plugins/vault/src/conditions.ts +++ b/plugins/vault/src/conditions.ts @@ -16,6 +16,12 @@ import { Entity } from '@backstage/catalog-model'; import { VAULT_SECRET_PATH_ANNOTATION } from './constants'; +/** + * Checks if an entity contains the annotation for Vault. + * @param entity - The entity to check if the annotation exists + * @returns If the annotation exists or not + * @public + */ export function isVaultAvailable(entity: Entity): boolean { return Boolean( entity.metadata.annotations?.hasOwnProperty(VAULT_SECRET_PATH_ANNOTATION), diff --git a/plugins/vault/src/constants.ts b/plugins/vault/src/constants.ts index 1ac8b80b73..0d99c261d4 100644 --- a/plugins/vault/src/constants.ts +++ b/plugins/vault/src/constants.ts @@ -13,4 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** + * @public + */ export const VAULT_SECRET_PATH_ANNOTATION = 'vault.io/secrets-path'; diff --git a/plugins/vault/src/index.ts b/plugins/vault/src/index.ts index c2d1fc3419..f69a787963 100644 --- a/plugins/vault/src/index.ts +++ b/plugins/vault/src/index.ts @@ -14,3 +14,7 @@ * limitations under the License. */ export { vaultPlugin, EntityVaultCard } from './plugin'; +export { isVaultAvailable } from './conditions'; +export { VAULT_SECRET_PATH_ANNOTATION } from './constants'; +export { vaultApiRef } from './api'; +export type { VaultApi, VaultSecret } from './api'; diff --git a/yarn.lock b/yarn.lock index e30e3ec737..5454ec7513 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9718,7 +9718,7 @@ component-emitter@1.2.1: resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= -component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0: +component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -10032,7 +10032,7 @@ cookie@0.5.0, cookie@~0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookiejar@^2.1.0, cookiejar@^2.1.3: +cookiejar@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== @@ -13048,7 +13048,7 @@ form-data-encoder@^1.4.3, form-data-encoder@^1.7.1: resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== -form-data@^2.3.1, form-data@^2.3.2, form-data@^2.5.0: +form-data@^2.3.2, form-data@^2.5.0: version "2.5.1" resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== @@ -13105,11 +13105,6 @@ formdata-node@^4.3.1: node-domexception "1.0.0" web-streams-polyfill "4.0.0-beta.1" -formidable@^1.2.0: - version "1.2.6" - resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" - integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== - formidable@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" @@ -17954,7 +17949,7 @@ meros@^1.1.4: resolved "https://registry.npmjs.org/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948" integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ== -methods@^1.0.0, methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: +methods@^1.0.0, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -18293,7 +18288,7 @@ mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, m dependencies: mime-db "1.52.0" -mime@1.6.0, mime@^1.3.4, mime@^1.4.1: +mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -21148,7 +21143,7 @@ q@^1.5.1: resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.10.3, qs@^6.10.1, qs@^6.10.2, qs@^6.10.3, qs@^6.5.1, qs@^6.9.1, qs@^6.9.4, qs@^6.9.6: +qs@6.10.3, qs@^6.10.1, qs@^6.10.2, qs@^6.10.3, qs@^6.9.1, qs@^6.9.4, qs@^6.9.6: version "6.10.3" resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== @@ -23974,22 +23969,6 @@ sucrase@^3.18.0, sucrase@^3.20.2: pirates "^4.0.1" ts-interface-checker "^0.1.9" -superagent@^3.8.3: - version "3.8.3" - resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" - superagent@^7.1.3: version "7.1.3" resolved "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz#783ff8330e7c2dad6ad8f0095edc772999273b6b" @@ -24007,14 +23986,6 @@ superagent@^7.1.3: readable-stream "^3.6.0" semver "^7.3.7" -supertest@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36" - integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ== - dependencies: - methods "^1.1.2" - superagent "^3.8.3" - supertest@^6.1.3, supertest@^6.1.6: version "6.2.3" resolved "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz#291b220126e5faa654d12abe1ada3658757c8c67" From d548547eca1d94ed0fc8fb0661249b33281bdee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 9 Jun 2022 16:34:45 +0200 Subject: [PATCH 119/590] help add polarpoint to adopters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index c66bab4266..5d3a09999f 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -178,4 +178,5 @@ _If you're using Backstage in your organization, please try to add your company | [GlovoApp](http://glovoapp.com/) | [Chris Biancucci](mailto:christian.biancucci@glovoapp.com) | We have recently adopted Backstage and we are using it to improve our Developer Experience: simplifying, automating, and keeping things in order for every existing and new service developed. | | [Dixa](https://dixa.com) | [Jens Møller](mailto:jsc@dixa.com) | We are in early stages, but using it to get overview of our repositories and ownership of these. We want among many things to use it for compliance and easier access to key metrics for our repos. | | [Notino](https://notino.com) | [Jan Remunda](mailto:jan.remunda@notino.com) | Backstage is our developer portal. We use it as service catalog and for technical documentation. | +| [Polarpoint](https://polarpoint.io/) | [Surj Bains](https://github.com/polarpoint-io) | We are using Backstage as our Developer portal as well as for hosting our DevOps portal for software catalog. | | [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. | From 8b25b8589335472237c6b7a1ee43a2323832d836 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Jun 2022 09:50:19 +0000 Subject: [PATCH 120/590] chore(deps): update dependency prettier to v2.7.1 Signed-off-by: Renovate Bot --- microsite/yarn.lock | 6 +++--- yarn.lock | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 84a93573bd..f4831e2b42 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -5210,9 +5210,9 @@ prepend-http@^2.0.0: integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= prettier@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== prismjs@^1.22.0: version "1.27.0" diff --git a/yarn.lock b/yarn.lock index f33fa3c4b4..5e9224bcc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20804,9 +20804,9 @@ prettier@^1.16.4, prettier@^1.19.1: integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== prettier@^2.2.1: - version "2.6.2" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: version "5.6.0" From 5ebf2c70237a3b4c0ab4a4dd11967aad69505ef2 Mon Sep 17 00:00:00 2001 From: ivgo Date: Thu, 16 Jun 2022 12:42:56 +0200 Subject: [PATCH 121/590] Use p-limit to list secrets, update api-report & add changesets Signed-off-by: ivgo --- .changeset/rude-llamas-lie.md | 5 +++++ .changeset/sharp-planes-turn.md | 5 +++++ plugins/vault-backend/package.json | 1 + plugins/vault-backend/src/service/vaultApi.ts | 11 +++++++++-- plugins/vault/api-report.md | 2 -- 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 .changeset/rude-llamas-lie.md create mode 100644 .changeset/sharp-planes-turn.md diff --git a/.changeset/rude-llamas-lie.md b/.changeset/rude-llamas-lie.md new file mode 100644 index 0000000000..918d61da6d --- /dev/null +++ b/.changeset/rude-llamas-lie.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault': patch +--- + +Export missing parameters and added them to the api-report. Also adapted the API to the expected response from the backend diff --git a/.changeset/sharp-planes-turn.md b/.changeset/sharp-planes-turn.md new file mode 100644 index 0000000000..cc7045a9f7 --- /dev/null +++ b/.changeset/sharp-planes-turn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault-backend': patch +--- + +Throw exceptions instead of swallow them, remove some exported types from the `api-report`, small changes in the API responses & expose the vault `baseUrl` to the frontend as well diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 080398ea52..d0e3990aee 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -46,6 +46,7 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "helmet": "^5.0.2", + "p-limit": "^3.1.0", "winston": "^3.7.2", "yn": "^5.0.0" }, diff --git a/plugins/vault-backend/src/service/vaultApi.ts b/plugins/vault-backend/src/service/vaultApi.ts index ad399dc6ac..14607a694f 100644 --- a/plugins/vault-backend/src/service/vaultApi.ts +++ b/plugins/vault-backend/src/service/vaultApi.ts @@ -17,6 +17,7 @@ import { Config } from '@backstage/config'; import { NotFoundError } from '@backstage/errors'; import fetch from 'cross-fetch'; +import plimit from 'p-limit'; import { getVaultConfig, VaultConfig } from '../config'; /** @@ -75,6 +76,7 @@ export interface VaultApi { */ export class VaultClient implements VaultApi { private vaultConfig: VaultConfig; + private readonly limit = plimit(5); constructor({ config }: { config: Config }) { this.vaultConfig = getVaultConfig(config); @@ -115,14 +117,19 @@ export class VaultClient implements VaultApi { this.vaultConfig.kvVersion === 2 ? `v1/${this.vaultConfig.secretEngine}/metadata/${secretPath}` : `v1/${this.vaultConfig.secretEngine}/${secretPath}`; - const result = await this.callApi(listUrl, { list: true }); + const result = await this.limit(() => + this.callApi(listUrl, { list: true }), + ); const secrets: VaultSecret[] = []; + await Promise.all( result.data.keys.map(async secret => { if (secret.endsWith('/')) { secrets.push( - ...(await this.listSecrets(`${secretPath}/${secret.slice(0, -1)}`)), + ...(await this.limit(() => + this.listSecrets(`${secretPath}/${secret.slice(0, -1)}`), + )), ); } else { secrets.push({ diff --git a/plugins/vault/api-report.md b/plugins/vault/api-report.md index 215ee274ec..f6fa8d1269 100644 --- a/plugins/vault/api-report.md +++ b/plugins/vault/api-report.md @@ -12,8 +12,6 @@ import { Entity } from '@backstage/catalog-model'; // @public export const EntityVaultCard: () => JSX.Element; -// Warning: (ae-missing-release-tag) "isVaultAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public export function isVaultAvailable(entity: Entity): boolean; From 557072e19b8da48a4203b1458436a8eb21cbfb2a Mon Sep 17 00:00:00 2001 From: Maixmilian Ressel Date: Thu, 16 Jun 2022 12:43:32 +0200 Subject: [PATCH 122/590] change some capitalizations Signed-off-by: Maixmilian Ressel --- docs/auth/index.md | 2 +- docs/features/software-templates/writing-templates.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/auth/index.md b/docs/auth/index.md index e644fb74ed..e713e722ef 100644 --- a/docs/auth/index.md +++ b/docs/auth/index.md @@ -187,7 +187,7 @@ sign-in resolvers so that they resolve to the same identity regardless of the me ## Scaffolder Configuration (Software Templates) -If you want to use the authentication capabilities of the [Repository Picker](../features/software-templates/writing-templates.md#the-repository-picker) inside your Software Templates you will need to configure the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi) alongside your authentication provider. It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed. +If you want to use the authentication capabilities of the [Repository Picker](../features/software-templates/writing-templates.md#the-repository-picker) inside your software templates you will need to configure the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi) alongside your authentication provider. It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed. To set it up, you'll need to add an API factory entry to `packages/app/src/apis.ts`. The example below sets up the `ScmAuthApi` for an already configured GitLab authentication provider: diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 4078b18a2b..ff9962d8d4 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -398,7 +398,7 @@ token from the user, which you can do on a per-provider basis, in case your template can be published to multiple providers. Note, that you will need to configure an [authentication provider](../../auth/index.md#configuring-authentication-providers), alongside the -[`ScmAuthApi`](../../auth/index.md#scaffolder-configuration-software-templates) for your source code management (scm) service to make this feature work. +[`ScmAuthApi`](../../auth/index.md#scaffolder-configuration-software-templates) for your source code management (SCM) service to make this feature work. ### Accessing the signed-in users details From 0f6b13dab8d7d796b7b105b338e0e3189261e277 Mon Sep 17 00:00:00 2001 From: Yaser Toutah <37777811+YasserToutah@users.noreply.github.com> Date: Thu, 16 Jun 2022 13:42:11 +0300 Subject: [PATCH 123/590] Update ADOPTERS.md Signed-off-by: Patrik Oldsberg --- ADOPTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index c66bab4266..06557bf02c 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -175,7 +175,7 @@ _If you're using Backstage in your organization, please try to add your company | [Stepstone](https://www.stepstone.com/en/) | [Neil Kennedy](mailto:neil.kennedy@stepstone.com) | StepStone is using Backstage to solve problems around ownership and visibility of our applications. We have thousands of repos, multiple legacy systems and a growing platform that is hard to maintain. Backstage is forming the centre of our push to embrace the chaos. | | [idwall](https://idwall.co) | [Rodrigo Catão Araujo](mailto:rodrigo@idwall.co) | Developer Portal for internal engineers to access service catalog, documentation, observability, infrastructure and internal tooling. | | [Jaguar Land Rover](https://www.jaguarlandrover.com) | [Josh Walker](mailto:jwalke18@jaguarlandrover.com) | Users can request a Gitlab user, which creates a commit with the Terraform code. | -| [GlovoApp](http://glovoapp.com/) | [Chris Biancucci](mailto:christian.biancucci@glovoapp.com) | We have recently adopted Backstage and we are using it to improve our Developer Experience: simplifying, automating, and keeping things in order for every existing and new service developed. | +| [Glovo](http://glovoapp.com/) | [Yaser Toutah](mailto:yaser.toutah@glovoapp.com) | Developer Portal to improve our Developer Experience, identify ownership and track metadata for our services and tools. It's our Service Catalog. In addition to that, we use it for Service Creation, and much more. | | [Dixa](https://dixa.com) | [Jens Møller](mailto:jsc@dixa.com) | We are in early stages, but using it to get overview of our repositories and ownership of these. We want among many things to use it for compliance and easier access to key metrics for our repos. | | [Notino](https://notino.com) | [Jan Remunda](mailto:jan.remunda@notino.com) | Backstage is our developer portal. We use it as service catalog and for technical documentation. | | [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. | From 132fc6064646bc17b7fdad69a6e4ae8623048139 Mon Sep 17 00:00:00 2001 From: Nick Marinelli Date: Thu, 16 Jun 2022 09:58:21 -0400 Subject: [PATCH 124/590] api report and export actual api Signed-off-by: Nick Marinelli --- plugins/azure-devops/api-report.md | 186 +++++++++++++++++++++++++++++ plugins/azure-devops/src/index.ts | 2 +- 2 files changed, 187 insertions(+), 1 deletion(-) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 9760340771..6f3a148fb9 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -5,10 +5,22 @@ ```ts /// +import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { BuildRun } from '@backstage/plugin-azure-devops-common'; +import { BuildRunOptions } from '@backstage/plugin-azure-devops-common'; import { DashboardPullRequest } from '@backstage/plugin-azure-devops-common'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; +import { GitTag } from '@backstage/plugin-azure-devops-common'; +import { IdentityApi } from '@backstage/core-plugin-api'; +import { PullRequest } from '@backstage/plugin-azure-devops-common'; +import { PullRequestOptions } from '@backstage/plugin-azure-devops-common'; +import { PullRequestStatus } from '@backstage/plugin-azure-devops-common'; +import { RepoBuild } from '@backstage/plugin-azure-devops-common'; +import { RepoBuildOptions } from '@backstage/plugin-azure-devops-common'; import { SvgIconProps } from '@material-ui/core'; +import { Team } from '@backstage/plugin-azure-devops-common'; // Warning: (ae-missing-release-tag) "AllFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -55,11 +67,117 @@ export type AssignedToUserFilter = BaseFilter & } ); +// Warning: (ae-missing-release-tag) "AzureDevOpsApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface AzureDevOpsApi { + // (undocumented) + getAllTeams(): Promise; + // (undocumented) + getBuildRuns( + projectName: string, + repoName?: string, + definitionName?: string, + options?: BuildRunOptions, + ): Promise<{ + items: BuildRun[]; + }>; + // (undocumented) + getDashboardPullRequests( + projectName: string, + ): Promise; + // (undocumented) + getGitTags( + projectName: string, + repoName: string, + ): Promise<{ + items: GitTag[]; + }>; + // (undocumented) + getPullRequests( + projectName: string, + repoName: string, + options?: PullRequestOptions, + ): Promise<{ + items: PullRequest[]; + }>; + // (undocumented) + getRepoBuilds( + projectName: string, + repoName: string, + options?: RepoBuildOptions, + ): Promise<{ + items: RepoBuild[]; + }>; + // (undocumented) + getUserTeamIds(userId: string): Promise; +} + +// Warning: (ae-missing-release-tag) "azureDevOpsApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const azureDevOpsApiRef: ApiRef; + +// Warning: (ae-missing-release-tag) "AzureDevOpsClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class AzureDevOpsClient implements AzureDevOpsApi { + constructor(options: { + discoveryApi: DiscoveryApi; + identityApi: IdentityApi; + }); + // (undocumented) + getAllTeams(): Promise; + // (undocumented) + getBuildRuns( + projectName: string, + repoName?: string, + definitionName?: string, + options?: BuildRunOptions, + ): Promise<{ + items: BuildRun[]; + }>; + // (undocumented) + getDashboardPullRequests( + projectName: string, + ): Promise; + // (undocumented) + getGitTags( + projectName: string, + repoName: string, + ): Promise<{ + items: GitTag[]; + }>; + // (undocumented) + getPullRequests( + projectName: string, + repoName: string, + options?: PullRequestOptions, + ): Promise<{ + items: PullRequest[]; + }>; + // (undocumented) + getRepoBuilds( + projectName: string, + repoName: string, + options?: RepoBuildOptions, + ): Promise<{ + items: RepoBuild[]; + }>; + // (undocumented) + getUserTeamIds(userId: string): Promise; +} + // Warning: (ae-missing-release-tag) "azureDevOpsPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export const azureDevOpsPlugin: BackstagePlugin<{}, {}>; +// Warning: (ae-missing-release-tag) "AzureGitTagsIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AzureGitTagsIcon: (props: SvgIconProps) => JSX.Element; + // Warning: (ae-missing-release-tag) "AzurePullRequestsIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -226,5 +344,73 @@ export interface PullRequestColumnConfig { // @public (undocumented) export type PullRequestFilter = (pullRequest: DashboardPullRequest) => boolean; +// Warning: (ae-missing-release-tag) "useAllTeams" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function useAllTeams(): { + teams?: Team[]; + loading: boolean; + error?: Error; +}; + +// Warning: (ae-missing-release-tag) "useDashboardPullRequests" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function useDashboardPullRequests( + project?: string, + pollingInterval?: number, +): { + pullRequests?: DashboardPullRequest[]; + loading: boolean; + error?: Error; +}; + +// Warning: (ae-missing-release-tag) "useProjectRepoFromEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function useProjectRepoFromEntity(entity: Entity): { + project: string; + repo: string; +}; + +// Warning: (ae-missing-release-tag) "usePullRequests" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function usePullRequests( + entity: Entity, + defaultLimit?: number, + requestedStatus?: PullRequestStatus, +): { + items?: PullRequest[]; + loading: boolean; + error?: Error; +}; + +// Warning: (ae-missing-release-tag) "useRepoBuilds" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function useRepoBuilds( + entity: Entity, + defaultLimit?: number, +): { + items?: RepoBuild[]; + loading: boolean; + error?: Error; +}; + +// Warning: (ae-missing-release-tag) "useUserEmail" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function useUserEmail(): string | undefined; + +// Warning: (ae-missing-release-tag) "useUserTeamIds" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function useUserTeamIds(userId: string | undefined): { + teamIds?: string[]; + loading: boolean; + error?: Error; +}; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts index 32399b1dff..1f66411d7b 100644 --- a/plugins/azure-devops/src/index.ts +++ b/plugins/azure-devops/src/index.ts @@ -27,7 +27,7 @@ export { export { AzurePullRequestsIcon } from './components/AzurePullRequestsIcon'; export { AzureGitTagsIcon } from './components/AzureGitTagsIcon'; -export { azureDevOpsApiRef } from './api'; +export * from './api'; export * from './hooks'; export { FilterType } from './components/PullRequestsPage'; From 3c6028af1ba2878a91345d7e815d76624425502a Mon Sep 17 00:00:00 2001 From: Nick Marinelli Date: Thu, 16 Jun 2022 11:51:25 -0400 Subject: [PATCH 125/590] add AzurePipelinesIcon Signed-off-by: Nick Marinelli --- plugins/azure-devops/api-report.md | 5 +++++ plugins/azure-devops/src/index.ts | 1 + 2 files changed, 6 insertions(+) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 6f3a148fb9..78880eb389 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -178,6 +178,11 @@ export const azureDevOpsPlugin: BackstagePlugin<{}, {}>; // @public (undocumented) export const AzureGitTagsIcon: (props: SvgIconProps) => JSX.Element; +// Warning: (ae-missing-release-tag) "AzurePipelinesIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AzurePipelinesIcon: (props: SvgIconProps) => JSX.Element; + // Warning: (ae-missing-release-tag) "AzurePullRequestsIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts index 1f66411d7b..def88f68c6 100644 --- a/plugins/azure-devops/src/index.ts +++ b/plugins/azure-devops/src/index.ts @@ -26,6 +26,7 @@ export { export { AzurePullRequestsIcon } from './components/AzurePullRequestsIcon'; export { AzureGitTagsIcon } from './components/AzureGitTagsIcon'; +export { AzurePipelinesIcon } from './components/AzurePipelinesIcon'; export * from './api'; export * from './hooks'; From 04e1504e858d3cb69dd34c8cc45a48bcdb9e4b3b Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Thu, 16 Jun 2022 13:57:53 -0400 Subject: [PATCH 126/590] fix(githubPrBoard): support namespaced teams and all kinds Signed-off-by: Phil Kuang --- .changeset/nasty-zoos-cross.md | 5 +++++ .../src/hooks/useUserRepositories.tsx | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 .changeset/nasty-zoos-cross.md diff --git a/.changeset/nasty-zoos-cross.md b/.changeset/nasty-zoos-cross.md new file mode 100644 index 0000000000..7a658d7209 --- /dev/null +++ b/.changeset/nasty-zoos-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-github-pull-requests-board': patch +--- + +Support namespaced teams and fetch all kinds diff --git a/plugins/github-pull-requests-board/src/hooks/useUserRepositories.tsx b/plugins/github-pull-requests-board/src/hooks/useUserRepositories.tsx index 638a8cb487..b905811aea 100644 --- a/plugins/github-pull-requests-board/src/hooks/useUserRepositories.tsx +++ b/plugins/github-pull-requests-board/src/hooks/useUserRepositories.tsx @@ -14,7 +14,11 @@ * limitations under the License. */ import { useApi } from '@backstage/core-plugin-api'; -import { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react'; +import { + catalogApiRef, + humanizeEntityRef, + useEntity, +} from '@backstage/plugin-catalog-react'; import { useCallback, useEffect, useState } from 'react'; import { getProjectNameFromEntity } from '../utils/functions'; @@ -26,8 +30,7 @@ export function useUserRepositories() { const getRepositoriesNames = useCallback(async () => { const entitiesList = await catalogApi.getEntities({ filter: { - kind: 'Component', - 'spec.owner': teamEntity?.metadata?.name, + 'spec.owner': humanizeEntityRef(teamEntity, { defaultKind: 'group' }), }, }); @@ -36,7 +39,7 @@ export function useUserRepositories() { ); setRepositories([...new Set(entitiesNames)]); - }, [catalogApi, teamEntity?.metadata?.name]); + }, [catalogApi, teamEntity]); useEffect(() => { getRepositoriesNames(); From 9d8ec897eb3a7f64153513983d5ed69c96ba32a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Tresarrieu?= Date: Thu, 16 Jun 2022 20:22:27 +0200 Subject: [PATCH 127/590] feat(MarkdownContent): Expose `transformLinkUri` and `transformImageUri` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Tresarrieu --- .../MarkdownContent/MarkdownContent.test.tsx | 38 +++++++++++++++++++ .../MarkdownContent/MarkdownContent.tsx | 12 +++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx index 2e1550078f..9c08b83c40 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx @@ -62,4 +62,42 @@ describe('', () => { expect(fp2).toBeInTheDocument(); expect(rendered.getByText(');', { selector: 'span' })).toBeInTheDocument(); }); + + it('render MarkdownContent component with transformed link', async () => { + const rendered = await renderWithEffects( + wrapInTestApp( + { + return `${href}-modified`; + }} + />, + ), + ); + const fp1 = rendered.getByText('Title', { + selector: 'a', + }); + expect(fp1).toBeInTheDocument(); + expect(fp1.getAttribute('href')).toEqual( + 'https://backstage.io/link-modified', + ); + }); + + it('render MarkdownContent component with transformed image', async () => { + const rendered = await renderWithEffects( + wrapInTestApp( + { + return `https://example.com/blog/assets/6/header.png`; + }} + />, + ), + ); + const fp1 = rendered.getByAltText('Image'); + expect(fp1).toBeInTheDocument(); + expect(fp1.getAttribute('src')).toEqual( + 'https://example.com/blog/assets/6/header.png', + ); + }); }); diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index df4ad56776..4059482b79 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -68,6 +68,8 @@ type Props = { content: string; dialect?: 'gfm' | 'common-mark'; linkTarget?: Options['linkTarget']; + transformLinkUri?: Options['transformLinkUri']; + transformImageUri?: Options['transformImageUri']; }; const components: Options['components'] = { @@ -91,7 +93,13 @@ const components: Options['components'] = { * If you just want to render to plain [CommonMark](https://commonmark.org/), set the dialect to `'common-mark'` */ export function MarkdownContent(props: Props) { - const { content, dialect = 'gfm', linkTarget } = props; + const { + content, + dialect = 'gfm', + linkTarget, + transformLinkUri, + transformImageUri, + } = props; const classes = useStyles(); return ( ); } From 32204fa79454a1ef5907b6cd5616e022a14b335b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Tresarrieu?= Date: Thu, 16 Jun 2022 20:23:14 +0200 Subject: [PATCH 128/590] chore: add changeset file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Tresarrieu --- .changeset/cool-toys-flow.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cool-toys-flow.md diff --git a/.changeset/cool-toys-flow.md b/.changeset/cool-toys-flow.md new file mode 100644 index 0000000000..799bf3ace4 --- /dev/null +++ b/.changeset/cool-toys-flow.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': minor +--- + +Add `transformLinkUri` and `transformImageUri` to `MarkdownContent` From 1e984b11fccefdffefb4544e448c6040bcd5a741 Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Thu, 16 Jun 2022 15:53:48 -0400 Subject: [PATCH 129/590] refactor(MyGroupsSidebarItem): Render namespaced teams within dropdown items Signed-off-by: Phil Kuang --- .changeset/shiny-turkeys-doubt.md | 5 +++ .../MyGroupsSidebarItem.tsx | 38 +++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 .changeset/shiny-turkeys-doubt.md diff --git a/.changeset/shiny-turkeys-doubt.md b/.changeset/shiny-turkeys-doubt.md new file mode 100644 index 0000000000..0f663a4c74 --- /dev/null +++ b/.changeset/shiny-turkeys-doubt.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Render namespaced teams within dropdown items in `MyGroupsSidebarItem` diff --git a/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx b/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx index fa8f8405ff..445bf8e6fe 100644 --- a/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx +++ b/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx @@ -15,7 +15,11 @@ */ import React from 'react'; -import { stringifyEntityRef } from '@backstage/catalog-model'; +import { + DEFAULT_NAMESPACE, + Entity, + stringifyEntityRef, +} from '@backstage/catalog-model'; import { SidebarItem, SidebarSubmenu, @@ -32,7 +36,6 @@ import { catalogApiRef, CatalogApi, entityRouteRef, - humanizeEntityRef, } from '@backstage/plugin-catalog-react'; import { getCompoundEntityRef } from '@backstage/catalog-model'; @@ -87,23 +90,42 @@ export const MyGroupsSidebarItem = (props: { ); } + const namespacedGroupsMap: { [namespace: string]: Entity[] } = {}; + groups.forEach(group => { + namespacedGroupsMap[group.metadata.namespace!] = + namespacedGroupsMap[group.metadata.namespace!] ?? []; + namespacedGroupsMap[group.metadata.namespace!].push(group); + }); + // Member of more than one group return ( - {groups?.map(function groupsMap(group) { + {namespacedGroupsMap[DEFAULT_NAMESPACE]?.map(group => { return ( ); })} + {Object.entries(namespacedGroupsMap) + .filter(([n]) => n !== DEFAULT_NAMESPACE) + .map(([namespace, namespacedGroups]) => { + return ( + ({ + title: group.metadata.title || group.metadata.name, + to: catalogEntityRoute(getCompoundEntityRef(group)), + }))} + /> + ); + })} ); From 860765ff4524d68d18bf77b7b2895ea195b3c384 Mon Sep 17 00:00:00 2001 From: Niklas Aronsson Date: Mon, 25 Apr 2022 13:15:21 +0200 Subject: [PATCH 130/590] [TechDocs] Added configuration for local publishing target This patch adds a configuration option for setting the "local" techdocs target directory. The target directory can be set using the "techdocs.publisher.local.publishDirectory". This fixes two "TODOs" in the "plugins/techdocs-node/src/stages /publish/local.ts" file: * Use a more persistent storage than node_modules or /tmp directory. Make it configurable with techdocs.publisher.local.publishDirectory * Move the logic of setting staticDocsDir based on config over to fromConfig, and set the value as a class parameter. Signed-off-by: Niklas Aronsson --- .changeset/calm-experts-buy.md | 5 ++ .changeset/weak-llamas-repeat.md | 5 ++ docs/features/techdocs/configuration.md | 6 ++ plugins/techdocs-backend/config.d.ts | 7 +++ .../src/stages/publish/local.test.ts | 27 +++++++++ .../techdocs-node/src/stages/publish/local.ts | 57 +++++++++++-------- 6 files changed, 82 insertions(+), 25 deletions(-) create mode 100644 .changeset/calm-experts-buy.md create mode 100644 .changeset/weak-llamas-repeat.md diff --git a/.changeset/calm-experts-buy.md b/.changeset/calm-experts-buy.md new file mode 100644 index 0000000000..d95844e298 --- /dev/null +++ b/.changeset/calm-experts-buy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': minor +--- + +Added local publishing target directory `config`: `techdocs.publisher.local.publishDirectory` diff --git a/.changeset/weak-llamas-repeat.md b/.changeset/weak-llamas-repeat.md new file mode 100644 index 0000000000..a86ce3a964 --- /dev/null +++ b/.changeset/weak-llamas-repeat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-backend': minor +--- + +Added local publishing target directory `config`: `techdocs.publisher.local.publishDirectory` diff --git a/docs/features/techdocs/configuration.md b/docs/features/techdocs/configuration.md index d14850da77..9440d9a824 100644 --- a/docs/features/techdocs/configuration.md +++ b/docs/features/techdocs/configuration.md @@ -74,6 +74,12 @@ techdocs: type: 'local' + # Optional when techdocs.publisher.type is set to 'local'. + + local: + # (Optional). Set this to specify where the generated documentation is stored. + publishDirectory: '/path/to/local/directory' + # Required when techdocs.publisher.type is set to 'googleGcs'. Skip otherwise. googleGcs: diff --git a/plugins/techdocs-backend/config.d.ts b/plugins/techdocs-backend/config.d.ts index c64a001f5f..fdacc9cfbc 100644 --- a/plugins/techdocs-backend/config.d.ts +++ b/plugins/techdocs-backend/config.d.ts @@ -66,6 +66,13 @@ export interface Config { publisher?: | { type: 'local'; + + local?: { + /** + * Directory to store generated static files. + */ + publishDirectory?: string; + }; } | { type: 'awsS3'; diff --git a/plugins/techdocs-node/src/stages/publish/local.test.ts b/plugins/techdocs-node/src/stages/publish/local.test.ts index 0119def16d..ce2e0c3ccd 100644 --- a/plugins/techdocs-node/src/stages/publish/local.test.ts +++ b/plugins/techdocs-node/src/stages/publish/local.test.ts @@ -236,5 +236,32 @@ describe('local publisher', () => { ); expect(response.status).toBe(404); }); + + it('should work with a configured directory', async () => { + const customConfig = new ConfigReader({ + techdocs: { + publisher: { + local: { + publishDirectory: tmpDir, + }, + }, + }, + }); + mockFs({ + [tmpDir]: { + 'index.html': 'found it', + }, + }); + const legacyPublisher = LocalPublish.fromConfig( + customConfig, + logger, + testDiscovery, + ); + app = express().use(legacyPublisher.docsRouter()); + + const response = await request(app).get('/index.html'); + expect(response.status).toBe(200); + expect(response.text).toEqual('found it'); + }); }); }); diff --git a/plugins/techdocs-node/src/stages/publish/local.ts b/plugins/techdocs-node/src/stages/publish/local.ts index 11c6e6dd2b..1a02cb7eee 100644 --- a/plugins/techdocs-node/src/stages/publish/local.ts +++ b/plugins/techdocs-node/src/stages/publish/local.ts @@ -44,40 +44,27 @@ import { } from './helpers'; import { ForwardedError } from '@backstage/errors'; -// TODO: Use a more persistent storage than node_modules or /tmp directory. -// Make it configurable with techdocs.publisher.local.publishDirectory -let staticDocsDir = ''; -try { - staticDocsDir = resolvePackagePath( - '@backstage/plugin-techdocs-backend', - 'static/docs', - ); -} catch (err) { - // This will most probably never be used. - // The try/catch is introduced so that techdocs-cli can import @backstage/plugin-techdocs-node - // on CI/CD without installing techdocs backend plugin. - staticDocsDir = os.tmpdir(); -} - /** - * Local publisher which uses the local filesystem to store the generated static files. It uses a directory - * called "static" at the root of techdocs-backend plugin. + * Local publisher which uses the local filesystem to store the generated static files. It uses by default a + * directory called "static" at the root of techdocs-backend plugin unless a directory has been configured by + * "techdocs.publisher.local.publishDirectory". */ export class LocalPublish implements PublisherBase { private readonly legacyPathCasing: boolean; private readonly logger: Logger; private readonly discovery: PluginEndpointDiscovery; + private readonly staticDocsDir: string; - // TODO: Move the logic of setting staticDocsDir based on config over to - // fromConfig, and set the value as a class parameter. constructor(options: { logger: Logger; discovery: PluginEndpointDiscovery; legacyPathCasing: boolean; + staticDocsDir: string; }) { this.logger = options.logger; this.discovery = options.discovery; this.legacyPathCasing = options.legacyPathCasing; + this.staticDocsDir = options.staticDocsDir; } static fromConfig( @@ -90,10 +77,28 @@ export class LocalPublish implements PublisherBase { 'techdocs.legacyUseCaseSensitiveTripletPaths', ) || false; + let staticDocsDir = config.getOptionalString( + 'techdocs.publisher.local.publishDirectory', + ); + if (!staticDocsDir) { + try { + staticDocsDir = resolvePackagePath( + '@backstage/plugin-techdocs-backend', + 'static/docs', + ); + } catch (err) { + // This will most probably never be used. + // The try/catch is introduced so that techdocs-cli can import @backstage/plugin-techdocs-node + // on CI/CD without installing techdocs backend plugin. + staticDocsDir = os.tmpdir(); + } + } + return new LocalPublish({ logger, discovery, legacyPathCasing, + staticDocsDir, }); } @@ -144,7 +149,7 @@ export class LocalPublish implements PublisherBase { const techdocsApiUrl = await this.discovery.getBaseUrl('techdocs'); const publishedFilePaths = (await getFileTreeRecursively(publishDir)).map( abs => { - return abs.split(`${staticDocsDir}/`)[1]; + return abs.split(`${this.staticDocsDir}/`)[1]; }, ); @@ -222,9 +227,8 @@ export class LocalPublish implements PublisherBase { // Otherwise, redirect to the new path. return res.redirect(301, req.baseUrl + newPath); }); - router.use( - express.static(staticDocsDir, { + express.static(this.staticDocsDir, { // Handle content-type header the same as all other publishers. setHeaders: (res, filePath) => { const fileExtension = path.extname(filePath); @@ -275,13 +279,16 @@ export class LocalPublish implements PublisherBase { concurrency = 25, }): Promise { // Iterate through every file in the root of the publisher. - const files = await getFileTreeRecursively(staticDocsDir); + const files = await getFileTreeRecursively(this.staticDocsDir); const limit = createLimiter(concurrency); await Promise.all( files.map(f => limit(async file => { - const relativeFile = file.replace(`${staticDocsDir}${path.sep}`, ''); + const relativeFile = file.replace( + `${this.staticDocsDir}${path.sep}`, + '', + ); const newFile = lowerCaseEntityTripletInStoragePath(relativeFile); // If all parts are already lowercase, ignore. @@ -311,7 +318,7 @@ export class LocalPublish implements PublisherBase { * Utility wrapper around path.join(), used to control legacy case logic. */ protected staticEntityPathJoin(...allParts: string[]): string { - let staticEntityPath = staticDocsDir; + let staticEntityPath = this.staticDocsDir; allParts .map(part => part.split(path.sep)) From d2256c0384943e0cc5023e1c1f9dd06bd42aa647 Mon Sep 17 00:00:00 2001 From: Niklas Aronsson Date: Thu, 7 Apr 2022 15:32:33 +0200 Subject: [PATCH 131/590] Cli/server: Fix webpack deprecation warnings Running the development dev server results in the following deprecation warnings from "webpack-dev-server". * [DEP_WEBPACK_DEV_SERVER_CONSTRUCTOR] DeprecationWarning: Using 'compiler' as the first argument is deprecated. Please use 'options' as the first argument and 'compiler' as the second argument. * [DEP_WEBPACK_DEV_SERVER_LISTEN] DeprecationWarning: 'listen' is deprecated. Please use the async 'start' or 'startCallback' method. Signed-off-by: Niklas Aronsson --- .changeset/purple-beans-march.md | 5 +++++ packages/cli/src/lib/bundler/server.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/purple-beans-march.md diff --git a/.changeset/purple-beans-march.md b/.changeset/purple-beans-march.md new file mode 100644 index 0000000000..f4a3b45ab2 --- /dev/null +++ b/.changeset/purple-beans-march.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fix `webpack-dev-server` deprecations. diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts index e65e598106..d573f80e27 100644 --- a/packages/cli/src/lib/bundler/server.ts +++ b/packages/cli/src/lib/bundler/server.ts @@ -43,7 +43,6 @@ export async function serveBundle(options: ServeOptions) { const compiler = webpack(config); const server = new WebpackDevServer( - compiler as any, { hot: !process.env.CI, devMiddleware: { @@ -71,10 +70,11 @@ export async function serveBundle(options: ServeOptions) { webSocketURL: 'auto://0.0.0.0:0/ws', }, } as any, + compiler as any, ); await new Promise((resolve, reject) => { - server.listen(port, host, (err?: Error) => { + server.startCallback((err?: Error) => { if (err) { reject(err); return; From 874782422123e8b83f5ed428489e2fe10f24c859 Mon Sep 17 00:00:00 2001 From: planeiii Date: Thu, 16 Jun 2022 14:49:36 -0500 Subject: [PATCH 132/590] feat(jenkins-backend): add multiple branch support Signed-off-by: planeiii --- .changeset/many-vans-thank.md | 8 ++++++ .../src/service/jenkinsApi.test.ts | 28 +++++++++++++++++++ .../jenkins-backend/src/service/jenkinsApi.ts | 13 +++++---- plugins/jenkins/README.md | 7 +++-- 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 .changeset/many-vans-thank.md diff --git a/.changeset/many-vans-thank.md b/.changeset/many-vans-thank.md new file mode 100644 index 0000000000..942aa4cc7c --- /dev/null +++ b/.changeset/many-vans-thank.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-jenkins': patch +'@backstage/plugin-jenkins-backend': patch +--- + +--- + +feature: added support for multiple branches to the `JenkinsApi` diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index 29da414470..ad1a09a40f 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -134,6 +134,34 @@ describe('JenkinsApi', () => { }); expect(result).toHaveLength(1); }); + + it('supports multiple branches', async () => { + mockedJenkinsClient.job.get.mockResolvedValue(project); + + const result = await jenkinsApi.getProjects( + jenkinsInfo, + 'foo,bar,catpants', + ); + + expect(mockedJenkins).toHaveBeenCalledWith({ + baseUrl: jenkinsInfo.baseUrl, + headers: jenkinsInfo.headers, + promisify: true, + }); + expect(mockedJenkinsClient.job.get).toBeCalledWith({ + name: `${jenkinsInfo.jobFullName}/foo`, + tree: expect.anything(), + }); + expect(mockedJenkinsClient.job.get).toBeCalledWith({ + name: `${jenkinsInfo.jobFullName}/bar`, + tree: expect.anything(), + }); + expect(mockedJenkinsClient.job.get).toBeCalledWith({ + name: `${jenkinsInfo.jobFullName}/catpants`, + tree: expect.anything(), + }); + expect(result).toHaveLength(1); + }); }); describe('augmented', () => { const projectWithScmActions: JenkinsProject = { diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 8069f57692..07469dc83a 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -75,13 +75,16 @@ export class JenkinsApiImpl { const projects: BackstageProject[] = []; if (branch) { - // we have been asked to filter to a single branch. // Assume jenkinsInfo.jobFullName is a folder which contains one job per branch. // TODO: extract a strategy interface for this - const job = await client.job.get({ - name: `${jenkinsInfo.jobFullName}/${branch}`, - tree: JenkinsApiImpl.jobTreeSpec.replace(/\s/g, ''), - }); + const job = await Promise.any( + branch.split(/,/g).map(name => + client.job.get({ + name: `${jenkinsInfo.jobFullName}/${name}`, + tree: JenkinsApiImpl.jobTreeSpec.replace(/\s/g, ''), + }), + ), + ); projects.push(this.augmentProject(job)); } else { // We aren't filtering diff --git a/plugins/jenkins/README.md b/plugins/jenkins/README.md index 80e39d2095..2a0ec451c8 100644 --- a/plugins/jenkins/README.md +++ b/plugins/jenkins/README.md @@ -19,7 +19,7 @@ yarn add --cwd packages/app @backstage/plugin-jenkins 3. Add the `EntityJenkinsContent` extension to the `CI/CD` page and `EntityLatestJenkinsRunCard` to the `overview` page in the app (or wherever you'd prefer): -Note that if you configured a custom JenkinsInfoProvider in step 2, you may need a custom isJenkinsAvailable. +Note that if you configured a custom JenkinsInfoProvider in step 2, you may need a custom isJenkinsAvailable. Also if you're transitioning to a new default branch name, you can pass multiple branch names as a comma-separated list and it will check for each branch name. ```tsx // In packages/app/src/components/catalog/EntityPage.tsx @@ -38,7 +38,10 @@ const serviceEntityPage = ( - + {/* ... */} From 2334bc95a0d8f6a31bc2ef06ccc2c887126326e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 02:01:45 +0000 Subject: [PATCH 133/590] chore(deps): Bump undici from 5.0.0 to 5.5.1 Bumps [undici](https://github.com/nodejs/undici) from 5.0.0 to 5.5.1. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.0.0...v5.5.1) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index bd2b1ff7bc..e9445ad677 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24962,9 +24962,9 @@ underscore@^1.12.1, underscore@^1.9.1: integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== undici@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/undici/-/undici-5.0.0.tgz#3c1e08c7f0df90c485d5d8dbb0517e11e34f2090" - integrity sha512-VhUpiZ3No1DOPPQVQnsDZyfcbTTcHdcgWej1PdFnSvOeJmOVDgiOHkunJmBLfmjt4CqgPQddPVjSWW0dsTs5Yg== + version "5.5.1" + resolved "https://registry.npmjs.org/undici/-/undici-5.5.1.tgz#baaf25844a99eaa0b22e1ef8d205bffe587c8f43" + integrity sha512-MEvryPLf18HvlCbLSzCW0U00IMftKGI5udnjrQbC5D4P0Hodwffhv+iGfWuJwg16Y/TK11ZFK8i+BPVW2z/eAw== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" From 2aad25ae1d04bfd82f19d31da33174dbf86ed077 Mon Sep 17 00:00:00 2001 From: tomasrb Date: Thu, 16 Jun 2022 21:15:45 -0700 Subject: [PATCH 134/590] Add Okay adopters use case Signed-off-by: tomasrb --- ADOPTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 06557bf02c..0fe6519047 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -161,7 +161,7 @@ _If you're using Backstage in your organization, please try to add your company | [OVHcloud](https://www.ovhcloud.com/fr/) | [Jean-Philippe Blary](https://github.com/blaryjp), [Arnaud Bauer](mailto:arnaud.bauer@ovhcloud.com), [Flavien Chantelot](https://github.com/Dorn-) | We're providing Backstage to our collaborators to ease their daily jobs, and let them extends it using plugins. | | [Procter & Gamble](https://us.pg.com/) | [Binita Nayak](https://github.com/binitan), [Josh Rose](https://github.com/joshuarose), [RJ Winkler](https://github.com/rjwink) | P&G leverages Backstage to build internal developer portal to ensure developers' happiness. This developer portal shall act as single source of information needed by development teams to seamlessly create, find and maintain their software components/resources/documentation. | | [SANS Institute](https://www.sans.org) | [Christopher Klewin](mailto:cklewin@sans.org) | Developer portal for centralized visibility, reporting, and tooling across multiple organizations. | -| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) +| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) | Service catalog, developer portal, and technical documentation | | [Kaluza](https://www.kaluza.com) | [James Condren](mailto:james.condron@kaluza.com) | To provide an automated golden path to developers, with a focus on discovery and documentation | | [LinkedIn](https://linkedin.com) | [Joshua Lawrence](mailto:jlawrence@linkedin.com) | We are building a platform for internal web tools | | [Forto](https://forto.com) | [Rodolfo Matos](mailto:rodolfo.matos@forto.com) | Still in a experimental phase/assessing the organisational fit. We will be using it mostly a developer portal -- pretty standard use case. | From c05f081e61b5f02b77fc0e98838d96c2ddc51f7e Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 12:11:47 +0400 Subject: [PATCH 135/590] test for dags found and not found length Signed-off-by: Daniele.Mazzotta --- plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts b/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts index e56c622ff2..329f89ee52 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts @@ -184,7 +184,9 @@ describe('ApacheAirflowClient', () => { }); const dagIds = ['mock_dag_1', 'a-random-DAG-id']; const response = await client.getDags(dagIds); + expect(response.dags.length).toEqual(1); expect(response.dags[0].dag_id).toEqual('mock_dag_1'); + expect(response.dagsNotFound.length).toEqual(1); expect(response.dagsNotFound[0]).toEqual('a-random-DAG-id'); }); }); From 95d2f8831376c6e8318e0e5a870622112a820583 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 12:42:30 +0400 Subject: [PATCH 136/590] add warning for missing dag ids Signed-off-by: Daniele.Mazzotta --- .../DagTableComponent/DagTableComponent.tsx | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx index 18439e1902..7619b06497 100644 --- a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx +++ b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx @@ -20,6 +20,7 @@ import { StatusOK, Table, TableColumn, + WarningPanel, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; import Box from '@material-ui/core/Box'; @@ -30,7 +31,7 @@ import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; import Alert from '@material-ui/lab/Alert'; -import React from 'react'; +import React, { useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { apacheAirflowApiRef } from '../../api'; import { Dag } from '../../api/types'; @@ -135,15 +136,14 @@ type DagTableComponentProps = { export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { const apiClient = useApi(apacheAirflowApiRef); + const [dagsNotFound, setDagsNotFound] = useState(); + const { value, loading, error } = useAsync(async (): Promise => { if (dagIds) { + // eslint-disable-next-line @typescript-eslint/no-shadow const { dags, dagsNotFound } = await apiClient.getDags(dagIds); if (dagsNotFound.length) { - throw new Error( - `${dagsNotFound.length} DAGs were not found:\n${dagsNotFound.join( - ';\n', - )}`, - ); + setDagsNotFound(dagsNotFound); } return dags; } @@ -162,5 +162,18 @@ export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { dagUrl: `${apiClient.baseUrl}dag_details?dag_id=${el.dag_id}`, // construct path to DAG using `baseUrl` })); - return ; + return ( + <> + {dagsNotFound ? ( + + {dagsNotFound.map(dagId => ( + {dagId} + ))} + + ) : ( + '' + )} + + + ); }; From 6b8093497f3a2e9a677f1f476813ca730fa7993a Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 12:43:28 +0400 Subject: [PATCH 137/590] written tests for all dags + selected dags Signed-off-by: Daniele.Mazzotta --- .../DagTableComponent.test.tsx | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.test.tsx diff --git a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.test.tsx b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.test.tsx new file mode 100644 index 0000000000..16ff3120be --- /dev/null +++ b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.test.tsx @@ -0,0 +1,62 @@ +/* + * 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 { ApacheAirflowApi, apacheAirflowApiRef } from '../../api'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import React from 'react'; +import { DagTableComponent } from './DagTableComponent'; + +describe('DagTableComponent', () => { + const mockApi: jest.Mocked = { + listDags: jest.fn().mockResolvedValue([ + { + dag_id: 'mock_dag_1', + }, + { + dag_id: 'mock_dag_2', + }, + { + dag_id: 'mock_dag_3', + }, + ]), + getDags: jest.fn().mockResolvedValue({ + dags: [{ dag_id: 'mock_dag_1' }], + dagsNotFound: ['a-random-id'], + }), + } as any; + + it('should render all DAGs', async () => { + const { getByText } = await renderInTestApp( + + + , + ); + + ['mock_dag_1', 'mock_dag_2', 'mock_dag_3'].forEach(dagId => { + expect(getByText(dagId)).toBeInTheDocument(); + }); + }); + + it('should render only selected DAGs', async () => { + const { getByText } = await renderInTestApp( + + + , + ); + expect(getByText('mock_dag_1')).toBeInTheDocument(); + expect(getByText('Warning: 1 DAGs were not found')).toBeInTheDocument(); + expect(getByText('a-random-id')).toBeInTheDocument(); + }); +}); From fdffb40c70b3cce481e16be2abc66fd064269b87 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 12:47:33 +0400 Subject: [PATCH 138/590] export DagTableComponent Signed-off-by: Daniele.Mazzotta --- plugins/apache-airflow/src/index.ts | 6 +++++- plugins/apache-airflow/src/plugin.ts | 13 ++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/apache-airflow/src/index.ts b/plugins/apache-airflow/src/index.ts index 7186839c0a..e8353c7760 100644 --- a/plugins/apache-airflow/src/index.ts +++ b/plugins/apache-airflow/src/index.ts @@ -20,4 +20,8 @@ * @packageDocumentation */ -export { apacheAirflowPlugin, ApacheAirflowPage } from './plugin'; +export { + apacheAirflowPlugin, + ApacheAirflowPage, + ApacheAirflowDagTable, +} from './plugin'; diff --git a/plugins/apache-airflow/src/plugin.ts b/plugins/apache-airflow/src/plugin.ts index 04ef1974d4..f7e25c7003 100644 --- a/plugins/apache-airflow/src/plugin.ts +++ b/plugins/apache-airflow/src/plugin.ts @@ -17,11 +17,12 @@ import { rootRouteRef } from './routes'; import { apacheAirflowApiRef, ApacheAirflowClient } from './api'; import { + configApiRef, createApiFactory, + createComponentExtension, createPlugin, createRoutableExtension, discoveryApiRef, - configApiRef, } from '@backstage/core-plugin-api'; export const apacheAirflowPlugin = createPlugin({ @@ -49,3 +50,13 @@ export const ApacheAirflowPage = apacheAirflowPlugin.provide( mountPoint: rootRouteRef, }), ); + +export const ApacheAirflowDagTable = apacheAirflowPlugin.provide( + createComponentExtension({ + name: 'ApacheAirflowDagTable', + component: { + lazy: () => + import('./components/DagTableComponent').then(m => m.DagTableComponent), + }, + }), +); From 5c413f054bcf1b7b49c1cf84d44a5583ad5f6ce6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 11:05:10 +0200 Subject: [PATCH 139/590] app-config: comment out bitbucket cloud integration Signed-off-by: Patrik Oldsberg --- app-config.yaml | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index 2f9f6e4f9a..a56a3df9d1 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -171,25 +171,26 @@ integrations: github: - host: github.com token: ${GITHUB_TOKEN} - ### Example for how to add your GitHub Enterprise instance using the API: - # - host: ghe.example.net - # apiBaseUrl: https://ghe.example.net/api/v3 - # token: ${GHE_TOKEN} - ### Example for how to add your GitHub Enterprise instance using raw HTTP fetches (token is optional): - # - host: ghe.example.net - # rawBaseUrl: https://ghe.example.net/raw - # token: ${GHE_TOKEN} + ### Example for how to add your GitHub Enterprise instance using the API: + # - host: ghe.example.net + # apiBaseUrl: https://ghe.example.net/api/v3 + # token: ${GHE_TOKEN} + ### Example for how to add your GitHub Enterprise instance using raw HTTP fetches (token is optional): + # - host: ghe.example.net + # rawBaseUrl: https://ghe.example.net/raw + # token: ${GHE_TOKEN} gitlab: - host: gitlab.com token: ${GITLAB_TOKEN} - bitbucketCloud: - - username: ${BITBUCKET_USERNAME} - appPassword: ${BITBUCKET_APP_PASSWORD} - ### Example for how to add your bitbucket server instance using the API: - # - host: server.bitbucket.com - # apiBaseUrl: server.bitbucket.com - # username: ${BITBUCKET_SERVER_USERNAME} - # appPassword: ${BITBUCKET_SERVER_APP_PASSWORD} + ### Example for how to add a bitbucket cloud integration + # bitbucketCloud: + # - username: ${BITBUCKET_USERNAME} + # appPassword: ${BITBUCKET_APP_PASSWORD} + ### Example for how to add your bitbucket server instance using the API: + # - host: server.bitbucket.com + # apiBaseUrl: server.bitbucket.com + # username: ${BITBUCKET_SERVER_USERNAME} + # appPassword: ${BITBUCKET_SERVER_APP_PASSWORD} azure: - host: dev.azure.com token: ${AZURE_TOKEN} From 7e35d62a13baef3aeafbe0d28cb9b02395234c40 Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Fri, 17 Jun 2022 14:24:03 +0200 Subject: [PATCH 140/590] docs: custom tempalte actions clearly express that the builtin actions are replaced Signed-off-by: Vladimir Masarik --- docs/features/software-templates/writing-custom-actions.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index 8e698e1a05..635a373eb3 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -9,8 +9,9 @@ by writing custom actions which can be used along side our [built-in actions](./builtin-actions.md). > Note: When adding custom actions, the actions array will **replace the -> built-in actions too**. To ensure you can continue to include the builtin -> actions, see below to include them during registration of your action. +> built-in actions too**. Meaning, you will no longer be able to use them. +> If you want to continue using the builtin actions, include them in the actions +> array when registering your custom actions, as seen below. ## Writing your Custom Action From 1ee1a02d676199a7425c774824661acade56db48 Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Fri, 17 Jun 2022 14:26:56 +0200 Subject: [PATCH 141/590] docs: custom template actions update code exmaple Users don't need the container runner, and variables have to be passed in differently Signed-off-by: Vladimir Masarik --- .../writing-custom-actions.md | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index 635a373eb3..abff0cf7c7 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -123,27 +123,32 @@ will set the available actions that the scaffolder has access to. ```ts import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend'; import { ScmIntegrations } from '@backstage/integration'; +import { createNewFileAction } from './actions/custom'; -const integrations = ScmIntegrations.fromConfig(env.config); +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + const catalogClient = new CatalogClient({ discoveryApi: env.discovery }); + const integrations = ScmIntegrations.fromConfig(env.config); -const builtInActions = createBuiltinActions({ - containerRunner, - integrations, - catalogClient, - config: env.config, - reader: env.reader, -}); + const builtInActions = createBuiltinActions({ + integrations, + catalogClient, + config: env.config, + reader: env.reader, + }); + + const actions = [...builtInActions, createNewFileAction()]; -const actions = [...builtInActions, createNewFileAction()]; -return await createRouter({ - containerRunner, - catalogClient, - actions, - logger: env.logger, - config: env.config, - database: env.database, - reader: env.reader, -}); + return createRouter({ + actions, + catalogClient: catalogClient, + logger: env.logger, + config: env.config, + database: env.database, + reader: env.reader, + }); +} ``` ## List of custom action packages From 4ae8c4b0b76b20b04ca48dba6fbb33c1b20083fc Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Fri, 17 Jun 2022 14:49:33 +0200 Subject: [PATCH 142/590] docs: Adding templates, add template as a file example Signed-off-by: Vladimir Masarik --- docs/features/software-templates/adding-templates.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/features/software-templates/adding-templates.md b/docs/features/software-templates/adding-templates.md index db765fc7ee..821e44b0ab 100644 --- a/docs/features/software-templates/adding-templates.md +++ b/docs/features/software-templates/adding-templates.md @@ -97,6 +97,8 @@ catalog: target: https://github.com/backstage/software-templates/blob/main/scaffolder-templates/react-ssr-template/template.yaml rules: - allow: [Template] + - type: file + target: template.yaml # Backstage will expect the file to be in packages/backend/template.yaml ``` Or you can add the template using the `catalog-import` plugin, which unless From 01f976ea728a4fe40f9d5c7a387506e09120e32b Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 17:06:56 +0400 Subject: [PATCH 143/590] added changeset Signed-off-by: Daniele.Mazzotta --- .changeset/lemon-goats-obey.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/lemon-goats-obey.md diff --git a/.changeset/lemon-goats-obey.md b/.changeset/lemon-goats-obey.md new file mode 100644 index 0000000000..2c45c67282 --- /dev/null +++ b/.changeset/lemon-goats-obey.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-apache-airflow': patch +--- + +Exposed DagTableComponent as standalone component + added a prop to get only select DAGs instead of the full list From 221fbffe4464bb272b925a175538362beebd5a57 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 17:16:28 +0400 Subject: [PATCH 144/590] updated README Signed-off-by: Daniele.Mazzotta --- plugins/apache-airflow/README.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/plugins/apache-airflow/README.md b/plugins/apache-airflow/README.md index bdbb1b981f..11fce89e4c 100644 --- a/plugins/apache-airflow/README.md +++ b/plugins/apache-airflow/README.md @@ -3,14 +3,17 @@ Welcome to the apache-airflow plugin! This plugin serves as frontend to the REST API exposed by Apache Airflow. -Note only [Airflow v2 (and later)](https://airflow.apache.org/docs/apache-airflow/stable/deprecated-rest-api-ref.html) integrate with the plugin. +Note only [Airflow v2 (and later)](https://airflow.apache.org/docs/apache-airflow/stable/deprecated-rest-api-ref.html) +integrate with the plugin. ## Feature Requests & Ideas - [ ] Add support for running multiple instances of Airflow for monitoring - various deployment stages or business domains. ([Suggested by @JGoldman110](https://github.com/backstage/backstage/issues/735#issuecomment-985063468)) + various deployment stages or business + domains. ([Suggested by @JGoldman110](https://github.com/backstage/backstage/issues/735#issuecomment-985063468)) - [ ] Make owner chips in the DAG table clickable, resolving to a user or group - in the entity catalog. ([Suggested by @julioz](https://github.com/backstage/backstage/pull/8348#discussion_r764766295)) + in the entity + catalog. ([Suggested by @julioz](https://github.com/backstage/backstage/pull/8348#discussion_r764766295)) ## Installation @@ -42,6 +45,27 @@ yarn --cwd packages/app add @backstage/plugin-apache-airflow ); ``` +If you just want to embed the DAGs into an existing page, you can use the `ApacheAirflowDagTable` + +```typescript +import {ApacheAirflowDagTable} from '@backstage/plugin-apache-airflow'; + +export function SomeEntityPage(): JSX.Element { + return ( + + + < /Grid> +) + ; +} +``` + ## Configuration For links to the Airflow instance, the `baseUrl` must be defined in From 7fc1f50f57ff01c24ccdddf43871bd02afe83760 Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Fri, 17 Jun 2022 15:00:58 +0200 Subject: [PATCH 145/590] docs: Adding templates, added note for users that they need to refresh the location Othwise, backstage won't display the updated or newly added template, and it won't report any errors either. Signed-off-by: Vladimir Masarik --- docs/features/software-templates/adding-templates.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/features/software-templates/adding-templates.md b/docs/features/software-templates/adding-templates.md index 821e44b0ab..62604df1b7 100644 --- a/docs/features/software-templates/adding-templates.md +++ b/docs/features/software-templates/adding-templates.md @@ -86,6 +86,13 @@ contains more information about the required fields. Once we have a `template.yaml` ready, we can then add it to the software catalog for use by the scaffolder. +> Note: When you add or modify a template, you will need to refresh the location entity. +> Otherwise, Backstage won't display the template in the available templates, +> or it will keep showing the old template. You can refresh the location instance by +> going into `Catalog` web page, choosing `Locations` instead of `Components`, and selecting the correct location entity. +> From there, you can click on the refresh icon representing "Sheduled entity refresh" action. +> Afterwards, you should see your template updated. + You can add the template files to the catalog through [static location configuration](../software-catalog/configuration.md#static-location-configuration), for example: From a6321c9b9f6a9b78ee525c6af66f1ec5b98c6d6a Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Fri, 17 Jun 2022 15:25:14 +0200 Subject: [PATCH 146/590] docs: writing templates, add examples of how to use values Add information on how to actually use the parameters from the UI in the actual code so that users can fully utilize the templating power of the default templating action. Signed-off-by: Vladimir Masarik --- .../software-templates/writing-templates.md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index ff9962d8d4..5597916bee 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -485,6 +485,66 @@ the value of `firstName` from the parameters). This is great for passing the values from the form into different steps and reusing these input variables. These template strings preserve the type of the parameter. +The `${{ parameters.firstName }}` pattern will work only in the template file. +If you want to start using values provided from the UI in your code, you will have to use +the `${{ values.firstName }}` pattern. Additionally, you have to pass +the parameters from the UI to the input of the `fetch:template` step. + +```yaml +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: v1beta3-demo + title: Test Action + description: scaffolder v1beta3 template demo +spec: + owner: backstage/techdocs-core + type: service + parameters: + - title: Fill in some steps + required: + - name + properties: + name: + title: Name + type: string + description: Unique name of your project + urlParameter: + title: URL endpoint + type: string + description: URL endpoint at which the component can be reached + default: "https://www.example.com" + enabledDB: + title: Enable Database + type: boolean + default: false + +... + + steps: + - id: fetch-base + name: Fetch Base + action: fetch:template + input: + url: ./template + values: + name: ${{ parameters.name }} + url: ${{ parameters.urlParameter }} + enabledDB: ${{ parameters.enabledDB }} +``` + +Afterwards, if you are using the builtin templating action, you can start using +the variables in your code. You can use also any other templating fuctions from +[Nunjucks](https://mozilla.github.io/nunjucks/templating.html#tags) as well. + +```bash +#!/bin/bash +echo "Hi my name is ${{ values.name }}, and you can fine me at ${{ values.url }}!" +{% if values.enabledDB %} +echo "You have enabled your database!" +{% endif %} +``` + As you can see above in the `Outputs` section, `actions` and `steps` can also output things. You can grab that output using `steps.$stepId.output.$property`. From d9ebda237e8020fe641361d635c348f8d43a4262 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Fri, 17 Jun 2022 17:50:27 +0400 Subject: [PATCH 147/590] build api-reports Signed-off-by: Daniele.Mazzotta --- plugins/apache-airflow/api-report.md | 11 +++++++++-- plugins/apache-airflow/src/plugin.ts | 7 +++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/plugins/apache-airflow/api-report.md b/plugins/apache-airflow/api-report.md index ca151f0734..09123de613 100644 --- a/plugins/apache-airflow/api-report.md +++ b/plugins/apache-airflow/api-report.md @@ -5,8 +5,15 @@ ```ts /// -import { BackstagePlugin } from '@backstage/core-plugin-api'; -import { RouteRef } from '@backstage/core-plugin-api'; +import {BackstagePlugin} from '@backstage/core-plugin-api'; +import {RouteRef} from '@backstage/core-plugin-api'; + +// @public +export const ApacheAirflowDagTable: ({ + dagIds, + }: { + dagIds?: string[] | undefined; +}) => JSX.Element; // Warning: (ae-missing-release-tag) "ApacheAirflowPage" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // diff --git a/plugins/apache-airflow/src/plugin.ts b/plugins/apache-airflow/src/plugin.ts index f7e25c7003..adf5879196 100644 --- a/plugins/apache-airflow/src/plugin.ts +++ b/plugins/apache-airflow/src/plugin.ts @@ -51,6 +51,13 @@ export const ApacheAirflowPage = apacheAirflowPlugin.provide( }), ); +/** + * Render the DAGs in a table + * If the dagIds is specified, only those DAGs are loaded. + * Otherwise, it's going to list all the DAGs + * @public + * @param dagIds - string[] + */ export const ApacheAirflowDagTable = apacheAirflowPlugin.provide( createComponentExtension({ name: 'ApacheAirflowDagTable', From e81be86682cee2a94c71aeaa593726b1a9dd190e Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Fri, 17 Jun 2022 16:01:37 +0200 Subject: [PATCH 148/590] docs: fix template typos Signed-off-by: Vladimir Masarik --- docs/features/software-templates/adding-templates.md | 2 +- docs/features/software-templates/writing-templates.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/software-templates/adding-templates.md b/docs/features/software-templates/adding-templates.md index 62604df1b7..e8176a688b 100644 --- a/docs/features/software-templates/adding-templates.md +++ b/docs/features/software-templates/adding-templates.md @@ -90,7 +90,7 @@ for use by the scaffolder. > Otherwise, Backstage won't display the template in the available templates, > or it will keep showing the old template. You can refresh the location instance by > going into `Catalog` web page, choosing `Locations` instead of `Components`, and selecting the correct location entity. -> From there, you can click on the refresh icon representing "Sheduled entity refresh" action. +> From there, you can click on the refresh icon representing "Scheduled entity refresh" action. > Afterwards, you should see your template updated. You can add the template files to the catalog through diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 5597916bee..3173a0500a 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -534,7 +534,7 @@ spec: ``` Afterwards, if you are using the builtin templating action, you can start using -the variables in your code. You can use also any other templating fuctions from +the variables in your code. You can use also any other templating functions from [Nunjucks](https://mozilla.github.io/nunjucks/templating.html#tags) as well. ```bash From b011a1052aa290c38847f86c7315507c9f69eaca Mon Sep 17 00:00:00 2001 From: Nick Marinelli Date: Fri, 17 Jun 2022 10:31:16 -0400 Subject: [PATCH 149/590] remove hooks and added icons Signed-off-by: Nick Marinelli --- plugins/azure-devops/api-report.md | 79 ------------------------------ plugins/azure-devops/src/index.ts | 3 -- 2 files changed, 82 deletions(-) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 78880eb389..b366166d95 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -16,7 +16,6 @@ import { GitTag } from '@backstage/plugin-azure-devops-common'; import { IdentityApi } from '@backstage/core-plugin-api'; import { PullRequest } from '@backstage/plugin-azure-devops-common'; import { PullRequestOptions } from '@backstage/plugin-azure-devops-common'; -import { PullRequestStatus } from '@backstage/plugin-azure-devops-common'; import { RepoBuild } from '@backstage/plugin-azure-devops-common'; import { RepoBuildOptions } from '@backstage/plugin-azure-devops-common'; import { SvgIconProps } from '@material-ui/core'; @@ -173,16 +172,6 @@ export class AzureDevOpsClient implements AzureDevOpsApi { // @public (undocumented) export const azureDevOpsPlugin: BackstagePlugin<{}, {}>; -// Warning: (ae-missing-release-tag) "AzureGitTagsIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const AzureGitTagsIcon: (props: SvgIconProps) => JSX.Element; - -// Warning: (ae-missing-release-tag) "AzurePipelinesIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const AzurePipelinesIcon: (props: SvgIconProps) => JSX.Element; - // Warning: (ae-missing-release-tag) "AzurePullRequestsIcon" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -349,73 +338,5 @@ export interface PullRequestColumnConfig { // @public (undocumented) export type PullRequestFilter = (pullRequest: DashboardPullRequest) => boolean; -// Warning: (ae-missing-release-tag) "useAllTeams" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function useAllTeams(): { - teams?: Team[]; - loading: boolean; - error?: Error; -}; - -// Warning: (ae-missing-release-tag) "useDashboardPullRequests" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function useDashboardPullRequests( - project?: string, - pollingInterval?: number, -): { - pullRequests?: DashboardPullRequest[]; - loading: boolean; - error?: Error; -}; - -// Warning: (ae-missing-release-tag) "useProjectRepoFromEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function useProjectRepoFromEntity(entity: Entity): { - project: string; - repo: string; -}; - -// Warning: (ae-missing-release-tag) "usePullRequests" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function usePullRequests( - entity: Entity, - defaultLimit?: number, - requestedStatus?: PullRequestStatus, -): { - items?: PullRequest[]; - loading: boolean; - error?: Error; -}; - -// Warning: (ae-missing-release-tag) "useRepoBuilds" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function useRepoBuilds( - entity: Entity, - defaultLimit?: number, -): { - items?: RepoBuild[]; - loading: boolean; - error?: Error; -}; - -// Warning: (ae-missing-release-tag) "useUserEmail" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function useUserEmail(): string | undefined; - -// Warning: (ae-missing-release-tag) "useUserTeamIds" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function useUserTeamIds(userId: string | undefined): { - teamIds?: string[]; - loading: boolean; - error?: Error; -}; - // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts index def88f68c6..e65c1d02a3 100644 --- a/plugins/azure-devops/src/index.ts +++ b/plugins/azure-devops/src/index.ts @@ -25,11 +25,8 @@ export { } from './plugin'; export { AzurePullRequestsIcon } from './components/AzurePullRequestsIcon'; -export { AzureGitTagsIcon } from './components/AzureGitTagsIcon'; -export { AzurePipelinesIcon } from './components/AzurePipelinesIcon'; export * from './api'; -export * from './hooks'; export { FilterType } from './components/PullRequestsPage'; export type { From 1ace3fd8115a59725250ad48e3fd3ce546b7d904 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 14:36:13 +0000 Subject: [PATCH 150/590] chore(deps): update dependency @testing-library/user-event to v14.2.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 6f51f24e5d..95352273e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5496,9 +5496,9 @@ "@types/react-dom" "<18.0.0" "@testing-library/user-event@^14.0.0": - version "14.2.0" - resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.2.0.tgz#8293560f8f80a00383d6c755ec3e0b918acb1683" - integrity sha512-+hIlG4nJS6ivZrKnOP7OGsDu9Fxmryj9vCl8x0ZINtTJcCHs2zLsYif5GzuRiBF2ck5GZG2aQr7Msg+EHlnYVQ== + version "14.2.1" + resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.2.1.tgz#8c5ff2d004544bb2220e1d864f7267fe7eb6c556" + integrity sha512-HOr1QiODrq+0j9lKU5i10y9TbhxMBMRMGimNx10asdmau9cb8Xb1Vyg0GvTwyIL2ziQyh2kAloOtAQFBQVuecA== "@tokenizer/token@^0.3.0": version "0.3.0" From 1eff254ae08bc46b922ceca7e3d3aea616ac44b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 14:38:58 +0000 Subject: [PATCH 151/590] chore(deps): update dependency @types/jest-when to v3.5.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 6f51f24e5d..ff837662a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6135,9 +6135,9 @@ "@types/node" "*" "@types/jest-when@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@types/jest-when/-/jest-when-3.5.0.tgz#6a573cd521da131e6801f0991b4f1d4dee2ebab5" - integrity sha512-rNUuZ3Mn/HDzpImPXDeOtW18zqyerPoOS2aKU0zUFbirWgJ7sN7LnRv73RmbBQ/uzw28sxf/nUofxbhJ5DWB0w== + version "3.5.1" + resolved "https://registry.npmjs.org/@types/jest-when/-/jest-when-3.5.1.tgz#296a0d62b576615046773daf123d518b10adee32" + integrity sha512-8pzJWwU4h7KyCgwAB2Hs9xuy+a1YgVcdh0vE4LT4DZx5Yo7rFO9FAPIsSORVBVCk8QfjuGZaaU9HTTh3mJnEAg== dependencies: "@types/jest" "*" From b712d0b66c93735b6fae716b1c2ad13c39bdf9a7 Mon Sep 17 00:00:00 2001 From: Kamil Wolny Date: Fri, 17 Jun 2022 16:20:36 +0100 Subject: [PATCH 152/590] docs: added dazn adopter Signed-off-by: Kamil Wolny --- ADOPTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 0fe6519047..66376ca5e9 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -36,7 +36,7 @@ _If you're using Backstage in your organization, please try to add your company | [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. | | [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 | | [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes | -| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). | +| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com), [Kamil Wolny](https://github.com/mrwolny) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). | | [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. | | [FactSet](https://www.factset.com/) | [@kuangp](https://github.com/kuangp) | Developer portal to provide discoverability to all internal components, APIs, documentation, and scaffold templates with integrations to our internal infrastructure tools. | | [Workrise](https://www.workrise.com/) | [Michael Rode](https://github.com/michaelrode) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. | From c15e068a2174c35079d61770af123ecee2b4cacc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 15:31:08 +0000 Subject: [PATCH 153/590] chore(deps): update dependency @types/testing-library__jest-dom to v5.14.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 95352273e5..221b4a472c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6823,9 +6823,9 @@ terser-webpack-plugin "*" "@types/testing-library__jest-dom@^5.9.1": - version "5.14.3" - resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz#ee6c7ffe9f8595882ee7bda8af33ae7b8789ef17" - integrity sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw== + version "5.14.4" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.4.tgz#21567ec845f4efee55923842c79728dc49c1650b" + integrity sha512-EUCs9PTBOEyfRtLKkKd31YrRCx/9Wxjy2Uqb6IH/KAOr7/vP0i8iClOyxQqjm/UxMGU5r5s2vOBM7vSPQVmabg== dependencies: "@types/jest" "*" From 2ed102419c5a35fcf607c77001103270ba4bf772 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 15:45:52 +0000 Subject: [PATCH 154/590] chore(deps): update dependency esbuild to v0.14.45 Signed-off-by: Renovate Bot --- yarn.lock | 206 +++++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/yarn.lock b/yarn.lock index dc40251431..2169aac4b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11756,75 +11756,75 @@ es6-error@^4.1.1: resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild-android-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.44.tgz#62f5cb563d0ba318d898b6eb230c61ad3dc93619" - integrity sha512-dFPHBXmx385zuJULAD/Cmq/LyPRXiAWbf9ylZtY0wJ8iVyWfKYaCYxeJx8OAZUuj46ZwNa7MzW2GBAQLOeiemg== +esbuild-android-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.45.tgz#696f078d97a1350ceea5db626b3bc4a60fc13555" + integrity sha512-krVmwL2uXQN1A+Ci4u2MR+Y0IAvQK0u3no5TsgguHVhTy138szjuohScCGjkpvLCpGLk7P4kFP1LKuntvJ0d4A== -esbuild-android-arm64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.44.tgz#ee7fcc9f47855b3395dfd1abcc2c43d8c53e57db" - integrity sha512-qqaqqyxHXjZ/0ddKU3I3Nb7lAvVM69ELMhb8+91FyomAUmQPlHtxe+TTiWxXGHE72XEzcgTEGq4VauqLNkN22g== +esbuild-android-arm64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.45.tgz#d229da8040cea4a0041756d1abcea375b4e3f9db" + integrity sha512-62POGdzAjM+XOXEM5MmFW6k9Pjdjg1hTrXKKBbPE700LFF36B+1Jv9QkskT5UadbTk4cdH9BQ7bGiRPYY0p/Dw== -esbuild-darwin-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.44.tgz#75ea7f594687a7189a8ba62070d42f13178e68d0" - integrity sha512-RBmtGKGY06+AW6IOJ1LE/dEeF7HH34C1/Ces9FSitU4bIbIpL4KEuQpTFoxwb4ry5s2hyw7vbPhhtyOd18FH9g== +esbuild-darwin-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.45.tgz#d7d38d91e4c03890d58c297131e9b82895a37a6a" + integrity sha512-dbkVUAnGx5IeZesWnIhnvxy7dSvgUQvfy0TVLzd9XVP3oI/VsKs8UNsfPrxI5HiN4SINv7oPAbxWceMpB7IqNA== -esbuild-darwin-arm64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.44.tgz#550631fd135688abda042f4039b962a27f3a5f78" - integrity sha512-Bmhx5Cfo4Hdb7WyyyDupTB8HPmnFZ8baLfPlzLdYvF6OzsIbV+CY+m/AWf0OQvY40BlkzCLJ/7Lfwbb71Tngmg== +esbuild-darwin-arm64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.45.tgz#d4df2871b94351d7d5561e41f91aadba46857838" + integrity sha512-O6Bz7nnOae5rvbh2Ueo8ibSr7+/eLjsbPdgeMsAZri+LkOa7nsVPnhmocpO3Hy/LWfagTtHy1O9HRPIaArPmTg== -esbuild-freebsd-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.44.tgz#f98069b964266ca79bb361cfb9d7454a05b7e8ca" - integrity sha512-O4HpWa5ZgxbNPQTF7URicLzYa+TidGlmGT/RAC3GjbGEQQYkd0R1Slyh69Yrmb2qmcOcPAgWHbNo1UhK4WmZ4w== +esbuild-freebsd-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.45.tgz#e90106a2db3f5b0771392d3f9d8801b3138825c6" + integrity sha512-y1X2nr3XSWnDC7MRcy21EVAT0TiCtdefOntJ+SQcZnPBTURzX77f99S8lDF2KswukChkiacpd2Wd4VZieo7w7Q== -esbuild-freebsd-arm64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.44.tgz#247a8553d6033a58b6c3ba4d539216300497d7f6" - integrity sha512-f0/jkAKccnDY7mg1F9l/AMzEm+VXWXK6c3IrOEmd13jyKfpTZKTIlt+yI04THPDCDZTzXHTRUBLozqp+m8Mg5Q== +esbuild-freebsd-arm64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.45.tgz#e734c8ae8042cd9224406d45d6992261382bcbde" + integrity sha512-r3ZNejkx1BKXQ6sYOP6C5rTwgiUajyAh03wygLWZtl+SLyygvAnu+OouqtveesufjBDgujp4wZXP/n8PVqXkqg== -esbuild-linux-32@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.44.tgz#4b72747f9f367d3ee3c1d80bf75c617e6b109821" - integrity sha512-WSIhzLldMR7YUoEL7Ix319tC+NFmW9Pu7NgFWxUfOXeWsT0Wg484hm6bNgs7+oY2pGzg715y/Wrqi1uNOMmZJw== +esbuild-linux-32@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.45.tgz#0f814a784c941bfd5a5dca7ff742b57744c5324b" + integrity sha512-Qk9cCO3PJig/Y+SdslN/Th4pbAjgaH9oUjVH28eMsLTPf6QDUuK6EED91jepJdR3vxhcnVjyl6JqtOWmP+uxCg== -esbuild-linux-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.44.tgz#6cd158fdd11f8d037c45139ccddb4fa5966f7ab6" - integrity sha512-zgscTrCMcRZRIsVugqBTP/B5lPLNchBlWjQ8sQq2Epnv+UDtYKgXEq1ctWAmibZNy2E9QRCItKMeIEqeTUT5kA== +esbuild-linux-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.45.tgz#2028a6dfb3fea7a5dd5e87cf00d02a36a3373e3c" + integrity sha512-IybO2ugqvc/Zzn1Kih3x0FVjYAy3GTCwhtcp91dbdqk3wPqxYCzObYspa8ca0s+OovI0Cnb+rhXrUtq8gBqlqw== -esbuild-linux-arm64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.44.tgz#f14f3c8c3501067f5b2cef7a79c9a0058092cb22" - integrity sha512-H0H/2/wgiScTwBve/JR8/o+Zhabx5KPk8T2mkYZFKQGl1hpUgC+AOmRyqy/Js3p66Wim4F4Akv3I3sJA1sKg0w== +esbuild-linux-arm64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.45.tgz#6fef4165583215918d45150148ac0a18d5ef6323" + integrity sha512-UNEyuHTwztrkEU/+mWIxGzKrYBo2cEtjYAZQVZB1kliANKgRITktg2miaO/b/VtNe84ob1aXSvW8XOPEn5RTGQ== -esbuild-linux-arm@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.44.tgz#625478cc6ea4f64f5335e7fb07f80d6f659aeb5c" - integrity sha512-laPBPwGfsbBxGw6F6jnqic2CPXLyC1bPrmnSOeJ9oEnx1rcKkizd4HWCRUc0xv+l4z/USRfx/sEfYlWSLeqoJQ== +esbuild-linux-arm@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.45.tgz#e454f701ae5371322c8265f4356e098611e51f96" + integrity sha512-qKWJ4A4TAcxXV2TBLPw3Av5X2SYNfyNnBHNJTQJ5VuevK6Aq5i6XEMvUgdlcVuZ9MYPfS5aJZWglzDzJMf1Lpw== -esbuild-linux-mips64le@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.44.tgz#593c909bb612998300af7f7db2809a63a0d62eec" - integrity sha512-ri3Okw0aleYy7o5n9zlIq+FCtq3tcMlctN6X1H1ucILjBJuH8pan2trJPKWeb8ppntFvE28I9eEXhwkWh6wYKg== +esbuild-linux-mips64le@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.45.tgz#093cc86be71f9b0cd2876da23ee2f5d35b09a247" + integrity sha512-s/jcfw3Vpku5dIVSFVY7idJsGdIpIJ88IrkyprVgCG2yBeXatb67B7yIt0E1tL+OHrJJdNBw6GikCiMPAAu1VA== -esbuild-linux-ppc64le@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.44.tgz#8fc2fcee671e322a5d44fcf8da6889095a187df9" - integrity sha512-96TqL/MvFRuIVXz+GtCIXzRQ43ZwEk4XTn0RWUNJduXXMDQ/V1iOV28U6x6Oe3NesK4xkoKSaK2+F3VHcU8ZrA== +esbuild-linux-ppc64le@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.45.tgz#8bddbf67157027e917b6e5b04230d7cf14d62cf2" + integrity sha512-lJItl6ESZnhSx951U9R7MTBopgwIELHlQzC6SBR023V5JC1rPRFDZ/UEBsV+7BFcCAfqlyb+odGEAmcBSf4XCA== -esbuild-linux-riscv64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.44.tgz#cc2b7158c8345b67e74458a0ec020c80ca777046" - integrity sha512-rrK9qEp2M8dhilsPn4T9gxUsAumkITc1kqYbpyNMr9EWo+J5ZBj04n3GYldULrcCw4ZCHAJ+qPjqr8b6kG2inA== +esbuild-linux-riscv64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.45.tgz#0f234f63595159cfc976fd5310e7902e8b5a7ad7" + integrity sha512-8anMu+QLl9MununVCGJN2I/JvUWPm1EVsBBLq/J+Nz4hr8t6QOCuEp0HRaeMohyl2XiMFBchVu0mwa05rF7GFQ== -esbuild-linux-s390x@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.44.tgz#5a1e87d5d6236a8791026820936478f3b9cf8e35" - integrity sha512-2YmTm9BrW5aUwBSe8wIEARd9EcnOQmkHp4+IVaO09Ez/C5T866x+ABzhG0bwx0b+QRo9q97CRMaQx2Ngb6/hfw== +esbuild-linux-s390x@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.45.tgz#272288e0f30e4fa0f01d6df6572602c7df78c256" + integrity sha512-1TPeNvNCoahMw745KNTA6POKaFfSqQrBb3fdOL82GXZqyKU/6rHNwGP0NgHe88bAUMp3QZfjGfCGKxfBHL77RQ== esbuild-loader@^2.18.0: version "2.19.0" @@ -11838,61 +11838,61 @@ esbuild-loader@^2.18.0: tapable "^2.2.0" webpack-sources "^2.2.0" -esbuild-netbsd-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.44.tgz#8afb16880b530264ce2ed9fb3df26071eb841312" - integrity sha512-zypdzPmZTCqYS30WHxbcvtC0E6e/ECvl4WueUdbdWhs2dfWJt5RtCBME664EpTznixR3lSN1MQ2NhwQF8MQryw== +esbuild-netbsd-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.45.tgz#0f9af25773e025cd1ca5e22277661cb15d36b406" + integrity sha512-55f2eZ8EQhhOZosqX0mApgRoI9PrVyXlHd9Uivk+B0B4WTKUgzkoHaVk4EkIUtNRQTpDWPciTlpb/C2tUYVejA== -esbuild-openbsd-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.44.tgz#a87455be446d6f5b07a60f060e1eafad454c9d4b" - integrity sha512-8J43ab9ByYl7KteC03HGQjr2HY1ge7sN04lFnwMFWYk2NCn8IuaeeThvLeNjzOYhyT3I6K8puJP0uVXUu+D1xw== +esbuild-openbsd-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.45.tgz#6d47a564eb4b80d9e3aeb4493918b36d17440228" + integrity sha512-Z5sNcT3oN9eryMW3mGn5HAgg7XCxiUS4isqH1tZXpsdOdOESbgbTEP0mBEJU0WU7Vt2gIN5XMbAp7Oigm0k71g== -esbuild-sunos-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.44.tgz#74ce7d5fd815fa60fe0a85b9db7549b1dcb32804" - integrity sha512-OH1/09CGUJwffA+HNM6mqPkSIyHVC3ZnURU/4CCIx7IqWUBn1Sh1HRLQC8/TWNgcs0/1u7ygnc2pgf/AHZJ/Ow== +esbuild-sunos-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.45.tgz#cca97d7d31214bddfa1970386883d1f3f2868cec" + integrity sha512-WmWu4wAm8mIxxK9aWFCj5VHunY3BHQDT3dAPexMLLszPyMF7RDtUYf+Dash9tjyitvnoxPAvR7DpWpirDLQIlQ== -esbuild-windows-32@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.44.tgz#499e1c6cb46c216bdcb62f5b006fec3999bb06a7" - integrity sha512-mCAOL9/rRqwfOfxTu2sjq/eAIs7eAXGiU6sPBnowggI7QS953Iq6o3/uDu010LwfN7zr18c/lEj6/PTwwTB3AA== +esbuild-windows-32@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.45.tgz#afd98449fd6a741a4655e3e4f0e5ae7081765baf" + integrity sha512-DPPehKwPJFBoSG+jILc/vcJNN8pTwz1m6FWojxqtqPhgw8OabTgN4vL7gNMqL/FSeDxF+zyvZeeMrZFYF1d81Q== -esbuild-windows-64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.44.tgz#a8dae69a4615b17f62375859ce9536dd96940a06" - integrity sha512-AG6BH3+YG0s2Q/IfB1cm68FdyFnoE1P+GFbmgFO3tA4UIP8+BKsmKGGZ5I3+ZjcnzOwvT74bQRVrfnQow2KO5Q== +esbuild-windows-64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.45.tgz#5d284b712b119c6306ac5f32e2a611ac6eec2842" + integrity sha512-t6bxFZcp9bLmSs+1pCNL/BW2bq3QEQHxU4HoiMEyWfF8QBU8iNXFI1iLGdyCzB1Ue2739h55tpOvojFrfyNPWA== -esbuild-windows-arm64@0.14.44: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.44.tgz#db73bb68aa75a880bdaa938ccacc0f17e7a4bfea" - integrity sha512-ygYPfYE5By4Sd6szsNr10B0RtWVNOSGmZABSaj4YQBLqh9b9i45VAjVWa8tyIy+UAbKF7WGwybi2wTbSVliO8A== +esbuild-windows-arm64@0.14.45: + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.45.tgz#08089d4cc921939ed352d9c2d928b5d867a6dc67" + integrity sha512-DnhrvjECBJ2L0owoznPb4RqQKZ498SM8J+YHqmqzi0Gf/enkUwwTjB8vPCK6dDuFnNU/NE8f94FhKdkBHYruDQ== esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.39: - version "0.14.44" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.44.tgz#27fa3cd4f55d36780650c7f32cab581abc7a4473" - integrity sha512-Rn+lRRfj60r/3svI6NgAVnetzp3vMOj17BThuhshSj/gS1LR03xrjkDYyfPmrYG/0c3D68rC6FNYMQ3yRbiXeQ== + version "0.14.45" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.45.tgz#3e3192894f91c32cf19207726f136278be46e968" + integrity sha512-JOxGUD8jcs8xE8DjyGWC8by/vLMCXTJ/wuauWipL5kJRZx1dhpqIntb31QHjA45GZJWaXv7SjC/Zwu1bCkXWtQ== optionalDependencies: - esbuild-android-64 "0.14.44" - esbuild-android-arm64 "0.14.44" - esbuild-darwin-64 "0.14.44" - esbuild-darwin-arm64 "0.14.44" - esbuild-freebsd-64 "0.14.44" - esbuild-freebsd-arm64 "0.14.44" - esbuild-linux-32 "0.14.44" - esbuild-linux-64 "0.14.44" - esbuild-linux-arm "0.14.44" - esbuild-linux-arm64 "0.14.44" - esbuild-linux-mips64le "0.14.44" - esbuild-linux-ppc64le "0.14.44" - esbuild-linux-riscv64 "0.14.44" - esbuild-linux-s390x "0.14.44" - esbuild-netbsd-64 "0.14.44" - esbuild-openbsd-64 "0.14.44" - esbuild-sunos-64 "0.14.44" - esbuild-windows-32 "0.14.44" - esbuild-windows-64 "0.14.44" - esbuild-windows-arm64 "0.14.44" + esbuild-android-64 "0.14.45" + esbuild-android-arm64 "0.14.45" + esbuild-darwin-64 "0.14.45" + esbuild-darwin-arm64 "0.14.45" + esbuild-freebsd-64 "0.14.45" + esbuild-freebsd-arm64 "0.14.45" + esbuild-linux-32 "0.14.45" + esbuild-linux-64 "0.14.45" + esbuild-linux-arm "0.14.45" + esbuild-linux-arm64 "0.14.45" + esbuild-linux-mips64le "0.14.45" + esbuild-linux-ppc64le "0.14.45" + esbuild-linux-riscv64 "0.14.45" + esbuild-linux-s390x "0.14.45" + esbuild-netbsd-64 "0.14.45" + esbuild-openbsd-64 "0.14.45" + esbuild-sunos-64 "0.14.45" + esbuild-windows-32 "0.14.45" + esbuild-windows-64 "0.14.45" + esbuild-windows-arm64 "0.14.45" escalade@^3.1.1: version "3.1.1" From 6532c8084a613fd910cb416ae2704aa756e686b0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 18:03:55 +0200 Subject: [PATCH 155/590] remove usage of @ts-ignore Signed-off-by: Patrik Oldsberg --- .../backend-common/src/reading/ReadUrlResponseFactory.test.ts | 3 +-- .../src/components/TemplatePage/createValidator.test.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts index c8a659e792..ff975de9bb 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.test.ts @@ -78,8 +78,7 @@ describe('ReadUrlResponseFactory', () => { let readable: NodeJS.ReadableStream; beforeEach(() => { - // @ts-ignore - readable = new Stream({ encoding: 'utf-8' }); + readable = new Stream({ encoding: 'utf-8' }) as NodeJS.ReadableStream; readable.readable = true; // Write data asynchronously, as soon as possible. diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts index 047f22e44e..a5b04df71e 100644 --- a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts +++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts @@ -23,8 +23,7 @@ describe('createValidator', () => { const validators: Record> = { CustomPicker: (value, validation, _context) => { - // @ts-ignore - if (!value || !value.value) { + if (!value || !(value as { value?: unknown }).value) { validation.addError('Error !'); } }, From 4e3fba492185404d31646a00eef076edeb0bfc5b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 16:20:03 +0000 Subject: [PATCH 156/590] chore(deps): update dependency lint-staged to v13.0.2 Signed-off-by: Renovate Bot --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index f2e3ea95c1..6e356f3763 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9588,9 +9588,9 @@ colorette@2.0.16, colorette@^2.0.10: integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== colorette@^2.0.16, colorette@^2.0.17: - version "2.0.17" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" - integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== colors@1.0.3: version "1.0.3" @@ -16910,9 +16910,9 @@ linkify-it@^3.0.1: uc.micro "^1.0.1" lint-staged@^13.0.0: - version "13.0.1" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.1.tgz#899e78065ab29b88fdd922482411121664ef66be" - integrity sha512-Ykaf4QTi0a02BF7cnq7JIPGOJxH4TkNMWhSlJdH9wOekd0X+gog47Jfh/0L31DqZe5AiydLGC7LkPqpaNm+Kvg== + version "13.0.2" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.2.tgz#35a1c57130e9ad5b1dea784972a40777ba433dd5" + integrity sha512-qQLfLTh9z34eMzfEHENC+QBskZfxjomrf+snF3xJ4BzilORbD989NLqQ00ughsF/A+PT41e87+WsMFabf9++pQ== dependencies: cli-truncate "^3.1.0" colorette "^2.0.17" From 3de1394092a3168b2a7f0bbe6ebf78df5579fbe5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 16:55:57 +0000 Subject: [PATCH 157/590] fix(deps): update dependency @maxim_mazurok/gapi.client.calendar to v3.0.20220610 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e24f69f146..b69f634f0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4128,9 +4128,9 @@ react-is "^16.8.0 || ^17.0.0" "@maxim_mazurok/gapi.client.calendar@^3.0.20220408": - version "3.0.20220603" - resolved "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar/-/gapi.client.calendar-3.0.20220603.tgz#0a6378497d1460058d847afd3c1f0aa83878c83d" - integrity sha512-sLB2ZCevNiGBHWCAg8NVT2+61IwLn9JxEvLgDcLno1GTwPVye3MC8H5bTYeFpL0Pgv58NPc2FIkG0w53Ojp7uw== + version "3.0.20220610" + resolved "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar/-/gapi.client.calendar-3.0.20220610.tgz#46e0092da54fc8eb1342a3d1af04a071a761faac" + integrity sha512-pZwIaTw+PizFSXrF5WqP4dj+b1Vlj/hNwBY4ocWpJ2uhBDoBPAVIc8lEUNwNZVDbAgtbWHD2Kl84UsP1wmBS+w== dependencies: "@types/gapi.client" "*" From f894bba6919c1f30a9fcea7497a471f09365dc53 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 17:22:08 +0000 Subject: [PATCH 158/590] fix(deps): update dependency @roadiehq/backstage-plugin-github-pull-requests to v2.1.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 da8e39d487..fb25d53b69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5070,9 +5070,9 @@ zustand "3.6.9" "@roadiehq/backstage-plugin-github-pull-requests@^2.0.0": - version "2.1.3" - resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-pull-requests/-/backstage-plugin-github-pull-requests-2.1.3.tgz#d37869c2ff5a51794d3d166e80260937e1d51e11" - integrity sha512-2/HVfFFbmSwRTweTYVh5TYEa7Rl2+TPI2nVPps9yse6DBYPpo26XBvhnRT8O8OdJIJ0D4IQe1mZxpeFiDPZQpA== + version "2.1.4" + resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-pull-requests/-/backstage-plugin-github-pull-requests-2.1.4.tgz#2b60230a0a6330c9c7d6a8c08492361b12a1b83a" + integrity sha512-H0Nr2MFQ2iiMLve/l3jqe6HMYwKRkeWNPEvPGkAMMtYmtnMTRMrXuYv+5piPzlwXiwss0NedNdwlVcGsY1J/cw== dependencies: "@backstage/catalog-model" "^1.0.0" "@backstage/core-components" "^0.9.0" From 3d964a936855430458366724eeff038e4c1f17c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 17:51:21 +0000 Subject: [PATCH 159/590] chore(deps): update dependency puppeteer to v14.4.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 4fffab56d2..7fd491b1aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21115,9 +21115,9 @@ pupa@^2.1.1: escape-goat "^2.0.0" puppeteer@^14.0.0: - version "14.3.0" - resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-14.3.0.tgz#0099cabf97767461aca02486313e84fcfc776af6" - integrity sha512-pDtg1+vyw1UPIhUjh2/VW1HUdQnaZJHfMacrJciR3AVm+PBiqdCEcFeFb3UJ/CDEQlHOClm3/WFa7IjY25zIGg== + version "14.4.1" + resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-14.4.1.tgz#6c7437a65f7ba98ef8ad7c2b0f1cf808e91617bb" + integrity sha512-+H0Gm84aXUvSLdSiDROtLlOofftClgw2TdceMvvCU9UvMryappoeS3+eOLfKvoy4sm8B8MWnYmPhWxVFudAOFQ== dependencies: cross-fetch "3.1.5" debug "4.3.4" From 76d589d65018f6904cf671af97ff63c04bf6b073 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 18:52:56 +0000 Subject: [PATCH 160/590] chore(deps): update dependency typescript to v4.7.4 Signed-off-by: Renovate Bot --- cypress/yarn.lock | 6 +++--- yarn.lock | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cypress/yarn.lock b/cypress/yarn.lock index 46f9a158fd..0fc9da99b6 100644 --- a/cypress/yarn.lock +++ b/cypress/yarn.lock @@ -1059,9 +1059,9 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typescript@^4.1.3: - version "4.7.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" - integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== + version "4.7.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== universalify@^2.0.0: version "2.0.0" diff --git a/yarn.lock b/yarn.lock index 7fd491b1aa..c3ab158822 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24897,9 +24897,9 @@ typescript@~4.6.0, typescript@~4.6.3: integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== typescript@~4.7.0: - version "4.7.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" - integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== + version "4.7.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== ua-parser-js@^0.7.18: version "0.7.28" From 2f0fbbf19d60be4e634d76c50f69e0da20cc77be Mon Sep 17 00:00:00 2001 From: Quentin Rousseau Date: Thu, 16 Jun 2022 15:35:31 -0700 Subject: [PATCH 161/590] @rootlyhq Signed-off-by: Quentin Rousseau --- microsite/data/plugins/rootly.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/data/plugins/rootly.yaml b/microsite/data/plugins/rootly.yaml index 6c5cfdf715..dd23dd2362 100644 --- a/microsite/data/plugins/rootly.yaml +++ b/microsite/data/plugins/rootly.yaml @@ -4,6 +4,6 @@ author: Rootly authorUrl: https://rootly.com/ category: Incident Management description: Import your Backstage entities into Rootly services and view incidents & analytics. -documentation: https://github.com/backstage/backstage/blob/master/plugins/rootly/README.md -iconUrl: https://raw.githubusercontent.com/backstage/backstage/master/plugins/rootly/doc/logo.png -npmPackageName: '@backstage/plugin-rootly' +documentation: https://github.com/rootlyhq/backstage-plugin/blob/master/README.md +iconUrl: https://raw.githubusercontent.com/rootlyhq/backstage-plugin/master/docs/logo.png +npmPackageName: '@rootlyhq/backstage-plugin' From b8bbc3398a256bebfd065cb67c3fa55640fbce3a Mon Sep 17 00:00:00 2001 From: Quentin Rousseau Date: Thu, 16 Jun 2022 15:37:53 -0700 Subject: [PATCH 162/590] @rootly/backstage-plugin Signed-off-by: Quentin Rousseau --- microsite/data/plugins/rootly.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/rootly.yaml b/microsite/data/plugins/rootly.yaml index dd23dd2362..c1769f637a 100644 --- a/microsite/data/plugins/rootly.yaml +++ b/microsite/data/plugins/rootly.yaml @@ -6,4 +6,4 @@ category: Incident Management description: Import your Backstage entities into Rootly services and view incidents & analytics. documentation: https://github.com/rootlyhq/backstage-plugin/blob/master/README.md iconUrl: https://raw.githubusercontent.com/rootlyhq/backstage-plugin/master/docs/logo.png -npmPackageName: '@rootlyhq/backstage-plugin' +npmPackageName: '@rootly/backstage-plugin' From 8ac5b73da2a534632bd9b88ed9b03a8165f0a195 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 08:37:28 -0700 Subject: [PATCH 163/590] feat(plugins/pagerduty): prefix exported types with PagerDuty * generate api-report.md * ensure generic exported types are prefixed with PagerDuty for ease of import by consumers Signed-off-by: Alec Jacobs --- plugins/pagerduty/api-report.md | 226 +++++++++--------- plugins/pagerduty/src/api/client.test.ts | 6 +- plugins/pagerduty/src/api/client.ts | 46 ++-- plugins/pagerduty/src/api/index.ts | 14 +- plugins/pagerduty/src/api/types.ts | 47 ++-- .../ChangeEvents/ChangeEventListItem.tsx | 4 +- .../ChangeEvents/ChangeEvents.test.tsx | 6 +- .../components/Escalation/Escalation.test.tsx | 4 +- .../components/Escalation/EscalationUser.tsx | 4 +- .../components/Incident/IncidentListItem.tsx | 4 +- .../components/Incident/Incidents.test.tsx | 4 +- .../components/PagerDutyCard/index.test.tsx | 6 +- plugins/pagerduty/src/components/index.ts | 12 +- plugins/pagerduty/src/components/types.ts | 20 +- 14 files changed, 210 insertions(+), 193 deletions(-) diff --git a/plugins/pagerduty/api-report.md b/plugins/pagerduty/api-report.md index dd6155521b..04cda3da91 100644 --- a/plugins/pagerduty/api-report.md +++ b/plugins/pagerduty/api-report.md @@ -13,23 +13,46 @@ import { Entity } from '@backstage/catalog-model'; import { FetchApi } from '@backstage/core-plugin-api'; import { ReactNode } from 'react'; -// Warning: (ae-missing-release-tag) "Assignee" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "EntityPagerDutyCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type Assignee = { +export const EntityPagerDutyCard: () => JSX.Element; + +// Warning: (ae-missing-release-tag) "isPluginApplicableToEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +const isPluginApplicableToEntity: (entity: Entity) => boolean; +export { isPluginApplicableToEntity as isPagerDutyAvailable }; +export { isPluginApplicableToEntity }; + +// Warning: (ae-forgotten-export) The symbol "PagerDutyApi" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "pagerDutyApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const pagerDutyApiRef: ApiRef; + +// Warning: (ae-missing-release-tag) "PagerDutyAssignee" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyAssignee = { id: string; summary: string; html_url: string; }; -// Warning: (ae-missing-release-tag) "ChangeEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "PagerDutyCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ChangeEvent = { +export const PagerDutyCard: () => JSX.Element; + +// Warning: (ae-missing-release-tag) "PagerDutyChangeEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyChangeEvent = { id: string; integration: [ { - service: Service; + service: PagerDutyService; }, ]; source: string; @@ -44,114 +67,56 @@ export type ChangeEvent = { timestamp: string; }; -// Warning: (ae-missing-release-tag) "ChangeEventsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "PagerDutyChangeEventsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ChangeEventsResponse = { - change_events: ChangeEvent[]; +export type PagerDutyChangeEventsResponse = { + change_events: PagerDutyChangeEvent[]; }; -// Warning: (ae-missing-release-tag) "ClientApiConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type ClientApiConfig = ClientApiDependencies & { - eventsBaseUrl?: string; -}; - -// Warning: (ae-missing-release-tag) "ClientApiDependencies" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type ClientApiDependencies = { - discoveryApi: DiscoveryApi; - fetchApi: FetchApi; -}; - -// Warning: (ae-missing-release-tag) "EntityPagerDutyCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const EntityPagerDutyCard: () => JSX.Element; - -// Warning: (ae-missing-release-tag) "Incident" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type Incident = { - id: string; - title: string; - status: string; - html_url: string; - assignments: [ - { - assignee: Assignee; - }, - ]; - serviceId: string; - created_at: string; -}; - -// Warning: (ae-missing-release-tag) "IncidentsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type IncidentsResponse = { - incidents: Incident[]; -}; - -// Warning: (ae-missing-release-tag) "isPluginApplicableToEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -const isPluginApplicableToEntity: (entity: Entity) => boolean; -export { isPluginApplicableToEntity as isPagerDutyAvailable }; -export { isPluginApplicableToEntity }; - -// Warning: (ae-missing-release-tag) "OnCall" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type OnCall = { - user: User; - escalation_level: number; -}; - -// Warning: (ae-missing-release-tag) "OnCallsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type OnCallsResponse = { - oncalls: OnCall[]; -}; - -// Warning: (ae-forgotten-export) The symbol "PagerDutyApi" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "pagerDutyApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const pagerDutyApiRef: ApiRef; - -// Warning: (ae-missing-release-tag) "PagerDutyCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const PagerDutyCard: () => JSX.Element; - // Warning: (ae-missing-release-tag) "PagerDutyClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export class PagerDutyClient implements PagerDutyApi { - constructor(config: ClientApiConfig); + constructor(config: PagerDutyClientApiConfig); // (undocumented) static fromConfig( configApi: ConfigApi, - { discoveryApi, fetchApi }: ClientApiDependencies, + { discoveryApi, fetchApi }: PagerDutyClientApiDependencies, ): PagerDutyClient; // (undocumented) - getChangeEventsByServiceId(serviceId: string): Promise; + getChangeEventsByServiceId( + serviceId: string, + ): Promise; // (undocumented) - getIncidentsByServiceId(serviceId: string): Promise; + getIncidentsByServiceId( + serviceId: string, + ): Promise; // (undocumented) - getOnCallByPolicyId(policyId: string): Promise; + getOnCallByPolicyId(policyId: string): Promise; // (undocumented) getServiceByEntity( pagerDutyEntity: PagerDutyEntity, - ): Promise; + ): Promise; // (undocumented) - triggerAlarm(request: TriggerAlarmRequest): Promise; + triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise; } +// Warning: (ae-missing-release-tag) "PagerDutyClientApiConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyClientApiConfig = PagerDutyClientApiDependencies & { + eventsBaseUrl?: string; +}; + +// Warning: (ae-missing-release-tag) "PagerDutyClientApiDependencies" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyClientApiDependencies = { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; +}; + // Warning: (ae-missing-release-tag) "PagerDutyEntity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -161,6 +126,45 @@ export type PagerDutyEntity = { name: string; }; +// Warning: (ae-missing-release-tag) "PagerDutyIncident" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyIncident = { + id: string; + title: string; + status: string; + html_url: string; + assignments: [ + { + assignee: PagerDutyAssignee; + }, + ]; + serviceId: string; + created_at: string; +}; + +// Warning: (ae-missing-release-tag) "PagerDutyIncidentsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyIncidentsResponse = { + incidents: PagerDutyIncident[]; +}; + +// Warning: (ae-missing-release-tag) "PagerDutyOnCall" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyOnCall = { + user: PagerDutyUser; + escalation_level: number; +}; + +// Warning: (ae-missing-release-tag) "PagerDutyOnCallsResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyOnCallsResponse = { + oncalls: PagerDutyOnCall[]; +}; + // Warning: (ae-missing-release-tag) "pagerDutyPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -168,38 +172,49 @@ const pagerDutyPlugin: BackstagePlugin<{}, {}>; export { pagerDutyPlugin }; export { pagerDutyPlugin as plugin }; -// Warning: (ae-missing-release-tag) "Service" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "PagerDutyService" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type Service = { +export type PagerDutyService = { id: string; name: string; html_url: string; integrationKey: string; escalation_policy: { id: string; - user: User; + user: PagerDutyUser; html_url: string; }; }; -// Warning: (ae-missing-release-tag) "ServiceResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "PagerDutyServiceResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ServiceResponse = { - service: Service; +export type PagerDutyServiceResponse = { + service: PagerDutyService; }; -// Warning: (ae-missing-release-tag) "TriggerAlarmRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "PagerDutyTriggerAlarmRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type TriggerAlarmRequest = { +export type PagerDutyTriggerAlarmRequest = { integrationKey: string; source: string; description: string; userName: string; }; +// Warning: (ae-missing-release-tag) "PagerDutyUser" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PagerDutyUser = { + id: string; + summary: string; + email: string; + html_url: string; + name: string; +}; + // Warning: (ae-forgotten-export) The symbol "TriggerButtonProps" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "TriggerButton" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -210,15 +225,4 @@ export function TriggerButton(props: TriggerButtonProps): JSX.Element; // // @public (undocumented) export class UnauthorizedError extends Error {} - -// Warning: (ae-missing-release-tag) "User" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type User = { - id: string; - summary: string; - email: string; - html_url: string; - name: string; -}; ``` diff --git a/plugins/pagerduty/src/api/client.test.ts b/plugins/pagerduty/src/api/client.test.ts index d3e9b58542..2e9efefb18 100644 --- a/plugins/pagerduty/src/api/client.test.ts +++ b/plugins/pagerduty/src/api/client.test.ts @@ -17,7 +17,7 @@ import { MockFetchApi } from '@backstage/test-utils'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { PagerDutyClient, UnauthorizedError } from './client'; import { PagerDutyEntity } from '../types'; -import { Service, User } from '../components/types'; +import { PagerDutyService, PagerDutyUser } from '../components/types'; import { NotFoundError } from '@backstage/errors'; const mockFetch = jest.fn().mockName('fetch'); @@ -34,7 +34,7 @@ const mockFetchApi: MockFetchApi = new MockFetchApi({ let client: PagerDutyClient; let pagerDutyEntity: PagerDutyEntity; -const user: User = { +const user: PagerDutyUser = { name: 'person1', id: 'p1', summary: 'person1', @@ -42,7 +42,7 @@ const user: User = { html_url: 'http://a.com/id1', }; -const service: Service = { +const service: PagerDutyService = { id: 'def456', name: 'pagerduty-name', html_url: 'www.example.com', diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index ebf350add2..dbb4248f0f 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -16,15 +16,15 @@ import { PagerDutyApi, - TriggerAlarmRequest, - ServicesResponse, - ServiceResponse, - IncidentsResponse, - OnCallsResponse, - ClientApiDependencies, - ClientApiConfig, + PagerDutyTriggerAlarmRequest, + PagerDutyServicesResponse, + PagerDutyServiceResponse, + PagerDutyIncidentsResponse, + PagerDutyOnCallsResponse, + PagerDutyClientApiDependencies, + PagerDutyClientApiConfig, RequestOptions, - ChangeEventsResponse, + PagerDutyChangeEventsResponse, } from './types'; import { createApiRef, ConfigApi } from '@backstage/core-plugin-api'; import { NotFoundError } from '@backstage/errors'; @@ -42,7 +42,7 @@ const commonGetServiceParams = export class PagerDutyClient implements PagerDutyApi { static fromConfig( configApi: ConfigApi, - { discoveryApi, fetchApi }: ClientApiDependencies, + { discoveryApi, fetchApi }: PagerDutyClientApiDependencies, ) { const eventsBaseUrl: string = configApi.getOptionalString('pagerDuty.eventsBaseUrl') ?? @@ -54,21 +54,21 @@ export class PagerDutyClient implements PagerDutyApi { fetchApi, }); } - constructor(private readonly config: ClientApiConfig) {} + constructor(private readonly config: PagerDutyClientApiConfig) {} async getServiceByEntity( pagerDutyEntity: PagerDutyEntity, - ): Promise { + ): Promise { const { integrationKey, serviceId } = pagerDutyEntity; - let response: ServiceResponse; + let response: PagerDutyServiceResponse; let url: string; if (integrationKey) { url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/services?${commonGetServiceParams}&query=${integrationKey}`; - const { services } = await this.getByUrl(url); + const { services } = await this.getByUrl(url); const service = services[0]; if (!service) throw new NotFoundError(); @@ -79,7 +79,7 @@ export class PagerDutyClient implements PagerDutyApi { 'proxy', )}/pagerduty/services/${serviceId}?${commonGetServiceParams}`; - response = await this.getByUrl(url); + response = await this.getByUrl(url); } else { throw new NotFoundError(); } @@ -87,36 +87,40 @@ export class PagerDutyClient implements PagerDutyApi { return response; } - async getIncidentsByServiceId(serviceId: string): Promise { + async getIncidentsByServiceId( + serviceId: string, + ): Promise { const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/incidents?${params}`; - return await this.getByUrl(url); + return await this.getByUrl(url); } async getChangeEventsByServiceId( serviceId: string, - ): Promise { + ): Promise { const params = `limit=5&time_zone=UTC&sort_by=timestamp`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/services/${serviceId}/change_events?${params}`; - return await this.getByUrl(url); + return await this.getByUrl(url); } - async getOnCallByPolicyId(policyId: string): Promise { + async getOnCallByPolicyId( + policyId: string, + ): Promise { const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${policyId}`; const url = `${await this.config.discoveryApi.getBaseUrl( 'proxy', )}/pagerduty/oncalls?${params}`; - return await this.getByUrl(url); + return await this.getByUrl(url); } - triggerAlarm(request: TriggerAlarmRequest): Promise { + triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise { const { integrationKey, source, description, userName } = request; const body = JSON.stringify({ diff --git a/plugins/pagerduty/src/api/index.ts b/plugins/pagerduty/src/api/index.ts index a88137b979..9a0c08973d 100644 --- a/plugins/pagerduty/src/api/index.ts +++ b/plugins/pagerduty/src/api/index.ts @@ -16,11 +16,11 @@ export { PagerDutyClient, pagerDutyApiRef, UnauthorizedError } from './client'; export type { - ServiceResponse, - IncidentsResponse, - ChangeEventsResponse, - OnCallsResponse, - TriggerAlarmRequest, - ClientApiDependencies, - ClientApiConfig, + PagerDutyServiceResponse, + PagerDutyIncidentsResponse, + PagerDutyChangeEventsResponse, + PagerDutyOnCallsResponse, + PagerDutyTriggerAlarmRequest, + PagerDutyClientApiDependencies, + PagerDutyClientApiConfig, } from './types'; diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index ed6c1f222a..5163718154 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -14,31 +14,36 @@ * limitations under the License. */ -import { Incident, ChangeEvent, OnCall, Service } from '../components/types'; +import { + PagerDutyIncident, + PagerDutyChangeEvent, + PagerDutyOnCall, + PagerDutyService, +} from '../components/types'; import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; import { PagerDutyEntity } from '../types'; -export type ServicesResponse = { - services: Service[]; +export type PagerDutyServicesResponse = { + services: PagerDutyService[]; }; -export type ServiceResponse = { - service: Service; +export type PagerDutyServiceResponse = { + service: PagerDutyService; }; -export type IncidentsResponse = { - incidents: Incident[]; +export type PagerDutyIncidentsResponse = { + incidents: PagerDutyIncident[]; }; -export type ChangeEventsResponse = { - change_events: ChangeEvent[]; +export type PagerDutyChangeEventsResponse = { + change_events: PagerDutyChangeEvent[]; }; -export type OnCallsResponse = { - oncalls: OnCall[]; +export type PagerDutyOnCallsResponse = { + oncalls: PagerDutyOnCall[]; }; -export type TriggerAlarmRequest = { +export type PagerDutyTriggerAlarmRequest = { integrationKey: string; source: string; description: string; @@ -52,38 +57,42 @@ export interface PagerDutyApi { */ getServiceByEntity( pagerDutyEntity: PagerDutyEntity, - ): Promise; + ): Promise; /** * Fetches a list of incidents a provided service has. * */ - getIncidentsByServiceId(serviceId: string): Promise; + getIncidentsByServiceId( + serviceId: string, + ): Promise; /** * Fetches a list of change events a provided service has. * */ - getChangeEventsByServiceId(serviceId: string): Promise; + getChangeEventsByServiceId( + serviceId: string, + ): Promise; /** * Fetches the list of users in an escalation policy. * */ - getOnCallByPolicyId(policyId: string): Promise; + getOnCallByPolicyId(policyId: string): Promise; /** * Triggers an incident to whoever is on-call. */ - triggerAlarm(request: TriggerAlarmRequest): Promise; + triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise; } -export type ClientApiDependencies = { +export type PagerDutyClientApiDependencies = { discoveryApi: DiscoveryApi; fetchApi: FetchApi; }; -export type ClientApiConfig = ClientApiDependencies & { +export type PagerDutyClientApiConfig = PagerDutyClientApiDependencies & { eventsBaseUrl?: string; }; diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx index 4912277cee..505d58eabb 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx @@ -26,7 +26,7 @@ import { Typography, } from '@material-ui/core'; import { DateTime, Duration } from 'luxon'; -import { ChangeEvent } from '../types'; +import { PagerDutyChangeEvent } from '../types'; import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; import { BackstageTheme } from '@backstage/theme'; @@ -44,7 +44,7 @@ const useStyles = makeStyles({ }); type Props = { - changeEvent: ChangeEvent; + changeEvent: PagerDutyChangeEvent; }; export const ChangeEventListItem = ({ changeEvent }: Props) => { diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx index 017e394de0..a518e0caea 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEvents.test.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; import { render, waitFor } from '@testing-library/react'; -import { ChangeEvent } from '../types'; +import { PagerDutyChangeEvent } from '../types'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; import { pagerDutyApiRef } from '../../api'; import { ApiProvider } from '@backstage/core-app-api'; @@ -74,7 +74,7 @@ describe('Incidents', () => { summary: 'sum of EVENT', timestamp: '2020-07-18T08:42:58.315+0000', }, - ] as ChangeEvent[], + ] as PagerDutyChangeEvent[], })); const { getByText, getAllByTitle, queryByTestId } = render( wrapInTestApp( @@ -121,7 +121,7 @@ describe('Incidents', () => { summary: 'sum of EVENT', timestamp: '2020-07-18T08:42:58.315+0000', }, - ] as ChangeEvent[], + ] as PagerDutyChangeEvent[], })); const { getByText, getAllByTitle, queryByTestId } = render( wrapInTestApp( diff --git a/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx b/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx index 33e8865f59..97c02a37f3 100644 --- a/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx +++ b/plugins/pagerduty/src/components/Escalation/Escalation.test.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { render, waitFor } from '@testing-library/react'; import { EscalationPolicy } from './EscalationPolicy'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; -import { User } from '../types'; +import { PagerDutyUser } from '../types'; import { pagerDutyApiRef } from '../../api'; import { ApiProvider } from '@backstage/core-app-api'; @@ -57,7 +57,7 @@ describe('Escalation', () => { summary: 'person1', email: 'person1@example.com', html_url: 'http://a.com/id1', - } as User, + } as PagerDutyUser, }, ], })); diff --git a/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx b/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx index a460906d22..d418ad02c0 100644 --- a/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx +++ b/plugins/pagerduty/src/components/Escalation/EscalationUser.tsx @@ -28,7 +28,7 @@ import { import Avatar from '@material-ui/core/Avatar'; import EmailIcon from '@material-ui/icons/Email'; import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; -import { User } from '../types'; +import { PagerDutyUser } from '../types'; const useStyles = makeStyles({ listItemPrimary: { @@ -37,7 +37,7 @@ const useStyles = makeStyles({ }); type Props = { - user: User; + user: PagerDutyUser; }; export const EscalationUser = ({ user }: Props) => { diff --git a/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx b/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx index 807685a83e..5945c45e83 100644 --- a/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx +++ b/plugins/pagerduty/src/components/Incident/IncidentListItem.tsx @@ -29,7 +29,7 @@ import { import Done from '@material-ui/icons/Done'; import Warning from '@material-ui/icons/Warning'; import { DateTime, Duration } from 'luxon'; -import { Incident } from '../types'; +import { PagerDutyIncident } from '../types'; import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; import { BackstageTheme } from '@backstage/theme'; @@ -61,7 +61,7 @@ const useStyles = makeStyles(theme => ({ })); type Props = { - incident: Incident; + incident: PagerDutyIncident; }; export const IncidentListItem = ({ incident }: Props) => { diff --git a/plugins/pagerduty/src/components/Incident/Incidents.test.tsx b/plugins/pagerduty/src/components/Incident/Incidents.test.tsx index ad69bc083e..a83874a995 100644 --- a/plugins/pagerduty/src/components/Incident/Incidents.test.tsx +++ b/plugins/pagerduty/src/components/Incident/Incidents.test.tsx @@ -18,7 +18,7 @@ import { render, waitFor } from '@testing-library/react'; import { Incidents } from './Incidents'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; import { pagerDutyApiRef } from '../../api'; -import { Incident } from '../types'; +import { PagerDutyIncident } from '../types'; import { ApiProvider } from '@backstage/core-app-api'; const mockPagerDutyApi = { @@ -83,7 +83,7 @@ describe('Incidents', () => { html_url: 'http://a.com/id2', serviceId: 'sId2', }, - ] as Incident[], + ] as PagerDutyIncident[], })); const { getByText, getAllByTitle, queryByTestId } = render( wrapInTestApp( diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx index 9a6e9a3ed2..85202a9cfc 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.test.tsx @@ -21,7 +21,7 @@ import { EntityProvider } from '@backstage/plugin-catalog-react'; import { NotFoundError } from '@backstage/errors'; import { TestApiRegistry, wrapInTestApp } from '@backstage/test-utils'; import { pagerDutyApiRef, UnauthorizedError, PagerDutyClient } from '../../api'; -import { Service, User } from '../types'; +import { PagerDutyService, PagerDutyUser } from '../types'; import { alertApiRef } from '@backstage/core-plugin-api'; import { ApiProvider } from '@backstage/core-app-api'; @@ -69,7 +69,7 @@ const entityWithAllAnnotations: Entity = { }, }; -const user: User = { +const user: PagerDutyUser = { name: 'person1', id: 'p1', summary: 'person1', @@ -77,7 +77,7 @@ const user: User = { html_url: 'http://a.com/id1', }; -const service: Service = { +const service: PagerDutyService = { id: 'def456', name: 'pagerduty-name', html_url: 'www.example.com', diff --git a/plugins/pagerduty/src/components/index.ts b/plugins/pagerduty/src/components/index.ts index a452c12e12..17bb2c03dc 100644 --- a/plugins/pagerduty/src/components/index.ts +++ b/plugins/pagerduty/src/components/index.ts @@ -15,12 +15,12 @@ */ export type { - ChangeEvent, - Incident, - Service, - OnCall, - Assignee, - User, + PagerDutyChangeEvent, + PagerDutyIncident, + PagerDutyService, + PagerDutyOnCall, + PagerDutyAssignee, + PagerDutyUser, } from './types'; export { diff --git a/plugins/pagerduty/src/components/types.ts b/plugins/pagerduty/src/components/types.ts index d0d05d82d1..89cdffea16 100644 --- a/plugins/pagerduty/src/components/types.ts +++ b/plugins/pagerduty/src/components/types.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -export type ChangeEvent = { +export type PagerDutyChangeEvent = { id: string; integration: [ { - service: Service; + service: PagerDutyService; }, ]; source: string; @@ -33,44 +33,44 @@ export type ChangeEvent = { timestamp: string; }; -export type Incident = { +export type PagerDutyIncident = { id: string; title: string; status: string; html_url: string; assignments: [ { - assignee: Assignee; + assignee: PagerDutyAssignee; }, ]; serviceId: string; created_at: string; }; -export type Service = { +export type PagerDutyService = { id: string; name: string; html_url: string; integrationKey: string; escalation_policy: { id: string; - user: User; + user: PagerDutyUser; html_url: string; }; }; -export type OnCall = { - user: User; +export type PagerDutyOnCall = { + user: PagerDutyUser; escalation_level: number; }; -export type Assignee = { +export type PagerDutyAssignee = { id: string; summary: string; html_url: string; }; -export type User = { +export type PagerDutyUser = { id: string; summary: string; email: string; From 7889629264d2d3c6b31da00496bd8be9aa6c2cf5 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 08:39:59 -0700 Subject: [PATCH 164/590] fix(plugins/pagerduty): properly type optional variable Signed-off-by: Alec Jacobs --- .../src/components/ChangeEvents/ChangeEventListItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx index 505d58eabb..7b531bf1de 100644 --- a/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx +++ b/plugins/pagerduty/src/components/ChangeEvents/ChangeEventListItem.tsx @@ -54,7 +54,7 @@ export const ChangeEventListItem = ({ changeEvent }: Props) => { const changedAt = DateTime.local() .minus(Duration.fromMillis(duration)) .toRelative({ locale: 'en' }); - let externalLinkElem = null; + let externalLinkElem: JSX.Element | undefined; if (changeEvent.links.length > 0) { const text: string = changeEvent.links[0].text; externalLinkElem = ( From ce89b1801ef25fd6052135d68b4e175a9b0499e2 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 09:28:19 -0700 Subject: [PATCH 165/590] feat(plugins/pagerduty): add pagerDutyEntity helper * parse a PagerDutyEntity from a Backstage Entity Signed-off-by: Alec Jacobs --- .../src/components/pagerDutyEntity.test.ts | 98 +++++++++++++++++++ .../src/components/pagerDutyEntity.ts | 29 ++++++ 2 files changed, 127 insertions(+) create mode 100644 plugins/pagerduty/src/components/pagerDutyEntity.test.ts create mode 100644 plugins/pagerduty/src/components/pagerDutyEntity.ts diff --git a/plugins/pagerduty/src/components/pagerDutyEntity.test.ts b/plugins/pagerduty/src/components/pagerDutyEntity.test.ts new file mode 100644 index 0000000000..cf551d3d6e --- /dev/null +++ b/plugins/pagerduty/src/components/pagerDutyEntity.test.ts @@ -0,0 +1,98 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { getPagerDutyEntity } from './pagerDutyEntity'; + +const entity: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/integration-key': 'abc123', + }, + }, +}; + +const entityWithoutAnnotations: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: {}, + }, +}; + +const entityWithServiceId: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/service-id': 'def456', + }, + }, +}; + +const entityWithAllAnnotations: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/integration-key': 'abc123', + 'pagerduty.com/service-id': 'def456', + }, + }, +}; + +describe('getPagerDutyEntity', () => { + describe('when entity has no annotations', () => { + it('returns a PagerDutyEntity', () => { + expect(getPagerDutyEntity(entityWithoutAnnotations)).toEqual({ + name: 'pagerduty-test', + }); + }); + }); + + describe('when entity has integration key annotation', () => { + it('returns a PagerDutyEntity', () => { + expect(getPagerDutyEntity(entity)).toEqual({ + name: 'pagerduty-test', + integrationKey: 'abc123', + }); + }); + }); + + describe('when entity has service id annotation', () => { + it('returns a PagerDutyEntity', () => { + expect(getPagerDutyEntity(entityWithServiceId)).toEqual({ + name: 'pagerduty-test', + serviceId: 'def456', + }); + }); + }); + + describe('when entity has all annotations', () => { + it('returns a PagerDutyEntity', () => { + expect(getPagerDutyEntity(entityWithAllAnnotations)).toEqual({ + name: 'pagerduty-test', + integrationKey: 'abc123', + serviceId: 'def456', + }); + }); + }); +}); diff --git a/plugins/pagerduty/src/components/pagerDutyEntity.ts b/plugins/pagerduty/src/components/pagerDutyEntity.ts new file mode 100644 index 0000000000..950525881e --- /dev/null +++ b/plugins/pagerduty/src/components/pagerDutyEntity.ts @@ -0,0 +1,29 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { PagerDutyEntity } from '../types'; +import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID } from './constants'; + +export function getPagerDutyEntity(entity: Entity): PagerDutyEntity { + const { + [PAGERDUTY_INTEGRATION_KEY]: integrationKey, + [PAGERDUTY_SERVICE_ID]: serviceId, + } = entity.metadata.annotations || ({} as Record); + const name = entity.metadata.name; + + return { integrationKey, serviceId, name }; +} From fb9b81780aec0367a368c8ce692846ca6c5a0ad0 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 09:29:45 -0700 Subject: [PATCH 166/590] feat(plugins/pagerduty): use getPagerDutyEntity helper in hook Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/hooks/index.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/plugins/pagerduty/src/hooks/index.ts b/plugins/pagerduty/src/hooks/index.ts index 503597a69e..8950e443e2 100644 --- a/plugins/pagerduty/src/hooks/index.ts +++ b/plugins/pagerduty/src/hooks/index.ts @@ -16,19 +16,10 @@ import { useEntity } from '@backstage/plugin-catalog-react'; import { PagerDutyEntity } from '../types'; - -import { - PAGERDUTY_INTEGRATION_KEY, - PAGERDUTY_SERVICE_ID, -} from '../components/constants'; +import { getPagerDutyEntity } from '../components/pagerDutyEntity'; export function usePagerdutyEntity(): PagerDutyEntity { const { entity } = useEntity(); - const { - [PAGERDUTY_INTEGRATION_KEY]: integrationKey, - [PAGERDUTY_SERVICE_ID]: serviceId, - } = entity.metadata.annotations || ({} as Record); - const name = entity.metadata.name; - return { integrationKey, serviceId, name }; + return getPagerDutyEntity(entity); } From a9b6b729c48e6bdafc8099ad2ccdead858f0b746 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 14:39:46 -0700 Subject: [PATCH 167/590] feat(plugins/pagerduty): refactor PagerDutyClient.getServiceByEntity * provide raw backstage entity Signed-off-by: Alec Jacobs --- plugins/pagerduty/src/api/client.test.ts | 123 ++++++++++-------- plugins/pagerduty/src/api/client.ts | 9 +- plugins/pagerduty/src/api/types.ts | 8 +- .../src/components/PagerDutyCard/index.tsx | 10 +- 4 files changed, 82 insertions(+), 68 deletions(-) diff --git a/plugins/pagerduty/src/api/client.test.ts b/plugins/pagerduty/src/api/client.test.ts index 2e9efefb18..a32a533e68 100644 --- a/plugins/pagerduty/src/api/client.test.ts +++ b/plugins/pagerduty/src/api/client.test.ts @@ -16,9 +16,9 @@ import { MockFetchApi } from '@backstage/test-utils'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { PagerDutyClient, UnauthorizedError } from './client'; -import { PagerDutyEntity } from '../types'; import { PagerDutyService, PagerDutyUser } from '../components/types'; import { NotFoundError } from '@backstage/errors'; +import { Entity } from '@backstage/catalog-model'; const mockFetch = jest.fn().mockName('fetch'); const mockDiscoveryApi: jest.Mocked = { @@ -32,7 +32,7 @@ const mockFetchApi: MockFetchApi = new MockFetchApi({ }); let client: PagerDutyClient; -let pagerDutyEntity: PagerDutyEntity; +let entity: Entity; const user: PagerDutyUser = { name: 'person1', @@ -76,9 +76,15 @@ describe('PagerDutyClient', () => { describe('getServiceByEntity', () => { describe('when provided entity has an integrationKey value', () => { beforeEach(() => { - pagerDutyEntity = { - name: 'pagerduty-test', - integrationKey: 'abc123', + entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/integration-key': 'abc123', + }, + }, }; }); @@ -89,7 +95,7 @@ describe('PagerDutyClient', () => { json: () => Promise.resolve({ services: [service] }), }); - expect(await client.getServiceByEntity(pagerDutyEntity)).toEqual({ + expect(await client.getServiceByEntity(entity)).toEqual({ service, }); expect(mockFetch).toHaveBeenCalledWith( @@ -108,9 +114,9 @@ describe('PagerDutyClient', () => { }); it('throws UnauthorizedError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(UnauthorizedError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + UnauthorizedError, + ); }); }); @@ -124,9 +130,9 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(NotFoundError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + NotFoundError, + ); }); }); @@ -143,9 +149,7 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError( + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( 'Request failed with 500, Not valid request internal error occurred', ); }); @@ -161,18 +165,24 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(NotFoundError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + NotFoundError, + ); }); }); }); describe('when provided entity has a serviceId value', () => { beforeEach(() => { - pagerDutyEntity = { - name: 'pagerduty-test', - serviceId: 'def456', + entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/service-id': 'def456', + }, + }, }; }); @@ -183,7 +193,7 @@ describe('PagerDutyClient', () => { json: () => Promise.resolve({ service }), }); - expect(await client.getServiceByEntity(pagerDutyEntity)).toEqual({ + expect(await client.getServiceByEntity(entity)).toEqual({ service, }); expect(mockFetch).toHaveBeenCalledWith( @@ -202,9 +212,9 @@ describe('PagerDutyClient', () => { }); it('throws UnauthorizedError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(UnauthorizedError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + UnauthorizedError, + ); }); }); @@ -218,9 +228,9 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(NotFoundError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + NotFoundError, + ); }); }); @@ -237,9 +247,7 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError( + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( 'Request failed with 500, Not valid request internal error occurred', ); }); @@ -248,10 +256,16 @@ describe('PagerDutyClient', () => { describe('when provided entity has both integrationKey and serviceId', () => { beforeEach(() => { - pagerDutyEntity = { - name: 'pagerduty-test', - integrationKey: 'abc123', - serviceId: 'def456', + entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: { + 'pagerduty.com/integration-key': 'abc123', + 'pagerduty.com/service-id': 'def456', + }, + }, }; }); @@ -262,7 +276,7 @@ describe('PagerDutyClient', () => { json: () => Promise.resolve({ services: [service] }), }); - expect(await client.getServiceByEntity(pagerDutyEntity)).toEqual({ + expect(await client.getServiceByEntity(entity)).toEqual({ service, }); expect(mockFetch).toHaveBeenCalledWith( @@ -281,9 +295,9 @@ describe('PagerDutyClient', () => { }); it('throws UnauthorizedError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(UnauthorizedError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + UnauthorizedError, + ); }); }); @@ -297,9 +311,9 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(NotFoundError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + NotFoundError, + ); }); }); @@ -316,9 +330,7 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError( + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( 'Request failed with 500, Not valid request internal error occurred', ); }); @@ -334,24 +346,29 @@ describe('PagerDutyClient', () => { }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(NotFoundError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + NotFoundError, + ); }); }); }); describe('when provided entity has no integrationKey or serviceId values', () => { beforeEach(() => { - pagerDutyEntity = { - name: 'pagerduty-test', + entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'pagerduty-test', + annotations: {}, + }, }; }); it('throws NotFoundError', async () => { - await expect( - client.getServiceByEntity(pagerDutyEntity), - ).rejects.toThrowError(NotFoundError); + await expect(client.getServiceByEntity(entity)).rejects.toThrowError( + NotFoundError, + ); expect(mockFetch).not.toHaveBeenCalled(); }); }); diff --git a/plugins/pagerduty/src/api/client.ts b/plugins/pagerduty/src/api/client.ts index dbb4248f0f..69a702f66d 100644 --- a/plugins/pagerduty/src/api/client.ts +++ b/plugins/pagerduty/src/api/client.ts @@ -28,7 +28,8 @@ import { } from './types'; import { createApiRef, ConfigApi } from '@backstage/core-plugin-api'; import { NotFoundError } from '@backstage/errors'; -import { PagerDutyEntity } from '../types'; +import { Entity } from '@backstage/catalog-model'; +import { getPagerDutyEntity } from '../components/pagerDutyEntity'; export class UnauthorizedError extends Error {} @@ -56,10 +57,8 @@ export class PagerDutyClient implements PagerDutyApi { } constructor(private readonly config: PagerDutyClientApiConfig) {} - async getServiceByEntity( - pagerDutyEntity: PagerDutyEntity, - ): Promise { - const { integrationKey, serviceId } = pagerDutyEntity; + async getServiceByEntity(entity: Entity): Promise { + const { integrationKey, serviceId } = getPagerDutyEntity(entity); let response: PagerDutyServiceResponse; let url: string; diff --git a/plugins/pagerduty/src/api/types.ts b/plugins/pagerduty/src/api/types.ts index 5163718154..786b0bdffd 100644 --- a/plugins/pagerduty/src/api/types.ts +++ b/plugins/pagerduty/src/api/types.ts @@ -21,7 +21,7 @@ import { PagerDutyService, } from '../components/types'; import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; -import { PagerDutyEntity } from '../types'; +import { Entity } from '@backstage/catalog-model'; export type PagerDutyServicesResponse = { services: PagerDutyService[]; @@ -52,12 +52,10 @@ export type PagerDutyTriggerAlarmRequest = { export interface PagerDutyApi { /** - * Fetches the service for the provided PagerDutyEntity. + * Fetches the service for the provided Entity. * */ - getServiceByEntity( - pagerDutyEntity: PagerDutyEntity, - ): Promise; + getServiceByEntity(entity: Entity): Promise; /** * Fetches a list of incidents a provided service has. diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index 174caf4900..e8ba2c522c 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -25,7 +25,6 @@ import AlarmAddIcon from '@material-ui/icons/AlarmAdd'; import { MissingTokenError, ServiceNotFoundError } from '../Errors'; import WebIcon from '@material-ui/icons/Web'; import DateRangeIcon from '@material-ui/icons/DateRange'; -import { usePagerdutyEntity } from '../../hooks'; import { PAGERDUTY_INTEGRATION_KEY, PAGERDUTY_SERVICE_ID } from '../constants'; import { TriggerDialog } from '../TriggerDialog'; import { ChangeEvents } from '../ChangeEvents'; @@ -40,6 +39,8 @@ import { CardTab, InfoCard, } from '@backstage/core-components'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import { getPagerDutyEntity } from '../pagerDutyEntity'; const BasicCard = ({ children }: { children: ReactNode }) => ( {children} @@ -52,7 +53,8 @@ export const isPluginApplicableToEntity = (entity: Entity) => ); export const PagerDutyCard = () => { - const pagerDutyEntity = usePagerdutyEntity(); + const { entity } = useEntity(); + const pagerDutyEntity = getPagerDutyEntity(entity); const api = useApi(pagerDutyApiRef); const [refreshIncidents, setRefreshIncidents] = useState(false); const [refreshChangeEvents, setRefreshChangeEvents] = @@ -76,9 +78,7 @@ export const PagerDutyCard = () => { loading, error, } = useAsync(async () => { - const { service: foundService } = await api.getServiceByEntity( - pagerDutyEntity, - ); + const { service: foundService } = await api.getServiceByEntity(entity); return { id: foundService.id, From 75813194a68085f54c22f55d63fee29129e9f2fd Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 14:42:48 -0700 Subject: [PATCH 168/590] chore(plugins/pagerduty): regenerate api-report Signed-off-by: Alec Jacobs --- plugins/pagerduty/api-report.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/pagerduty/api-report.md b/plugins/pagerduty/api-report.md index 04cda3da91..be3fa9fa23 100644 --- a/plugins/pagerduty/api-report.md +++ b/plugins/pagerduty/api-report.md @@ -95,9 +95,7 @@ export class PagerDutyClient implements PagerDutyApi { // (undocumented) getOnCallByPolicyId(policyId: string): Promise; // (undocumented) - getServiceByEntity( - pagerDutyEntity: PagerDutyEntity, - ): Promise; + getServiceByEntity(entity: Entity): Promise; // (undocumented) triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise; } From d0014de1e1acf8a69523acc5c53f37463bc6ef5a Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Fri, 17 Jun 2022 14:44:59 -0700 Subject: [PATCH 169/590] chore: enhance changeset definition for exposed types Signed-off-by: Alec Jacobs --- .changeset/weak-bananas-deliver.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/weak-bananas-deliver.md b/.changeset/weak-bananas-deliver.md index 2be1e87d29..f46c7b7bfe 100644 --- a/.changeset/weak-bananas-deliver.md +++ b/.changeset/weak-bananas-deliver.md @@ -18,6 +18,8 @@ For example, the `getIncidentsByServiceId` query method now returns an object in instead of just `Incident[]`. This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions. +**BREAKING** All public exported types that relate to entities within PagerDuty have been prefixed with `PagerDuty` (e.g. `ServicesResponse` is now `PagerDutyServicesResponse` and `User` is now `PagerDutyUser`) + In addition, various enhancements/bug fixes were introduced: - The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage From ea07eb0bc8932ab68d7f1cc3d6bf2cae30655d91 Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Sat, 18 Jun 2022 14:02:10 +0100 Subject: [PATCH 170/590] feat: introduce github:repo:create github:repo:push scaffolder actions Signed-off-by: Marco Crivellaro --- .../actions/builtin/createBuiltinActions.ts | 39 +- .../builtin/github/githubRepoCreate.test.ts | 416 ++++++++++++++++++ .../builtin/github/githubRepoCreate.ts | 337 ++++++++++++++ .../builtin/github/githubRepoPush.test.ts | 400 +++++++++++++++++ .../actions/builtin/github/githubRepoPush.ts | 224 ++++++++++ .../actions/builtin/github/index.ts | 4 +- 6 files changed, 1405 insertions(+), 15 deletions(-) create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 2ffbc09ce5..91f1e180d0 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -15,25 +15,34 @@ */ import { UrlReader } from '@backstage/backend-common'; -import { JsonObject } from '@backstage/types'; import { CatalogApi } from '@backstage/catalog-client'; -import { - GithubCredentialsProvider, - ScmIntegrations, - DefaultGithubCredentialsProvider, -} from '@backstage/integration'; import { Config } from '@backstage/config'; import { - createCatalogWriteAction, + DefaultGithubCredentialsProvider, + GithubCredentialsProvider, + ScmIntegrations, +} from '@backstage/integration'; +import { JsonObject } from '@backstage/types'; +import { createCatalogRegisterAction, + createCatalogWriteAction, } from './catalog'; +import { TemplateFilter } from '../../../lib'; +import { TemplateAction } from '../types'; import { createDebugLogAction } from './debug'; import { createFetchPlainAction, createFetchTemplateAction } from './fetch'; import { createFilesystemDeleteAction, createFilesystemRenameAction, } from './filesystem'; +import { + createGithubActionsDispatchAction, + createGithubIssuesLabelAction, + createGithubRepoCreateAction, + createGithubRepoPushAction, + createGithubWebhookAction, +} from './github'; import { createPublishAzureAction, createPublishBitbucketAction, @@ -45,13 +54,6 @@ import { createPublishGitlabAction, createPublishGitlabMergeRequestAction, } from './publish'; -import { - createGithubActionsDispatchAction, - createGithubWebhookAction, - createGithubIssuesLabelAction, -} from './github'; -import { TemplateFilter } from '../../../lib'; -import { TemplateAction } from '../types'; /** * The options passed to {@link createBuiltinActions} @@ -165,6 +167,15 @@ export const createBuiltinActions = ( integrations, githubCredentialsProvider, }), + createGithubRepoCreateAction({ + integrations, + githubCredentialsProvider, + }), + createGithubRepoPushAction({ + integrations, + config, + githubCredentialsProvider, + }), ]; return actions as TemplateAction[]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts new file mode 100644 index 0000000000..0e7e907917 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.test.ts @@ -0,0 +1,416 @@ +/* + * Copyright 2021 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 { TemplateAction } from '../../types'; + +jest.mock('../helpers'); + +import { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { + DefaultGithubCredentialsProvider, + GithubCredentialsProvider, + ScmIntegrations, +} from '@backstage/integration'; +import { when } from 'jest-when'; +import { PassThrough } from 'stream'; +import { createGithubRepoCreateAction } from './githubRepoCreate'; + +const mockOctokit = { + rest: { + users: { + getByUsername: jest.fn(), + }, + repos: { + addCollaborator: jest.fn(), + createInOrg: jest.fn(), + createForAuthenticatedUser: jest.fn(), + replaceAllTopics: jest.fn(), + }, + teams: { + addOrUpdateRepoPermissionsInOrg: jest.fn(), + }, + }, +}; +jest.mock('octokit', () => ({ + Octokit: class { + constructor() { + return mockOctokit; + } + }, +})); + +describe('github:repo:create', () => { + const config = new ConfigReader({ + integrations: { + github: [ + { host: 'github.com', token: 'tokenlols' }, + { host: 'ghe.github.com' }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + let githubCredentialsProvider: GithubCredentialsProvider; + let action: TemplateAction; + + const mockContext = { + input: { + repoUrl: 'github.com?repo=repo&owner=owner', + description: 'description', + repoVisibility: 'private' as const, + access: 'owner/blam', + }, + workspacePath: 'lol', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + githubCredentialsProvider = + DefaultGithubCredentialsProvider.fromIntegrations(integrations); + action = createGithubRepoCreateAction({ + integrations, + githubCredentialsProvider, + }); + }); + + it('should call the githubApis with the correct values for createInOrg', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'Organization' }, + }); + + mockOctokit.rest.repos.createInOrg.mockResolvedValue({ data: {} }); + + await action.handler(mockContext); + expect(mockOctokit.rest.repos.createInOrg).toHaveBeenCalledWith({ + description: 'description', + name: 'repo', + org: 'owner', + private: true, + delete_branch_on_merge: false, + allow_squash_merge: true, + allow_merge_commit: true, + allow_rebase_merge: true, + visibility: 'private', + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoVisibility: 'public', + }, + }); + expect(mockOctokit.rest.repos.createInOrg).toHaveBeenCalledWith({ + description: 'description', + name: 'repo', + org: 'owner', + private: false, + delete_branch_on_merge: false, + allow_squash_merge: true, + allow_merge_commit: true, + allow_rebase_merge: true, + visibility: 'public', + }); + }); + + it('should call the githubApis with the correct values for createForAuthenticatedUser', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: {}, + }); + + await action.handler(mockContext); + expect( + mockOctokit.rest.repos.createForAuthenticatedUser, + ).toHaveBeenCalledWith({ + description: 'description', + name: 'repo', + private: true, + delete_branch_on_merge: false, + allow_squash_merge: true, + allow_merge_commit: true, + allow_rebase_merge: true, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoVisibility: 'public', + }, + }); + expect( + mockOctokit.rest.repos.createForAuthenticatedUser, + ).toHaveBeenCalledWith({ + description: 'description', + name: 'repo', + private: false, + delete_branch_on_merge: false, + allow_squash_merge: true, + allow_merge_commit: true, + allow_rebase_merge: true, + }); + }); + + it('should add access for the team when it starts with the owner', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler(mockContext); + + expect( + mockOctokit.rest.teams.addOrUpdateRepoPermissionsInOrg, + ).toHaveBeenCalledWith({ + org: 'owner', + team_slug: 'blam', + owner: 'owner', + repo: 'repo', + permission: 'admin', + }); + }); + + it('should add outside collaborators when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + access: 'outsidecollaborator', + }, + }); + + expect(mockOctokit.rest.repos.addCollaborator).toHaveBeenCalledWith({ + username: 'outsidecollaborator', + owner: 'owner', + repo: 'repo', + permission: 'admin', + }); + }); + + it('should add multiple collaborators when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + collaborators: [ + { + access: 'pull', + user: 'robot-1', + }, + { + access: 'push', + team: 'robot-2', + }, + ], + }, + }); + + const commonProperties = { + owner: 'owner', + repo: 'repo', + }; + + expect(mockOctokit.rest.repos.addCollaborator).toHaveBeenCalledWith({ + ...commonProperties, + username: 'robot-1', + permission: 'pull', + }); + + expect( + mockOctokit.rest.teams.addOrUpdateRepoPermissionsInOrg, + ).toHaveBeenCalledWith({ + ...commonProperties, + org: 'owner', + team_slug: 'robot-2', + permission: 'push', + }); + }); + + it('should ignore failures when adding multiple collaborators', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + when(mockOctokit.rest.teams.addOrUpdateRepoPermissionsInOrg) + .calledWith({ + org: 'owner', + owner: 'owner', + repo: 'repo', + team_slug: 'robot-1', + permission: 'pull', + }) + .mockRejectedValueOnce(new Error('Something bad happened') as never); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + collaborators: [ + { + access: 'pull', + team: 'robot-1', + }, + { + access: 'push', + team: 'robot-2', + }, + ], + }, + }); + + expect( + mockOctokit.rest.teams.addOrUpdateRepoPermissionsInOrg.mock.calls[2], + ).toEqual([ + { + org: 'owner', + owner: 'owner', + repo: 'repo', + team_slug: 'robot-2', + permission: 'push', + }, + ]); + }); + + it('should add topics when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + mockOctokit.rest.repos.replaceAllTopics.mockResolvedValue({ + data: { + names: ['node.js'], + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + topics: ['node.js'], + }, + }); + + expect(mockOctokit.rest.repos.replaceAllTopics).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + names: ['node.js'], + }); + }); + + it('should lowercase topics when provided', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + mockOctokit.rest.repos.replaceAllTopics.mockResolvedValue({ + data: { + names: ['backstage'], + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + topics: ['BACKSTAGE'], + }, + }); + + expect(mockOctokit.rest.repos.replaceAllTopics).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + names: ['backstage'], + }); + }); + + it('should call output with the remoteUrl', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'User' }, + }); + + mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler(mockContext); + + expect(mockContext.output).toHaveBeenCalledWith( + 'remoteUrl', + 'https://github.com/clone/url.git', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts new file mode 100644 index 0000000000..494a47516c --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts @@ -0,0 +1,337 @@ +/* + * Copyright 2021 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 { assertError, InputError } from '@backstage/errors'; +import { + GithubCredentialsProvider, + ScmIntegrationRegistry, +} from '@backstage/integration'; +import { Octokit } from 'octokit'; +import { createTemplateAction } from '../../createTemplateAction'; +import { parseRepoUrl } from '../publish/util'; +import { getOctokitOptions } from './helpers'; + +/** + * Creates a new action that initializes a git repository + * + * @public + */ +export function createGithubRepoCreateAction(options: { + integrations: ScmIntegrationRegistry; + githubCredentialsProvider?: GithubCredentialsProvider; +}) { + const { integrations, githubCredentialsProvider } = options; + + return createTemplateAction<{ + repoUrl: string; + description?: string; + access?: string; + deleteBranchOnMerge?: boolean; + gitAuthorName?: string; + gitAuthorEmail?: string; + allowRebaseMerge?: boolean; + allowSquashMerge?: boolean; + allowMergeCommit?: boolean; + requireCodeOwnerReviews?: boolean; + requiredStatusCheckContexts?: string[]; + repoVisibility?: 'private' | 'internal' | 'public'; + collaborators?: Array< + | { + user: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + | { + team: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + >; + token?: string; + topics?: string[]; + }>({ + id: 'github:repo:create', + description: 'Creates a GitHub repository.', + schema: { + input: { + type: 'object', + required: ['repoUrl'], + properties: { + repoUrl: { + title: 'Repository Location', + description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, + type: 'string', + }, + description: { + title: 'Repository Description', + type: 'string', + }, + access: { + title: 'Repository Access', + description: `Sets an admin collaborator on the repository. Can either be a user reference different from 'owner' in 'repoUrl' or team reference, eg. 'org/team-name'`, + type: 'string', + }, + requireCodeOwnerReviews: { + title: 'Require CODEOWNER Reviews?', + description: + 'Require an approved review in PR including files with a designated Code Owner', + type: 'boolean', + }, + requiredStatusCheckContexts: { + title: 'Required Status Check Contexts', + description: + 'The list of status checks to require in order to merge into this branch', + type: 'array', + items: { + type: 'string', + }, + }, + repoVisibility: { + title: 'Repository Visibility', + type: 'string', + enum: ['private', 'public', 'internal'], + }, + deleteBranchOnMerge: { + title: 'Delete Branch On Merge', + type: 'boolean', + description: `Delete the branch after merging the PR. The default value is 'false'`, + }, + gitAuthorName: { + title: 'Default Author Name', + type: 'string', + description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, + }, + gitAuthorEmail: { + title: 'Default Author Email', + type: 'string', + description: `Sets the default author email for the commit.`, + }, + allowMergeCommit: { + title: 'Allow Merge Commits', + type: 'boolean', + description: `Allow merge commits. The default value is 'true'`, + }, + allowSquashMerge: { + title: 'Allow Squash Merges', + type: 'boolean', + description: `Allow squash merges. The default value is 'true'`, + }, + allowRebaseMerge: { + title: 'Allow Rebase Merges', + type: 'boolean', + description: `Allow rebase merges. The default value is 'true'`, + }, + collaborators: { + title: 'Collaborators', + description: 'Provide additional users or teams with permissions', + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['access'], + properties: { + access: { + type: 'string', + description: 'The type of access for the user', + enum: ['push', 'pull', 'admin', 'maintain', 'triage'], + }, + user: { + type: 'string', + description: + 'The name of the user that will be added as a collaborator', + }, + team: { + type: 'string', + description: + 'The name of the team that will be added as a collaborator', + }, + }, + oneOf: [{ required: ['user'] }, { required: ['team'] }], + }, + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitHub', + }, + topics: { + title: 'Topics', + type: 'array', + items: { + type: 'string', + }, + }, + }, + }, + output: { + type: 'object', + properties: { + remoteUrl: { + title: 'A URL to the repository with the provider', + type: 'string', + }, + repoContentsUrl: { + title: 'A URL to the root of the repository', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + const { + repoUrl, + description, + access, + repoVisibility = 'private', + deleteBranchOnMerge = false, + allowMergeCommit = true, + allowSquashMerge = true, + allowRebaseMerge = true, + collaborators, + topics, + token: providedToken, + } = ctx.input; + + const { owner, repo } = parseRepoUrl(repoUrl, integrations); + + if (!owner) { + throw new InputError('Invalid repository owner provided in repoUrl'); + } + + const octokitOptions = await getOctokitOptions({ + integrations, + credentialsProvider: githubCredentialsProvider, + token: providedToken, + repoUrl, + }); + + const client = new Octokit(octokitOptions); + + const user = await client.rest.users.getByUsername({ + username: owner, + }); + + const repoCreationPromise = + user.data.type === 'Organization' + ? client.rest.repos.createInOrg({ + name: repo, + org: owner, + private: repoVisibility === 'private', + visibility: repoVisibility, + description: description, + delete_branch_on_merge: deleteBranchOnMerge, + allow_merge_commit: allowMergeCommit, + allow_squash_merge: allowSquashMerge, + allow_rebase_merge: allowRebaseMerge, + }) + : client.rest.repos.createForAuthenticatedUser({ + name: repo, + private: repoVisibility === 'private', + description: description, + delete_branch_on_merge: deleteBranchOnMerge, + allow_merge_commit: allowMergeCommit, + allow_squash_merge: allowSquashMerge, + allow_rebase_merge: allowRebaseMerge, + }); + + let newRepo; + + try { + newRepo = (await repoCreationPromise).data; + } catch (e) { + assertError(e); + if (e.message === 'Resource not accessible by integration') { + ctx.logger.warn( + `The GitHub app or token provided may not have the required permissions to create the ${user.data.type} repository ${owner}/${repo}.`, + ); + } + throw new Error( + `Failed to create the ${user.data.type} repository ${owner}/${repo}, ${e.message}`, + ); + } + + if (access?.startsWith(`${owner}/`)) { + const [, team] = access.split('/'); + await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ + org: owner, + team_slug: team, + owner, + repo, + permission: 'admin', + }); + // No need to add access if it's the person who owns the personal account + } else if (access && access !== owner) { + await client.rest.repos.addCollaborator({ + owner, + repo, + username: access, + permission: 'admin', + }); + } + + if (collaborators) { + for (const collaborator of collaborators) { + try { + if ('user' in collaborator) { + await client.rest.repos.addCollaborator({ + owner, + repo, + username: collaborator.user, + permission: collaborator.access, + }); + } else if ('team' in collaborator) { + await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ + org: owner, + team_slug: collaborator.team, + owner, + repo, + permission: collaborator.access, + }); + } + } catch (e) { + assertError(e); + const name = extractCollaboratorName(collaborator); + ctx.logger.warn( + `Skipping ${collaborator.access} access for ${name}, ${e.message}`, + ); + } + } + } + + if (topics) { + try { + await client.rest.repos.replaceAllTopics({ + owner, + repo, + names: topics.map(t => t.toLowerCase()), + }); + } catch (e) { + assertError(e); + ctx.logger.warn(`Skipping topics ${topics.join(' ')}, ${e.message}`); + } + } + + const remoteUrl = newRepo.clone_url; + + ctx.output('remoteUrl', remoteUrl); + }, + }); +} + +function extractCollaboratorName( + collaborator: { user: string } | { team: string } | { username: string }, +) { + if ('username' in collaborator) return collaborator.username; + if ('user' in collaborator) return collaborator.user; + return collaborator.team; +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts new file mode 100644 index 0000000000..f23e3dde9f --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.test.ts @@ -0,0 +1,400 @@ +/* + * Copyright 2021 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 { TemplateAction } from '../../types'; + +jest.mock('../helpers'); + +import { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { + DefaultGithubCredentialsProvider, + GithubCredentialsProvider, + ScmIntegrations, +} from '@backstage/integration'; +import { PassThrough } from 'stream'; +import { + enableBranchProtectionOnDefaultRepoBranch, + initRepoAndPush, +} from '../helpers'; +import { createGithubRepoPushAction } from './githubRepoPush'; + +const mockOctokit = { + rest: { + repos: { + get: jest.fn(), + }, + }, +}; +jest.mock('octokit', () => ({ + Octokit: class { + constructor() { + return mockOctokit; + } + }, +})); + +describe('github:repo:push', () => { + const config = new ConfigReader({ + integrations: { + github: [ + { host: 'github.com', token: 'tokenlols' }, + { host: 'ghe.github.com' }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + let githubCredentialsProvider: GithubCredentialsProvider; + let action: TemplateAction; + + const mockContext = { + input: { + repoUrl: 'github.com?repo=repository&owner=owner', + description: 'description', + repoVisibility: 'private' as const, + access: 'owner/blam', + }, + workspacePath: 'lol', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + githubCredentialsProvider = + DefaultGithubCredentialsProvider.fromIntegrations(integrations); + action = createGithubRepoPushAction({ + integrations, + config, + githubCredentialsProvider, + }); + }); + + it('should call initRepoAndPush with the correct values', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler(mockContext); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://github.com/clone/url.git', + defaultBranch: 'master', + auth: { username: 'x-access-token', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: {}, + }); + }); + + it('should call initRepoAndPush with the correct defaultBranch main', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + defaultBranch: 'main', + }, + }); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://github.com/clone/url.git', + defaultBranch: 'main', + auth: { username: 'x-access-token', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: {}, + }); + }); + + it('should call initRepoAndPush with the configured defaultAuthor', async () => { + const customAuthorConfig = new ConfigReader({ + integrations: { + github: [ + { host: 'github.com', token: 'tokenlols' }, + { host: 'ghe.github.com' }, + ], + }, + scaffolder: { + defaultAuthor: { + name: 'Test', + email: 'example@example.com', + }, + }, + }); + + const customAuthorIntegrations = + ScmIntegrations.fromConfig(customAuthorConfig); + const customAuthorAction = createGithubRepoPushAction({ + integrations: customAuthorIntegrations, + config: customAuthorConfig, + githubCredentialsProvider, + }); + + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await customAuthorAction.handler(mockContext); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://github.com/clone/url.git', + defaultBranch: 'master', + auth: { username: 'x-access-token', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: { name: 'Test', email: 'example@example.com' }, + }); + }); + + it('should call initRepoAndPush with the configured defaultCommitMessage', async () => { + const customAuthorConfig = new ConfigReader({ + integrations: { + github: [ + { host: 'github.com', token: 'tokenlols' }, + { host: 'ghe.github.com' }, + ], + }, + scaffolder: { + defaultCommitMessage: 'Test commit message', + }, + }); + + const customAuthorIntegrations = + ScmIntegrations.fromConfig(customAuthorConfig); + const customAuthorAction = createGithubRepoPushAction({ + integrations: customAuthorIntegrations, + config: customAuthorConfig, + githubCredentialsProvider, + }); + + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await customAuthorAction.handler(mockContext); + + expect(initRepoAndPush).toHaveBeenCalledWith({ + dir: mockContext.workspacePath, + remoteUrl: 'https://github.com/clone/url.git', + defaultBranch: 'master', + auth: { username: 'x-access-token', password: 'tokenlols' }, + logger: mockContext.logger, + commitMessage: 'initial commit', + gitAuthorInfo: { email: undefined, name: undefined }, + }); + }); + + it('should call output with the remoteUrl and the repoContentsUrl', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler(mockContext); + + expect(mockContext.output).toHaveBeenCalledWith( + 'remoteUrl', + 'https://github.com/clone/url.git', + ); + expect(mockContext.output).toHaveBeenCalledWith( + 'repoContentsUrl', + 'https://github.com/html/url/blob/master', + ); + }); + + it('should use main as default branch', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + defaultBranch: 'main', + }, + }); + + expect(mockContext.output).toHaveBeenCalledWith( + 'remoteUrl', + 'https://github.com/clone/url.git', + ); + expect(mockContext.output).toHaveBeenCalledWith( + 'repoContentsUrl', + 'https://github.com/html/url/blob/main', + ); + }); + + it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of requireCodeOwnerReviews', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler(mockContext); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repository', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + requiredStatusCheckContexts: [], + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requireCodeOwnerReviews: true, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repository', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: true, + requiredStatusCheckContexts: [], + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requireCodeOwnerReviews: false, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repository', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + requiredStatusCheckContexts: [], + }); + }); + + it('should call enableBranchProtectionOnDefaultRepoBranch with the correct values of requiredStatusCheckContexts', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler(mockContext); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repository', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + requiredStatusCheckContexts: [], + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requiredStatusCheckContexts: ['statusCheck'], + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repository', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + requiredStatusCheckContexts: ['statusCheck'], + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + requiredStatusCheckContexts: [], + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ + owner: 'owner', + client: mockOctokit, + repoName: 'repository', + logger: mockContext.logger, + defaultBranch: 'master', + requireCodeOwnerReviews: false, + requiredStatusCheckContexts: [], + }); + }); + + it('should not call enableBranchProtectionOnDefaultRepoBranch with protectDefaultBranch disabled', async () => { + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + clone_url: 'https://github.com/clone/url.git', + html_url: 'https://github.com/html/url', + }, + }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + protectDefaultBranch: false, + }, + }); + + expect(enableBranchProtectionOnDefaultRepoBranch).not.toHaveBeenCalled(); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts new file mode 100644 index 0000000000..cdf9a9b4e6 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts @@ -0,0 +1,224 @@ +/* + * Copyright 2021 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 { Config } from '@backstage/config'; +import { assertError, InputError } from '@backstage/errors'; +import { + GithubCredentialsProvider, + ScmIntegrationRegistry, +} from '@backstage/integration'; +import { Octokit } from 'octokit'; +import { createTemplateAction } from '../../createTemplateAction'; +import { + enableBranchProtectionOnDefaultRepoBranch, + initRepoAndPush, +} from '../helpers'; +import { getRepoSourceDirectory, parseRepoUrl } from '../publish/util'; +import { getOctokitOptions } from './helpers'; + +/** + * Creates a new action that initializes a git repository of the content in the workspace + * and publishes it to GitHub. + * + * @public + */ +export function createGithubRepoPushAction(options: { + integrations: ScmIntegrationRegistry; + config: Config; + githubCredentialsProvider?: GithubCredentialsProvider; +}) { + const { integrations, config, githubCredentialsProvider } = options; + + return createTemplateAction<{ + repoUrl: string; + description?: string; + defaultBranch?: string; + protectDefaultBranch?: boolean; + gitCommitMessage?: string; + gitAuthorName?: string; + gitAuthorEmail?: string; + requireCodeOwnerReviews?: boolean; + requiredStatusCheckContexts?: string[]; + sourcePath?: string; + token?: string; + }>({ + id: 'github:repo:push', + description: + 'Initializes a git repository of contents in workspace and publishes it to GitHub.', + schema: { + input: { + type: 'object', + required: ['repoUrl'], + properties: { + repoUrl: { + title: 'Repository Location', + description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, + type: 'string', + }, + requireCodeOwnerReviews: { + title: 'Require CODEOWNER Reviews?', + description: + 'Require an approved review in PR including files with a designated Code Owner', + type: 'boolean', + }, + requiredStatusCheckContexts: { + title: 'Required Status Check Contexts', + description: + 'The list of status checks to require in order to merge into this branch', + type: 'array', + items: { + type: 'string', + }, + }, + defaultBranch: { + title: 'Default Branch', + type: 'string', + description: `Sets the default branch on the repository. The default value is 'master'`, + }, + protectDefaultBranch: { + title: 'Protect Default Branch', + type: 'boolean', + description: `Protect the default branch after creating the repository. The default value is 'true'`, + }, + gitCommitMessage: { + title: 'Git Commit Message', + type: 'string', + description: `Sets the commit message on the repository. The default value is 'initial commit'`, + }, + gitAuthorName: { + title: 'Default Author Name', + type: 'string', + description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, + }, + gitAuthorEmail: { + title: 'Default Author Email', + type: 'string', + description: `Sets the default author email for the commit.`, + }, + sourcePath: { + title: 'Source Path', + description: + 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', + type: 'string', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitHub', + }, + topics: { + title: 'Topics', + type: 'array', + items: { + type: 'string', + }, + }, + }, + }, + output: { + type: 'object', + properties: { + remoteUrl: { + title: 'A URL to the repository with the provider', + type: 'string', + }, + repoContentsUrl: { + title: 'A URL to the root of the repository', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + const { + repoUrl, + defaultBranch = 'master', + protectDefaultBranch = true, + gitCommitMessage = 'initial commit', + gitAuthorName, + gitAuthorEmail, + requireCodeOwnerReviews = false, + requiredStatusCheckContexts = [], + token: providedToken, + } = ctx.input; + + const { owner, repo } = parseRepoUrl(repoUrl, integrations); + + if (!owner) { + throw new InputError('Invalid repository owner provided in repoUrl'); + } + + const octokitOptions = await getOctokitOptions({ + integrations, + credentialsProvider: githubCredentialsProvider, + token: providedToken, + repoUrl, + }); + + const client = new Octokit(octokitOptions); + + const targetRepo = await client.rest.repos.get({ owner, repo }); + + const remoteUrl = targetRepo.data.clone_url; + const repoContentsUrl = `${targetRepo.data.html_url}/blob/${defaultBranch}`; + + const gitAuthorInfo = { + name: gitAuthorName + ? gitAuthorName + : config.getOptionalString('scaffolder.defaultAuthor.name'), + email: gitAuthorEmail + ? gitAuthorEmail + : config.getOptionalString('scaffolder.defaultAuthor.email'), + }; + + await initRepoAndPush({ + dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath), + remoteUrl, + defaultBranch, + auth: { + username: 'x-access-token', + password: octokitOptions.auth, + }, + logger: ctx.logger, + commitMessage: gitCommitMessage + ? gitCommitMessage + : config.getOptionalString('scaffolder.defaultCommitMessage'), + gitAuthorInfo, + }); + + if (protectDefaultBranch) { + try { + await enableBranchProtectionOnDefaultRepoBranch({ + owner, + client, + repoName: repo, + logger: ctx.logger, + defaultBranch, + requireCodeOwnerReviews, + requiredStatusCheckContexts, + }); + } catch (e) { + assertError(e); + ctx.logger.warn( + `Skipping: default branch protection on '${repo}', ${e.message}`, + ); + } + } + + ctx.output('remoteUrl', remoteUrl); + ctx.output('repoContentsUrl', repoContentsUrl); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts index c5788afc3a..6746aef37e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts @@ -15,5 +15,7 @@ */ export { createGithubActionsDispatchAction } from './githubActionsDispatch'; -export { createGithubWebhookAction } from './githubWebhook'; export { createGithubIssuesLabelAction } from './githubIssuesLabel'; +export { createGithubRepoCreateAction } from './githubRepoCreate'; +export { createGithubRepoPushAction } from './githubRepoPush'; +export { createGithubWebhookAction } from './githubWebhook'; From 2db07887cb8f37f47afd0626626425c56e4fd40b Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Sat, 18 Jun 2022 14:10:41 +0100 Subject: [PATCH 171/590] chore: changeset Signed-off-by: Marco Crivellaro --- .changeset/thirty-rivers-watch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/thirty-rivers-watch.md diff --git a/.changeset/thirty-rivers-watch.md b/.changeset/thirty-rivers-watch.md new file mode 100644 index 0000000000..d92343f365 --- /dev/null +++ b/.changeset/thirty-rivers-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added two new scaffolder actions: `github:repo:create` and `github:repo:push` From 4e8787ac5755d9bcd2a4c7323ad2ea56d0b2b102 Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Sat, 18 Jun 2022 15:44:53 +0100 Subject: [PATCH 172/590] chore: api-report Signed-off-by: Marco Crivellaro --- plugins/scaffolder-backend/api-report.md | 52 ++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 707b8e62ba..029000399b 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -168,6 +168,58 @@ export type CreateGithubPullRequestClientFactoryInput = { token?: string; }; +// @public +export function createGithubRepoCreateAction(options: { + integrations: ScmIntegrationRegistry; + githubCredentialsProvider?: GithubCredentialsProvider; +}): TemplateAction<{ + repoUrl: string; + description?: string | undefined; + access?: string | undefined; + deleteBranchOnMerge?: boolean | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + allowRebaseMerge?: boolean | undefined; + allowSquashMerge?: boolean | undefined; + allowMergeCommit?: boolean | undefined; + requireCodeOwnerReviews?: boolean | undefined; + requiredStatusCheckContexts?: string[] | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + collaborators?: + | ( + | { + user: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + | { + team: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + )[] + | undefined; + token?: string | undefined; + topics?: string[] | undefined; +}>; + +// @public +export function createGithubRepoPushAction(options: { + integrations: ScmIntegrationRegistry; + config: Config; + githubCredentialsProvider?: GithubCredentialsProvider; +}): TemplateAction<{ + repoUrl: string; + description?: string | undefined; + defaultBranch?: string | undefined; + protectDefaultBranch?: boolean | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + requireCodeOwnerReviews?: boolean | undefined; + requiredStatusCheckContexts?: string[] | undefined; + sourcePath?: string | undefined; + token?: string | undefined; +}>; + // @public export function createGithubWebhookAction(options: { integrations: ScmIntegrationRegistry; From 43b7228df05cae6c914de77c66e6fefa4b54cbe3 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Sat, 18 Jun 2022 11:05:45 -0500 Subject: [PATCH 173/590] Added comments to example Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- plugins/azure-devops-backend/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/azure-devops-backend/README.md b/plugins/azure-devops-backend/README.md index e71021471b..5dc0570bd2 100644 --- a/plugins/azure-devops-backend/README.md +++ b/plugins/azure-devops-backend/README.md @@ -60,7 +60,10 @@ Here's how to get the backend up and running: // ... async function main() { // ... + // Add this line under the other lines that follow the useHotMemoize pattern const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); + // ... + // Insert this line under the other lines that add their routers to apiRouter in the same way apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); ``` From 13a232ec2212e7e1896b2d717db0f2866452fb32 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Sat, 18 Jun 2022 11:07:09 -0500 Subject: [PATCH 174/590] Added changeset Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .changeset/tame-guests-wave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tame-guests-wave.md diff --git a/.changeset/tame-guests-wave.md b/.changeset/tame-guests-wave.md new file mode 100644 index 0000000000..bbf757084d --- /dev/null +++ b/.changeset/tame-guests-wave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-azure-devops-backend': patch +--- + +Added comments to example to help avoid confusion as to where lines need to be added From b6ef133aedb1d34f2505a0f3714e34ba6e7d6ff7 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Sat, 18 Jun 2022 11:56:42 -0500 Subject: [PATCH 175/590] Added tutorial for Promehteus metrics Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .../tutorials/prometheus-metrics-output.png | Bin 0 -> 258197 bytes contrib/docs/tutorials/prometheus-metrics.md | 108 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 contrib/docs/tutorials/prometheus-metrics-output.png create mode 100644 contrib/docs/tutorials/prometheus-metrics.md diff --git a/contrib/docs/tutorials/prometheus-metrics-output.png b/contrib/docs/tutorials/prometheus-metrics-output.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fac739acebf67e6ae8c5cd11758a567d542fe5 GIT binary patch literal 258197 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�F6=ma%)^Iq&&2AYc3JPmEA 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�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 - - - - Backstage Community Sessions - - Missed a meetup? Wondering when the next one is coming up? We've - got you covered! Check out our all-new Meetups page. - - Meetups - - - Adopter Community Sessions - - Backstage Community Sessions is the monthly meetup where we all - come together to listen to the latest maintainer updates, learn - from each other about adopting, share exciting new demos or - discuss any relevant topic like developer effectiveness, developer - experience, developer portals, etc. Have something to share, or a - burning question? Add it to the{' '} - issue. - - - - Contributor Community Sessions - - Discuss all things contributing, diving deep under the hood of - Backstage (Backstage of Backstage? Backerstage?). An open - discussion with maintainers and contributors of Backstage. If you - like Backstage, this is your favorite Zoom meeting of the month, - guaranteed! Have something to share, or a burning question? Add it - to the{' '} - issue. - + + + + Offical Backstage initiatives + Stay tuned to the latest developments - + - - Backstage official Newsletter - - + + + + Community sessions + - The official monthly Backstage newsletter. Containing the latest - news from your favorite project. + Maintainers and adopters meet monthly to share updates, + demos, and ideas. Yep, all sessions are recorded! - - Subscribe + Join a session + + + + + Newsletter + + + The official monthly Backstage newsletter. Don't miss + the latest news from your favorite project! + + Subscribe + + + + + Contributor Spotlight + + + A recognition for valuable community work. Nominate contributing members for + their efforts! We'll put them in the spotlight ❤️ + + Nominate now + + + + + + + + Community initiatives + + + + Open Mic Meetup + + + A casual get together of Backstage users sharing their + experiences and helping each other. Hosted by{' '} + Roadie.io and{' '} + Frontside Software. + + Learn more + + + + Backstage Weekly Newsletter + + + A weekly newsletter with news, updates and things community from + your friends at Roadie.io. + + + Learn more - + + + + Commercial Partners + + {PARTNERS.map((partner) => ( + + + + {partner.name} + + + + ))} + + + + + {/* Spotlight @@ -145,7 +224,7 @@ const Background = props => { - + */} ); }; diff --git a/microsite/static/img/partner-logo-frontside.png b/microsite/static/img/partner-logo-frontside.png new file mode 100644 index 0000000000000000000000000000000000000000..c8cad6bce13eec4f0c79c0c259b66d9111a96e6a GIT binary patch literal 5860 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 VpV{tO9%mP1dELgW{MuhJ{|yTX@3H^@ literal 0 HcmV?d00001 diff --git a/microsite/static/img/partner-logo-roadie.png b/microsite/static/img/partner-logo-roadie.png new file mode 100644 index 0000000000000000000000000000000000000000..41b169f55b6415eaa08853ada49060f9955717e2 GIT binary patch literal 6008 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 V5$GNim;|i|n3-CcR2$uV@V_5(L_`1p literal 0 HcmV?d00001 diff --git a/microsite/static/img/partner-logo-thoughtworks.png b/microsite/static/img/partner-logo-thoughtworks.png new file mode 100644 index 0000000000000000000000000000000000000000..53c3bc2a9ed1e0d7a47b6543bde88442026c15d5 GIT binary patch literal 7492 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 Date: Tue, 21 Jun 2022 17:39:38 +0200 Subject: [PATCH 292/590] Cleans up page code Signed-off-by: Jorge Lainfiesta --- microsite/pages/en/community.js | 135 +++++++++++--------------------- 1 file changed, 45 insertions(+), 90 deletions(-) diff --git a/microsite/pages/en/community.js b/microsite/pages/en/community.js index 3d32226c60..15db10e420 100644 --- a/microsite/pages/en/community.js +++ b/microsite/pages/en/community.js @@ -8,8 +8,6 @@ const React = require('react'); const Components = require(`${process.cwd()}/core/Components.js`); const Block = Components.Block; -const Breakpoint = Components.Breakpoint; -const ActionBlock = Components.ActionBlock; const BulletLine = Components.BulletLine; const PARTNERS = [{ @@ -41,7 +39,7 @@ const Background = props => { Backstage Community Join - the vibrant community around the Backstage project through social media and different meetups. To ensure you have a welcoming environment, we follow {' '} + the vibrant community around Backstage through social media and different meetups. To ensure you have a welcoming environment, we follow {' '} {' '} CNCF Code of Conduct @@ -49,20 +47,20 @@ const Background = props => { in everything we do. - + - - Get started in our community! + + Get started in our community!

?SZ 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 prom.register.clear()); + + return promBundle({ + includeMethod: true, + includePath: true, + // Using includePath alone is problematic, as it will include path labels with high + // cardinality (e.g. path params). Instead we would have to template them. However, this + // is difficult, as every backend plugin might use different routes. Instead we only take + // the first directory of the path, to have at least an idea how each plugin performs: + normalizePath, + promClient: { collectDefaultMetrics: {} }, + }); + } + ``` + +5. Now we will extend the router configuration with the `metricsHandler`: + + ```diff + +import { metricsHandler } from './metrics'; + + ... + + const service = createServiceBuilder(module) + .loadConfig(config) + .addRouter('', await healthcheck(healthcheckEnv)) + + .addRouter('', metricsHandler()) + .addRouter('/api', apiRouter); + ``` + +6. You now have everything setup, from the `\packages\backend` folder run `yarn start` this will start up the backend +7. Now in a browser load up `http://localhost:7007/metrics`, if everything went smoothly you should see metrics in your browser something like this: + + ![Prometheus Metrics Example Output](prometheus-metrics-output.png) + +## Metrics + +The following sections goes over the included and experimental metrics available once you have completed this tutorial + +## Included + +This tutorials uses the [`express-prom-bundle`](https://github.com/jochen-schweizer/express-prom-bundle) and the [`prom-client`](https://github.com/siimon/prom-client) to make this all work. They both come with some built in metrics: + +- `express-prom-bundle` comes with 2 metrics: + - `up`: this normally will be just 1 + - `http_request_duration_seconds`: http latency histogram/summary labeled with `status_code`, `method` and `path` +- `prom-client` comes with a collection of metrics around memory, CPU, processes, etc. You can see the supported metrics in the `prom-client's` [`lib/metrics`](https://github.com/siimon/prom-client/tree/master/lib/metrics) folder. + +### Experimental + +There are some custom metrics that have been added to Backstage will be output for you, these are currently deemed experimental and may be changed or removed in a future release. Here is a rough list, again subject to changes: + +- `catalog_entities_count`: Total amount of entities in the catalog +- `catalog_registered_locations_count`: Total amount of registered locations in the catalog +- `catalog_relations_count`: Total amount of relations between entities +- `catalog_stitched_entities_count`: Amount of entities stitched +- `catalog_processed_entities_count`: Amount of entities processed +- `catalog_processing_duration_seconds`: Time spent executing the full processing flow +- `catalog_processors_duration_seconds`: Time spent executing catalog processors +- `catalog_processing_queue_delay_seconds`: The amount of delay between being scheduled for processing, and the start of actually being processed From f765860b073f516884eaaea4398a4f569e571ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonc=CC=A7alo=20Marques?= Date: Mon, 20 Jun 2022 09:48:08 +0100 Subject: [PATCH 176/590] Add Mercedes-Benz.io to ADOPTERS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gonçalo Marques --- ADOPTERS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 66376ca5e9..eab71d6c79 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -179,3 +179,6 @@ _If you're using Backstage in your organization, please try to add your company | [Dixa](https://dixa.com) | [Jens Møller](mailto:jsc@dixa.com) | We are in early stages, but using it to get overview of our repositories and ownership of these. We want among many things to use it for compliance and easier access to key metrics for our repos. | | [Notino](https://notino.com) | [Jan Remunda](mailto:jan.remunda@notino.com) | Backstage is our developer portal. We use it as service catalog and for technical documentation. | | [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. | +| [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group. + + From 8b8c692be318d4b7468ca8f2b2867a28a15ade5c Mon Sep 17 00:00:00 2001 From: Daniele Mazzotta Date: Mon, 20 Jun 2022 12:58:38 +0400 Subject: [PATCH 177/590] updated api-reports Signed-off-by: Daniele Mazzotta --- plugins/apache-airflow/src/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/apache-airflow/src/plugin.ts b/plugins/apache-airflow/src/plugin.ts index adf5879196..664cde36cc 100644 --- a/plugins/apache-airflow/src/plugin.ts +++ b/plugins/apache-airflow/src/plugin.ts @@ -56,7 +56,7 @@ export const ApacheAirflowPage = apacheAirflowPlugin.provide( * If the dagIds is specified, only those DAGs are loaded. * Otherwise, it's going to list all the DAGs * @public - * @param dagIds - string[] + * @param dagIds - optional string[] of the DAGs to show in the table. If undefined, it will list all DAGs */ export const ApacheAirflowDagTable = apacheAirflowPlugin.provide( createComponentExtension({ From 886e1e8c810fad625c2e45823e26f914d3048180 Mon Sep 17 00:00:00 2001 From: ivgo Date: Mon, 20 Jun 2022 11:16:36 +0200 Subject: [PATCH 178/590] Set changeset to minor Signed-off-by: ivgo --- .changeset/sharp-planes-turn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/sharp-planes-turn.md b/.changeset/sharp-planes-turn.md index cc7045a9f7..47f6a6176d 100644 --- a/.changeset/sharp-planes-turn.md +++ b/.changeset/sharp-planes-turn.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-vault-backend': patch +'@backstage/plugin-vault-backend': minor --- Throw exceptions instead of swallow them, remove some exported types from the `api-report`, small changes in the API responses & expose the vault `baseUrl` to the frontend as well From 1189f00d23d12c4728bfe4eaa39845af14b461cc Mon Sep 17 00:00:00 2001 From: ivgo Date: Mon, 20 Jun 2022 11:48:58 +0200 Subject: [PATCH 179/590] Set group as optional parameter. Scan everything if not present Signed-off-by: ivgo --- .changeset/two-crews-accept.md | 9 ++- docs/integrations/gitlab/discovery.md | 14 +--- .../catalog-backend-module-gitlab/config.d.ts | 75 +++++++------------ .../src/providers/config.test.ts | 8 +- .../src/providers/config.ts | 19 +---- 5 files changed, 42 insertions(+), 83 deletions(-) diff --git a/.changeset/two-crews-accept.md b/.changeset/two-crews-accept.md index 5885b1346d..deacf1559d 100644 --- a/.changeset/two-crews-accept.md +++ b/.changeset/two-crews-accept.md @@ -2,13 +2,14 @@ '@backstage/plugin-catalog-backend-module-gitlab': minor --- -Add the possibility in the `GitlabDiscoveryEntityProvider` to scan the whole project instead of concrete groups. For that, use a configuration like this one: +Add the possibility in the `GitlabDiscoveryEntityProvider` to scan the whole project instead of concrete groups. For that, use a configuration like this one, where the group parameter is omitted (not mandatory anymore): ```yaml catalog: providers: gitlab: - host: gitlab-host # Identifies one of the hosts set up in the integrations - branch: main # Optional. Uses `master` as default - entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` + yourProviderId: + host: gitlab-host # Identifies one of the hosts set up in the integrations + branch: main # Optional. Uses `master` as default + entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` ``` diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md index a7dd0a03df..aad73c8209 100644 --- a/docs/integrations/gitlab/discovery.md +++ b/docs/integrations/gitlab/discovery.md @@ -22,22 +22,10 @@ catalog: yourProviderId: host: gitlab-host # Identifies one of the hosts set up in the integrations branch: main # Optional. Uses `master` as default - group: example-group # Group and subgroup (if needed) to look for repositories + group: example-group # Optional. Group and subgroup (if needed) to look for repositories. If not present the whole project will be scanned entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` ``` -If you desire so, it's also possible to execute the gitlab discovery in your entire -project. In order to do that, use this catalog configuration instead: - -```yaml -catalog: - providers: - gitlab: - host: gitlab-host # Identifies one of the hosts set up in the integrations - branch: main # Optional. Uses `master` as default - entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` -``` - As this provider is not one of the default providers, you will first need to install the gitlab catalog plugin: diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts index 0626cb9488..82f1a5db7c 100644 --- a/plugins/catalog-backend-module-gitlab/config.d.ts +++ b/plugins/catalog-backend-module-gitlab/config.d.ts @@ -23,53 +23,34 @@ export interface Config { /** * GitlabDiscoveryEntityProvider configuration */ - gitlab?: - | { - /** - * (Required) Gitlab's host name. - * @visibility backend - */ - host: string; - /** - * (Optional) Default branch to read the catalog-info.yaml file. - * If not set, 'master' will be used. - * @visibility backend - */ - branch?: string; - /** - * (Optional) The name used for the catalog file. - * If not set, 'catalog-info.yaml' will be used. - * @visibility backend - */ - entityFilename?: string; - } - | Record< - string, - { - /** - * (Required) Gitlab's host name. - * @visibility backend - */ - host: string; - /** - * (Required) Gitlab's group[/subgroup] where the discovery is done. - * @visibility backend - */ - group: string; - /** - * (Optional) Default branch to read the catalog-info.yaml file. - * If not set, 'master' will be used. - * @visibility backend - */ - branch?: string; - /** - * (Optional) The name used for the catalog file. - * If not set, 'catalog-info.yaml' will be used. - * @visibility backend - */ - entityFilename?: string; - } - >; + gitlab?: Record< + string, + { + /** + * (Required) Gitlab's host name. + * @visibility backend + */ + host: string; + /** + * (Optional) Gitlab's group[/subgroup] where the discovery is done. + * If not defined the whole project will be scanned. + * @visibility backend + */ + group?: string; + /** + * (Optional) Default branch to read the catalog-info.yaml file. + * If not set, 'master' will be used. + * @visibility backend + */ + branch?: string; + /** + * (Optional) The name used for the catalog file. + * If not set, 'catalog-info.yaml' will be used. + * @visibility backend + */ + entityFilename?: string; + } + >; }; }; } diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts index 429743f4bd..892ce5f25c 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts @@ -100,7 +100,7 @@ describe('config', () => { }); expect(() => readGitlabConfigs(config)).toThrow( - "Missing required config value at 'catalog.providers.gitlab.test.group'", + "Missing required config value at 'catalog.providers.gitlab.test.host'", ); }); @@ -109,8 +109,10 @@ describe('config', () => { catalog: { providers: { gitlab: { - host: 'host', - branch: 'main', + test: { + host: 'host', + branch: 'main', + }, }, }, }, diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.ts index 56df8d62f1..d6ad28b2ca 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/config.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/config.ts @@ -25,7 +25,7 @@ import { GitlabProviderConfig } from '../lib/types'; * @param config - The config object to extract from */ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { - const group = config.getString('group'); + const group = config.getOptionalString('group') ?? ''; const host = config.getString('host'); const branch = config.getOptionalString('branch') ?? 'master'; const catalogFile = @@ -48,7 +48,6 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig { * @param config - The config object to extract from */ export function readGitlabConfigs(config: Config): GitlabProviderConfig[] { - const reservedParams = ['host', 'group', 'branch', 'catalogFile']; const configs: GitlabProviderConfig[] = []; const providerConfigs = config.getOptionalConfig('catalog.providers.gitlab'); @@ -57,20 +56,8 @@ export function readGitlabConfigs(config: Config): GitlabProviderConfig[] { return configs; } - if (providerConfigs.keys().some(r => reservedParams.indexOf(r) >= 0)) { - configs.push({ - id: 'full-check', - group: '', - branch: providerConfigs.getOptionalString('branch') ?? 'master', - host: providerConfigs.getString('host'), - catalogFile: - providerConfigs.getOptionalString('entityFilename') ?? - 'catalog-info.yaml', - }); - } else { - for (const id of providerConfigs.keys()) { - configs.push(readGitlabConfig(id, providerConfigs.getConfig(id))); - } + for (const id of providerConfigs.keys()) { + configs.push(readGitlabConfig(id, providerConfigs.getConfig(id))); } return configs; From 9918c41309e8c9964f7a150cb1133180ff945278 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 12:22:09 +0000 Subject: [PATCH 180/590] chore(deps): update dependency @testing-library/react-hooks to v8.0.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 c3ab158822..ccbfb88be7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5479,9 +5479,9 @@ redent "^3.0.0" "@testing-library/react-hooks@^8.0.0": - version "8.0.0" - resolved "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.0.tgz#7d0164bffce4647f506039de0a97f6fcbd20f4bf" - integrity sha512-uZqcgtcUUtw7Z9N32W13qQhVAD+Xki2hxbTR461MKax8T6Jr8nsUvZB+vcBTkzY2nFvsUet434CsgF0ncW2yFw== + version "8.0.1" + resolved "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz#0924bbd5b55e0c0c0502d1754657ada66947ca12" + integrity sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g== dependencies: "@babel/runtime" "^7.12.5" react-error-boundary "^3.1.0" From 894e3412cfd802bf5408cb0762a0ce189ac5720d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 12:12:01 +0200 Subject: [PATCH 181/590] auth-backend: remove deprecated provider exports Signed-off-by: Patrik Oldsberg --- .../src/providers/atlassian/index.ts | 7 +-- .../src/providers/atlassian/provider.ts | 28 ++-------- .../auth-backend/src/providers/auth0/index.ts | 3 +- .../src/providers/auth0/provider.ts | 28 ---------- .../src/providers/aws-alb/index.ts | 4 +- .../src/providers/aws-alb/provider.ts | 28 ---------- .../src/providers/bitbucket/index.ts | 7 +-- .../src/providers/bitbucket/provider.ts | 42 --------------- .../auth-backend/src/providers/factories.ts | 46 ---------------- .../src/providers/gcp-iap/index.ts | 8 +-- .../src/providers/gcp-iap/provider.ts | 6 --- .../src/providers/gcp-iap/types.ts | 26 +-------- .../src/providers/github/index.ts | 4 +- .../src/providers/github/provider.ts | 46 ---------------- .../src/providers/gitlab/index.ts | 3 +- .../src/providers/gitlab/provider.ts | 31 ----------- .../src/providers/google/index.ts | 3 +- .../src/providers/google/provider.ts | 35 ------------ plugins/auth-backend/src/providers/index.ts | 4 +- .../src/providers/microsoft/index.ts | 6 +-- .../src/providers/microsoft/provider.ts | 35 ------------ .../src/providers/oauth2-proxy/index.ts | 4 +- .../src/providers/oauth2-proxy/provider.ts | 27 ---------- .../src/providers/oauth2/index.ts | 3 +- .../src/providers/oauth2/provider.ts | 18 ------- .../auth-backend/src/providers/oidc/index.ts | 4 +- .../src/providers/oidc/provider.test.ts | 6 +-- .../src/providers/oidc/provider.ts | 18 ------- .../auth-backend/src/providers/okta/index.ts | 3 +- .../src/providers/okta/provider.ts | 35 ------------ .../src/providers/onelogin/index.ts | 3 +- .../src/providers/onelogin/provider.ts | 28 ---------- .../auth-backend/src/providers/providers.ts | 54 +++++++++++++------ .../auth-backend/src/providers/saml/index.ts | 7 +-- .../src/providers/saml/provider.ts | 35 ------------ 35 files changed, 69 insertions(+), 576 deletions(-) delete mode 100644 plugins/auth-backend/src/providers/factories.ts diff --git a/plugins/auth-backend/src/providers/atlassian/index.ts b/plugins/auth-backend/src/providers/atlassian/index.ts index cf3eb901d9..dc6ce77166 100644 --- a/plugins/auth-backend/src/providers/atlassian/index.ts +++ b/plugins/auth-backend/src/providers/atlassian/index.ts @@ -14,8 +14,5 @@ * limitations under the License. */ -export { createAtlassianProvider } from './provider'; -export type { - AtlassianAuthProvider, - AtlassianProviderOptions, -} from './provider'; +export { atlassian } from './provider'; +export type { AtlassianAuthProvider } from './provider'; diff --git a/plugins/auth-backend/src/providers/atlassian/provider.ts b/plugins/auth-backend/src/providers/atlassian/provider.ts index 2aa85dab96..82feef5369 100644 --- a/plugins/auth-backend/src/providers/atlassian/provider.ts +++ b/plugins/auth-backend/src/providers/atlassian/provider.ts @@ -58,6 +58,9 @@ export const atlassianDefaultAuthHandler: AuthHandler = async ({ profile: makeProfileInfo(fullProfile, params.id_token), }); +/** + * @deprecated This export is deprecated and will be removed in the future. + */ export class AtlassianAuthProvider implements OAuthHandlers { private readonly _strategy: AtlassianStrategy; private readonly signInResolver?: SignInResolver; @@ -161,25 +164,6 @@ export class AtlassianAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type AtlassianProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for atlassian auth * @@ -230,9 +214,3 @@ export const atlassian = createAuthProviderIntegration({ }); }, }); - -/** - * @public - * @deprecated Use `providers.atlassian.create` instead - */ -export const createAtlassianProvider = atlassian.create; diff --git a/plugins/auth-backend/src/providers/auth0/index.ts b/plugins/auth-backend/src/providers/auth0/index.ts index b201177d69..94a08a5809 100644 --- a/plugins/auth-backend/src/providers/auth0/index.ts +++ b/plugins/auth-backend/src/providers/auth0/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { createAuth0Provider } from './provider'; -export type { Auth0ProviderOptions } from './provider'; +export { auth0 } from './provider'; diff --git a/plugins/auth-backend/src/providers/auth0/provider.ts b/plugins/auth-backend/src/providers/auth0/provider.ts index 9ddd587508..a53f504f50 100644 --- a/plugins/auth-backend/src/providers/auth0/provider.ts +++ b/plugins/auth-backend/src/providers/auth0/provider.ts @@ -169,28 +169,6 @@ export class Auth0AuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type Auth0ProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for auth0 auth * @@ -249,9 +227,3 @@ export const auth0 = createAuthProviderIntegration({ }); }, }); - -/** - * @public - * @deprecated Use `providers.auth0.create` instead. - */ -export const createAuth0Provider = auth0.create; diff --git a/plugins/auth-backend/src/providers/aws-alb/index.ts b/plugins/auth-backend/src/providers/aws-alb/index.ts index 710d86ca3d..9b3e8920ac 100644 --- a/plugins/auth-backend/src/providers/aws-alb/index.ts +++ b/plugins/auth-backend/src/providers/aws-alb/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { createAwsAlbProvider } from './provider'; -export type { AwsAlbProviderOptions, AwsAlbResult } from './provider'; +export { awsAlb } from './provider'; +export type { AwsAlbResult } from './provider'; diff --git a/plugins/auth-backend/src/providers/aws-alb/provider.ts b/plugins/auth-backend/src/providers/aws-alb/provider.ts index b8d43a11e6..5af606539e 100644 --- a/plugins/auth-backend/src/providers/aws-alb/provider.ts +++ b/plugins/auth-backend/src/providers/aws-alb/provider.ts @@ -211,28 +211,6 @@ export class AwsAlbAuthProvider implements AuthProviderRouteHandlers { }; } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type AwsAlbProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for AWS ALB auth * @@ -282,9 +260,3 @@ export const awsAlb = createAuthProviderIntegration({ }; }, }); - -/** - * @public - * @deprecated Use `providers.awsAlb.create` instead - */ -export const createAwsAlbProvider = awsAlb.create; diff --git a/plugins/auth-backend/src/providers/bitbucket/index.ts b/plugins/auth-backend/src/providers/bitbucket/index.ts index 55a5735655..9d82c1066c 100644 --- a/plugins/auth-backend/src/providers/bitbucket/index.ts +++ b/plugins/auth-backend/src/providers/bitbucket/index.ts @@ -14,13 +14,8 @@ * limitations under the License. */ -export { - createBitbucketProvider, - bitbucketUsernameSignInResolver, - bitbucketUserIdSignInResolver, -} from './provider'; +export { bitbucket } from './provider'; export type { - BitbucketProviderOptions, BitbucketPassportProfile, BitbucketOAuthResult, } from './provider'; diff --git a/plugins/auth-backend/src/providers/bitbucket/provider.ts b/plugins/auth-backend/src/providers/bitbucket/provider.ts index 5b9919764b..e3bd044466 100644 --- a/plugins/auth-backend/src/providers/bitbucket/provider.ts +++ b/plugins/auth-backend/src/providers/bitbucket/provider.ts @@ -190,28 +190,6 @@ export class BitbucketAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type BitbucketProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for BitBucket auth * @@ -305,23 +283,3 @@ export const bitbucket = createAuthProviderIntegration({ }, }, }); - -/** - * @public - * @deprecated Use `providers.bitbucket.create` instead - */ -export const createBitbucketProvider = bitbucket.create; - -/** - * @public - * @deprecated Use `providers.bitbucket.resolvers.usernameMatchingUserEntityAnnotation()` instead. - */ -export const bitbucketUsernameSignInResolver = - bitbucket.resolvers.usernameMatchingUserEntityAnnotation(); - -/** - * @public - * @deprecated Use `providers.bitbucket.resolvers.userIdMatchingUserEntityAnnotation()` instead. - */ -export const bitbucketUserIdSignInResolver = - bitbucket.resolvers.userIdMatchingUserEntityAnnotation(); diff --git a/plugins/auth-backend/src/providers/factories.ts b/plugins/auth-backend/src/providers/factories.ts deleted file mode 100644 index 42d3569815..0000000000 --- a/plugins/auth-backend/src/providers/factories.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 { createGithubProvider } from './github'; -import { createGitlabProvider } from './gitlab'; -import { createGoogleProvider } from './google'; -import { createOAuth2Provider } from './oauth2'; -import { createOidcProvider } from './oidc'; -import { createOktaProvider } from './okta'; -import { createSamlProvider } from './saml'; -import { createAuth0Provider } from './auth0'; -import { createMicrosoftProvider } from './microsoft'; -import { createOneLoginProvider } from './onelogin'; -import { AuthProviderFactory } from './types'; -import { createAwsAlbProvider } from './aws-alb'; -import { createBitbucketProvider } from './bitbucket'; -import { createAtlassianProvider } from './atlassian'; - -export const factories: { [providerId: string]: AuthProviderFactory } = { - google: createGoogleProvider(), - github: createGithubProvider(), - gitlab: createGitlabProvider(), - saml: createSamlProvider(), - okta: createOktaProvider(), - auth0: createAuth0Provider(), - microsoft: createMicrosoftProvider(), - oauth2: createOAuth2Provider(), - oidc: createOidcProvider(), - onelogin: createOneLoginProvider(), - awsalb: createAwsAlbProvider(), - bitbucket: createBitbucketProvider(), - atlassian: createAtlassianProvider(), -}; diff --git a/plugins/auth-backend/src/providers/gcp-iap/index.ts b/plugins/auth-backend/src/providers/gcp-iap/index.ts index 97e31b0051..12f76ec142 100644 --- a/plugins/auth-backend/src/providers/gcp-iap/index.ts +++ b/plugins/auth-backend/src/providers/gcp-iap/index.ts @@ -14,9 +14,5 @@ * limitations under the License. */ -export { createGcpIapProvider } from './provider'; -export type { - GcpIapProviderOptions, - GcpIapResult, - GcpIapTokenInfo, -} from './types'; +export { gcpIap } from './provider'; +export type { GcpIapResult, GcpIapTokenInfo } from './types'; diff --git a/plugins/auth-backend/src/providers/gcp-iap/provider.ts b/plugins/auth-backend/src/providers/gcp-iap/provider.ts index cb5d5979cd..500b062d5b 100644 --- a/plugins/auth-backend/src/providers/gcp-iap/provider.ts +++ b/plugins/auth-backend/src/providers/gcp-iap/provider.ts @@ -117,9 +117,3 @@ export const gcpIap = createAuthProviderIntegration({ }; }, }); - -/** - * @public - * @deprecated Use `providers.gcpIap.create` instead - */ -export const createGcpIapProvider = gcpIap.create; diff --git a/plugins/auth-backend/src/providers/gcp-iap/types.ts b/plugins/auth-backend/src/providers/gcp-iap/types.ts index 6e5a022a3d..25828b7d51 100644 --- a/plugins/auth-backend/src/providers/gcp-iap/types.ts +++ b/plugins/auth-backend/src/providers/gcp-iap/types.ts @@ -15,7 +15,7 @@ */ import { JsonValue } from '@backstage/types'; -import { AuthHandler, AuthResponse, SignInResolver } from '../types'; +import { AuthResponse } from '../types'; /** * The header name used by the IAP. @@ -69,27 +69,3 @@ export type GcpIapProviderInfo = { * The shape of the response to return to callers. */ export type GcpIapResponse = AuthResponse; - -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type GcpIapProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth - * response into the profile that will be presented to the user. The default - * implementation just provides the authenticated email that the IAP - * presented. - */ - authHandler?: AuthHandler; - - /** - * Configures sign-in for this provider. - */ - signIn: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; diff --git a/plugins/auth-backend/src/providers/github/index.ts b/plugins/auth-backend/src/providers/github/index.ts index a855b13b83..2f4bb1f6cd 100644 --- a/plugins/auth-backend/src/providers/github/index.ts +++ b/plugins/auth-backend/src/providers/github/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { createGithubProvider } from './provider'; -export type { GithubOAuthResult, GithubProviderOptions } from './provider'; +export { github } from './provider'; +export type { GithubOAuthResult } from './provider'; diff --git a/plugins/auth-backend/src/providers/github/provider.ts b/plugins/auth-backend/src/providers/github/provider.ts index e018a6cf99..9c115b5eb8 100644 --- a/plugins/auth-backend/src/providers/github/provider.ts +++ b/plugins/auth-backend/src/providers/github/provider.ts @@ -227,46 +227,6 @@ export class GithubAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type GithubProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; - - /** - * The state encoder used to encode the 'state' parameter on the OAuth request. - * - * It should return a string that takes the state params (from the request), url encodes the params - * and finally base64 encodes them. - * - * Providing your own stateEncoder will allow you to add addition parameters to the state field. - * - * It is typed as follows: - * `export type StateEncoder = (input: OAuthState) => Promise<{encodedState: string}>;` - * - * Note: the stateEncoder must encode a 'nonce' value and an 'env' value. Without this, the OAuth flow will fail - * (These two values will be set by the req.state by default) - * - * For more information, please see the helper module in ../../oauth/helpers #readState - */ - stateEncoder?: StateEncoder; -}; - /** * Auth provider integration for GitHub auth * @@ -381,9 +341,3 @@ export const github = createAuthProviderIntegration({ }, }, }); - -/** - * @public - * @deprecated Use `providers.github.create` instead - */ -export const createGithubProvider = github.create; diff --git a/plugins/auth-backend/src/providers/gitlab/index.ts b/plugins/auth-backend/src/providers/gitlab/index.ts index 52ede48756..9b60d1f18a 100644 --- a/plugins/auth-backend/src/providers/gitlab/index.ts +++ b/plugins/auth-backend/src/providers/gitlab/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { createGitlabProvider } from './provider'; -export type { GitlabProviderOptions } from './provider'; +export { gitlab } from './provider'; diff --git a/plugins/auth-backend/src/providers/gitlab/provider.ts b/plugins/auth-backend/src/providers/gitlab/provider.ts index 868357bcda..c24c2e128d 100644 --- a/plugins/auth-backend/src/providers/gitlab/provider.ts +++ b/plugins/auth-backend/src/providers/gitlab/provider.ts @@ -178,31 +178,6 @@ export class GitlabAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type GitlabProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - /** - * Maps an auth result to a Backstage identity for the user. - * - * Set to `'email'` to use the default email-based sign in resolver, which will search - * the catalog for a single user entity that has a matching `microsoft.com/email` annotation. - */ - signIn?: { - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for GitLab auth * @@ -254,9 +229,3 @@ export const gitlab = createAuthProviderIntegration({ }); }, }); - -/** - * @public - * @deprecated Use `providers.gitlab.create` instead - */ -export const createGitlabProvider = gitlab.create; diff --git a/plugins/auth-backend/src/providers/google/index.ts b/plugins/auth-backend/src/providers/google/index.ts index 209484ad04..5e8c3236e4 100644 --- a/plugins/auth-backend/src/providers/google/index.ts +++ b/plugins/auth-backend/src/providers/google/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { createGoogleProvider, googleEmailSignInResolver } from './provider'; -export type { GoogleProviderOptions } from './provider'; +export { google } from './provider'; diff --git a/plugins/auth-backend/src/providers/google/provider.ts b/plugins/auth-backend/src/providers/google/provider.ts index 2d58bc2aa6..f60d4e9947 100644 --- a/plugins/auth-backend/src/providers/google/provider.ts +++ b/plugins/auth-backend/src/providers/google/provider.ts @@ -168,28 +168,6 @@ export class GoogleAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type GoogleProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for Google auth * @@ -272,16 +250,3 @@ export const google = createAuthProviderIntegration({ }, }, }); - -/** - * @public - * @deprecated Use `providers.google.create` instead. - */ -export const createGoogleProvider = google.create; - -/** - * @public - * @deprecated Use `providers.google.resolvers.emailMatchingUserEntityAnnotation()` instead. - */ -export const googleEmailSignInResolver = - google.resolvers.emailMatchingUserEntityAnnotation(); diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts index 1f33a60e55..bac1143fd1 100644 --- a/plugins/auth-backend/src/providers/index.ts +++ b/plugins/auth-backend/src/providers/index.ts @@ -30,9 +30,7 @@ export * from './onelogin'; export * from './saml'; export * from './gcp-iap'; -export { providers } from './providers'; - -export { factories as defaultAuthProviderFactories } from './factories'; +export { providers, defaultAuthProviderFactories } from './providers'; export type { AuthProviderConfig, diff --git a/plugins/auth-backend/src/providers/microsoft/index.ts b/plugins/auth-backend/src/providers/microsoft/index.ts index 3167de5d0d..16dadc3bb0 100644 --- a/plugins/auth-backend/src/providers/microsoft/index.ts +++ b/plugins/auth-backend/src/providers/microsoft/index.ts @@ -14,8 +14,4 @@ * limitations under the License. */ -export { - createMicrosoftProvider, - microsoftEmailSignInResolver, -} from './provider'; -export type { MicrosoftProviderOptions } from './provider'; +export { microsoft } from './provider'; diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index 0c58049619..db79dba225 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -190,28 +190,6 @@ export class MicrosoftAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type MicrosoftProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for Microsoft auth * @@ -301,16 +279,3 @@ export const microsoft = createAuthProviderIntegration({ }, }, }); - -/** - * @public - * @deprecated Use `providers.microsoft.create` instead - */ -export const createMicrosoftProvider = microsoft.create; - -/** - * @public - * @deprecated Use `providers.microsoft.resolvers.emailMatchingUserEntityAnnotation()` instead. - */ -export const microsoftEmailSignInResolver = - microsoft.resolvers.emailMatchingUserEntityAnnotation(); diff --git a/plugins/auth-backend/src/providers/oauth2-proxy/index.ts b/plugins/auth-backend/src/providers/oauth2-proxy/index.ts index 62304b1d1f..d3004f31e4 100644 --- a/plugins/auth-backend/src/providers/oauth2-proxy/index.ts +++ b/plugins/auth-backend/src/providers/oauth2-proxy/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { createOauth2ProxyProvider } from './provider'; -export type { Oauth2ProxyProviderOptions, OAuth2ProxyResult } from './provider'; +export { oauth2Proxy } from './provider'; +export type { OAuth2ProxyResult } from './provider'; diff --git a/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts b/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts index 625c9e3d62..3ac7d09000 100644 --- a/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts +++ b/plugins/auth-backend/src/providers/oauth2-proxy/provider.ts @@ -80,27 +80,6 @@ export type OAuth2ProxyResult = { getHeader(name: string): string | undefined; }; -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type Oauth2ProxyProviderOptions = { - /** - * Configure an auth handler to generate a profile for the user. - */ - authHandler: AuthHandler>; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver>; - }; -}; - interface Options { resolverContext: AuthResolverContext; signInResolver: SignInResolver>; @@ -231,9 +210,3 @@ export const oauth2Proxy = createAuthProviderIntegration({ }; }, }); - -/** - * @public - * @deprecated Use `providers.oauth2Proxy.create` instead - */ -export const createOauth2ProxyProvider = oauth2Proxy.create; diff --git a/plugins/auth-backend/src/providers/oauth2/index.ts b/plugins/auth-backend/src/providers/oauth2/index.ts index d68208a148..14485e04ff 100644 --- a/plugins/auth-backend/src/providers/oauth2/index.ts +++ b/plugins/auth-backend/src/providers/oauth2/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { createOAuth2Provider } from './provider'; -export type { OAuth2ProviderOptions } from './provider'; +export { oauth2 } from './provider'; diff --git a/plugins/auth-backend/src/providers/oauth2/provider.ts b/plugins/auth-backend/src/providers/oauth2/provider.ts index 6b4787e985..6fa649c421 100644 --- a/plugins/auth-backend/src/providers/oauth2/provider.ts +++ b/plugins/auth-backend/src/providers/oauth2/provider.ts @@ -192,18 +192,6 @@ export class OAuth2AuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type OAuth2ProviderOptions = { - authHandler?: AuthHandler; - - signIn?: { - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for generic OAuth2 auth * @@ -260,9 +248,3 @@ export const oauth2 = createAuthProviderIntegration({ }); }, }); - -/** - * @public - * @deprecated Use `providers.oauth2.create` instead - */ -export const createOAuth2Provider = oauth2.create; diff --git a/plugins/auth-backend/src/providers/oidc/index.ts b/plugins/auth-backend/src/providers/oidc/index.ts index e63c9920df..6b2282411c 100644 --- a/plugins/auth-backend/src/providers/oidc/index.ts +++ b/plugins/auth-backend/src/providers/oidc/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export type { OidcAuthResult, OidcProviderOptions } from './provider'; -export { createOidcProvider } from './provider'; +export { oidc } from './provider'; +export type { OidcAuthResult } from './provider'; diff --git a/plugins/auth-backend/src/providers/oidc/provider.test.ts b/plugins/auth-backend/src/providers/oidc/provider.test.ts index 59a717f132..ee8aa50b01 100644 --- a/plugins/auth-backend/src/providers/oidc/provider.test.ts +++ b/plugins/auth-backend/src/providers/oidc/provider.test.ts @@ -23,7 +23,7 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { ClientMetadata, IssuerMetadata } from 'openid-client'; import { OAuthAdapter } from '../../lib/oauth'; -import { createOidcProvider, OidcAuthProvider, Options } from './provider'; +import { oidc, OidcAuthProvider, Options } from './provider'; import { AuthResolverContext } from '../types'; const issuerMetadata = { @@ -155,7 +155,7 @@ describe('OidcAuthProvider', () => { expect(requestSequence).toEqual([0, 1, 2].map(i => requests[i].url)); }); - it('createOidcProvider', async () => { + it('oidc.create', async () => { const handler = jest.fn((_req, res, ctx) => { return res( ctx.status(200), @@ -172,7 +172,7 @@ describe('OidcAuthProvider', () => { metadataUrl: 'https://oidc.test/.well-known/openid-configuration', }, } as any); - const provider = createOidcProvider()({ + const provider = oidc.create()({ globalConfig: { appUrl: 'https://oidc.test', baseUrl: 'https://oidc.test', diff --git a/plugins/auth-backend/src/providers/oidc/provider.ts b/plugins/auth-backend/src/providers/oidc/provider.ts index 69a65d1cae..eb963a3711 100644 --- a/plugins/auth-backend/src/providers/oidc/provider.ts +++ b/plugins/auth-backend/src/providers/oidc/provider.ts @@ -198,18 +198,6 @@ export class OidcAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type OidcProviderOptions = { - authHandler?: AuthHandler; - - signIn?: { - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for generic OpenID Connect auth * @@ -268,9 +256,3 @@ export const oidc = createAuthProviderIntegration({ }); }, }); - -/** - * @public - * @deprecated Use `providers.oidc.create` instead - */ -export const createOidcProvider = oidc.create; diff --git a/plugins/auth-backend/src/providers/okta/index.ts b/plugins/auth-backend/src/providers/okta/index.ts index fd9ebf46da..3387fa3668 100644 --- a/plugins/auth-backend/src/providers/okta/index.ts +++ b/plugins/auth-backend/src/providers/okta/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { createOktaProvider, oktaEmailSignInResolver } from './provider'; -export type { OktaProviderOptions } from './provider'; +export { okta } from './provider'; diff --git a/plugins/auth-backend/src/providers/okta/provider.ts b/plugins/auth-backend/src/providers/okta/provider.ts index 98cec6df3a..de9d128641 100644 --- a/plugins/auth-backend/src/providers/okta/provider.ts +++ b/plugins/auth-backend/src/providers/okta/provider.ts @@ -192,28 +192,6 @@ export class OktaAuthProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type OktaProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for Okta auth * @@ -305,16 +283,3 @@ export const okta = createAuthProviderIntegration({ }, }, }); - -/** - * @public - * @deprecated Use `providers.okta.create` instead - */ -export const createOktaProvider = okta.create; - -/** - * @public - * @deprecated Use `providers.okta.resolvers.emailMatchingUserEntityAnnotation()` instead. - */ -export const oktaEmailSignInResolver = - okta.resolvers.emailMatchingUserEntityAnnotation(); diff --git a/plugins/auth-backend/src/providers/onelogin/index.ts b/plugins/auth-backend/src/providers/onelogin/index.ts index 63cf0be3cd..3f356029fb 100644 --- a/plugins/auth-backend/src/providers/onelogin/index.ts +++ b/plugins/auth-backend/src/providers/onelogin/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { createOneLoginProvider } from './provider'; -export type { OneLoginProviderOptions } from './provider'; +export { onelogin } from './provider'; diff --git a/plugins/auth-backend/src/providers/onelogin/provider.ts b/plugins/auth-backend/src/providers/onelogin/provider.ts index d81eb3d83c..59b57b3851 100644 --- a/plugins/auth-backend/src/providers/onelogin/provider.ts +++ b/plugins/auth-backend/src/providers/onelogin/provider.ts @@ -166,28 +166,6 @@ export class OneLoginProvider implements OAuthHandlers { } } -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type OneLoginProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for OneLogin auth * @@ -244,9 +222,3 @@ export const onelogin = createAuthProviderIntegration({ }); }, }); - -/** - * @public - * @deprecated Use `providers.onelogin.create` instead - */ -export const createOneLoginProvider = onelogin.create; diff --git a/plugins/auth-backend/src/providers/providers.ts b/plugins/auth-backend/src/providers/providers.ts index 3d49e2bbbb..71df8223ef 100644 --- a/plugins/auth-backend/src/providers/providers.ts +++ b/plugins/auth-backend/src/providers/providers.ts @@ -14,21 +14,22 @@ * limitations under the License. */ -import { atlassian } from './atlassian/provider'; -import { auth0 } from './auth0/provider'; -import { awsAlb } from './aws-alb/provider'; -import { bitbucket } from './bitbucket/provider'; -import { gcpIap } from './gcp-iap/provider'; -import { github } from './github/provider'; -import { gitlab } from './gitlab/provider'; -import { google } from './google/provider'; -import { microsoft } from './microsoft/provider'; -import { oauth2 } from './oauth2/provider'; -import { oauth2Proxy } from './oauth2-proxy/provider'; -import { oidc } from './oidc/provider'; -import { okta } from './okta/provider'; -import { onelogin } from './onelogin/provider'; -import { saml } from './saml/provider'; +import { atlassian } from './atlassian'; +import { auth0 } from './auth0'; +import { awsAlb } from './aws-alb'; +import { bitbucket } from './bitbucket'; +import { gcpIap } from './gcp-iap'; +import { github } from './github'; +import { gitlab } from './gitlab'; +import { google } from './google'; +import { microsoft } from './microsoft'; +import { oauth2 } from './oauth2'; +import { oauth2Proxy } from './oauth2-proxy'; +import { oidc } from './oidc'; +import { okta } from './okta'; +import { onelogin } from './onelogin'; +import { saml } from './saml'; +import { AuthProviderFactory } from './types'; /** * All built-in auth provider integrations. @@ -52,3 +53,26 @@ export const providers = Object.freeze({ onelogin, saml, }); + +/** + * All auth provider factories that are installed by default. + * + * @public + */ +export const defaultAuthProviderFactories: { + [providerId: string]: AuthProviderFactory; +} = { + google: google.create(), + github: github.create(), + gitlab: gitlab.create(), + saml: saml.create(), + okta: okta.create(), + auth0: auth0.create(), + microsoft: microsoft.create(), + oauth2: oauth2.create(), + oidc: oidc.create(), + onelogin: onelogin.create(), + awsalb: awsAlb.create(), + bitbucket: bitbucket.create(), + atlassian: atlassian.create(), +}; diff --git a/plugins/auth-backend/src/providers/saml/index.ts b/plugins/auth-backend/src/providers/saml/index.ts index 8d36e17d29..d59f7bf0a7 100644 --- a/plugins/auth-backend/src/providers/saml/index.ts +++ b/plugins/auth-backend/src/providers/saml/index.ts @@ -14,8 +14,5 @@ * limitations under the License. */ -export { - createSamlProvider, - samlNameIdEntityNameSignInResolver, -} from './provider'; -export type { SamlProviderOptions, SamlAuthResult } from './provider'; +export { saml } from './provider'; +export type { SamlAuthResult } from './provider'; diff --git a/plugins/auth-backend/src/providers/saml/provider.ts b/plugins/auth-backend/src/providers/saml/provider.ts index 4f5076b410..3d35f46628 100644 --- a/plugins/auth-backend/src/providers/saml/provider.ts +++ b/plugins/auth-backend/src/providers/saml/provider.ts @@ -132,28 +132,6 @@ export class SamlAuthProvider implements AuthProviderRouteHandlers { type SignatureAlgorithm = 'sha1' | 'sha256' | 'sha512'; -/** - * @public - * @deprecated This type has been inlined into the create method and will be removed. - */ -export type SamlProviderOptions = { - /** - * The profile transformation function used to verify and convert the auth response - * into the profile that will be presented to the user. - */ - authHandler?: AuthHandler; - - /** - * Configure sign-in for this provider, without it the provider can not be used to sign users in. - */ - signIn?: { - /** - * Maps an auth result to a Backstage identity for the user. - */ - resolver: SignInResolver; - }; -}; - /** * Auth provider integration for SAML auth * @@ -230,16 +208,3 @@ export const saml = createAuthProviderIntegration({ }, }, }); - -/** - * @public - * @deprecated Use `providers.saml.create` instead - */ -export const createSamlProvider = saml.create; - -/** - * @public - * @deprecated Use `providers.saml.resolvers.nameIdMatchingUserEntityName()` instead. - */ -export const samlNameIdEntityNameSignInResolver = - saml.resolvers.nameIdMatchingUserEntityName(); From ba0cb5b99b2b57e67e90fb17d98da4a617b9194c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 12:17:11 +0200 Subject: [PATCH 182/590] auth-backend: remove deprecated provider factory fields and types Signed-off-by: Patrik Oldsberg --- plugins/auth-backend/src/providers/index.ts | 1 - plugins/auth-backend/src/providers/types.ts | 41 ++------------------- plugins/auth-backend/src/service/router.ts | 4 -- 3 files changed, 3 insertions(+), 43 deletions(-) diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts index bac1143fd1..778783994f 100644 --- a/plugins/auth-backend/src/providers/index.ts +++ b/plugins/auth-backend/src/providers/index.ts @@ -35,7 +35,6 @@ export { providers, defaultAuthProviderFactories } from './providers'; export type { AuthProviderConfig, AuthProviderRouteHandlers, - AuthProviderFactoryOptions, AuthProviderFactory, AuthHandler, AuthResolverCatalogUserQuery, diff --git a/plugins/auth-backend/src/providers/types.ts b/plugins/auth-backend/src/providers/types.ts index 128dea12ef..c99bdfbadb 100644 --- a/plugins/auth-backend/src/providers/types.ts +++ b/plugins/auth-backend/src/providers/types.ts @@ -14,11 +14,8 @@ * limitations under the License. */ -import { - PluginEndpointDiscovery, - TokenManager, -} from '@backstage/backend-common'; -import { CatalogApi, GetEntitiesRequest } from '@backstage/catalog-client'; +import { GetEntitiesRequest } from '@backstage/catalog-client'; +import { Entity } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { BackstageIdentityResponse, @@ -26,10 +23,8 @@ import { } from '@backstage/plugin-auth-node'; import express from 'express'; import { Logger } from 'winston'; -import { TokenIssuer, TokenParams } from '../identity/types'; +import { TokenParams } from '../identity/types'; import { OAuthStartRequest } from '../lib/oauth/types'; -import { CatalogIdentityClient } from '../lib/catalog'; -import { Entity } from '@backstage/catalog-model'; /** * A query for a single user in the catalog. @@ -69,13 +64,6 @@ export type AuthResolverCatalogUserQuery = * @public */ export type AuthResolverContext = { - /** @deprecated Will be removed from the context, access it via a closure instead if needed */ - logger: Logger; - /** @deprecated Use the `issueToken` method instead */ - tokenIssuer: TokenIssuer; - /** @deprecated Use the `findCatalogUser` and `signInWithCatalogUser` methods instead, and the `getDefaultOwnershipEntityRefs` helper */ - catalogIdentityClient: CatalogIdentityClient; - /** * Issues a Backstage token using the provided parameters. */ @@ -204,35 +192,12 @@ export interface AuthProviderRouteHandlers { logout?(req: express.Request, res: express.Response): Promise; } -/** - * @deprecated This type is deprecated and will be removed in a future release. - */ -export type AuthProviderFactoryOptions = { - providerId: string; - globalConfig: AuthProviderConfig; - config: Config; - logger: Logger; - tokenManager: TokenManager; - tokenIssuer: TokenIssuer; - discovery: PluginEndpointDiscovery; - catalogApi: CatalogApi; -}; - export type AuthProviderFactory = (options: { providerId: string; globalConfig: AuthProviderConfig; config: Config; logger: Logger; resolverContext: AuthResolverContext; - - /** @deprecated This field has been deprecated and needs to be passed directly to the auth provider instead */ - tokenManager: TokenManager; - /** @deprecated This field has been deprecated and needs to be passed directly to the auth provider instead */ - tokenIssuer: TokenIssuer; - /** @deprecated This field has been deprecated and needs to be passed directly to the auth provider instead */ - discovery: PluginEndpointDiscovery; - /** @deprecated This field has been deprecated and needs to be passed directly to the auth provider instead */ - catalogApi: CatalogApi; }) => AuthProviderRouteHandlers; /** @public */ diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts index 80b8a24022..50577ece53 100644 --- a/plugins/auth-backend/src/service/router.ts +++ b/plugins/auth-backend/src/service/router.ts @@ -119,10 +119,6 @@ export async function createRouter( }, config: providersConfig.getConfig(providerId), logger, - tokenManager, - tokenIssuer, - discovery, - catalogApi, resolverContext: CatalogAuthResolverContext.create({ logger, catalogApi, From 36e4377480aff6b2939fa8a7dcb6f48328855b82 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 12:17:29 +0200 Subject: [PATCH 183/590] auth-backend: remove deprecated identity exports Signed-off-by: Patrik Oldsberg --- plugins/auth-backend/src/identity/index.ts | 2 +- plugins/auth-backend/src/identity/types.ts | 4 +- plugins/auth-backend/src/index.ts | 2 +- .../auth-backend/src/lib/catalog/helpers.ts | 41 ------------------- plugins/auth-backend/src/lib/catalog/index.ts | 1 - .../src/lib/oauth/OAuthAdapter.ts | 8 +--- .../resolvers/CatalogAuthResolverContext.ts | 3 +- 7 files changed, 5 insertions(+), 56 deletions(-) delete mode 100644 plugins/auth-backend/src/lib/catalog/helpers.ts diff --git a/plugins/auth-backend/src/identity/index.ts b/plugins/auth-backend/src/identity/index.ts index cb2f369668..a5e0dd4b80 100644 --- a/plugins/auth-backend/src/identity/index.ts +++ b/plugins/auth-backend/src/identity/index.ts @@ -20,4 +20,4 @@ export { DatabaseKeyStore } from './DatabaseKeyStore'; export { MemoryKeyStore } from './MemoryKeyStore'; export { FirestoreKeyStore } from './FirestoreKeyStore'; export { KeyStores } from './KeyStores'; -export type { KeyStore, TokenIssuer, TokenParams } from './types'; +export type { KeyStore, TokenParams } from './types'; diff --git a/plugins/auth-backend/src/identity/types.ts b/plugins/auth-backend/src/identity/types.ts index 5a350284e5..f0959e90bd 100644 --- a/plugins/auth-backend/src/identity/types.ts +++ b/plugins/auth-backend/src/identity/types.ts @@ -37,12 +37,10 @@ export type TokenParams = { }; }; -// TODO(Rugvip): This should at least be made internal /** * A TokenIssuer is able to issue verifiable ID Tokens on demand. * - * @public - * @deprecated This interface is deprecated and will be removed in a future release. + * @internal */ export type TokenIssuer = { /** diff --git a/plugins/auth-backend/src/index.ts b/plugins/auth-backend/src/index.ts index d51cb3f1eb..f8a8580359 100644 --- a/plugins/auth-backend/src/index.ts +++ b/plugins/auth-backend/src/index.ts @@ -21,7 +21,7 @@ */ export * from './service/router'; -export type { TokenIssuer, TokenParams } from './identity'; +export type { TokenParams } from './identity'; export * from './providers'; // flow package provides 2 functions diff --git a/plugins/auth-backend/src/lib/catalog/helpers.ts b/plugins/auth-backend/src/lib/catalog/helpers.ts deleted file mode 100644 index 3ff1b5da05..0000000000 --- a/plugins/auth-backend/src/lib/catalog/helpers.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2021 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 { - RELATION_MEMBER_OF, - stringifyEntityRef, - UserEntity, -} from '@backstage/catalog-model'; -import { TokenParams } from '../../identity'; - -/** - * @deprecated use {@link getDefaultOwnershipEntityRefs} instead - */ -export function getEntityClaims(entity: UserEntity): TokenParams['claims'] { - const userRef = stringifyEntityRef(entity); - - const membershipRefs = - entity.relations - ?.filter( - r => r.type === RELATION_MEMBER_OF && r.targetRef.startsWith('group:'), - ) - .map(r => r.targetRef) ?? []; - - return { - sub: userRef, - ent: [userRef, ...membershipRefs], - }; -} diff --git a/plugins/auth-backend/src/lib/catalog/index.ts b/plugins/auth-backend/src/lib/catalog/index.ts index 0d1aa4a6f7..f0f5b10808 100644 --- a/plugins/auth-backend/src/lib/catalog/index.ts +++ b/plugins/auth-backend/src/lib/catalog/index.ts @@ -15,4 +15,3 @@ */ export { CatalogIdentityClient } from './CatalogIdentityClient'; -export { getEntityClaims } from './helpers'; diff --git a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts index 5be4b7e3c0..9c28ed8fad 100644 --- a/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts +++ b/plugins/auth-backend/src/lib/oauth/OAuthAdapter.ts @@ -31,7 +31,6 @@ import { isError, NotAllowedError, } from '@backstage/errors'; -import { TokenIssuer } from '../../identity/types'; import { defaultCookieConfigurer, readState, verifyNonce } from './helpers'; import { postMessageResponse, ensuresXRequestedWith } from '../flow'; import { @@ -52,8 +51,6 @@ export type Options = { cookieDomain: string; cookiePath: string; appOrigin: string; - /** @deprecated This option is no longer needed */ - tokenIssuer?: TokenIssuer; isOriginAllowed: (origin: string) => boolean; callbackUrl: string; }; @@ -61,10 +58,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers { static fromConfig( config: AuthProviderConfig, handlers: OAuthHandlers, - options: Pick< - Options, - 'providerId' | 'persistScopes' | 'tokenIssuer' | 'callbackUrl' - >, + options: Pick, ): OAuthAdapter { const { origin: appOrigin } = new URL(config.appUrl); diff --git a/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts b/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts index 1a1fdd7a36..cbc2439563 100644 --- a/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts +++ b/plugins/auth-backend/src/lib/resolvers/CatalogAuthResolverContext.ts @@ -25,8 +25,7 @@ import { } from '@backstage/catalog-model'; import { ConflictError, InputError, NotFoundError } from '@backstage/errors'; import { Logger } from 'winston'; -import { TokenIssuer } from '../..'; -import { TokenParams } from '../../identity'; +import { TokenIssuer, TokenParams } from '../../identity/types'; import { AuthResolverContext } from '../../providers'; import { AuthResolverCatalogUserQuery } from '../../providers/types'; import { CatalogIdentityClient } from '../catalog'; From 59761a0106298998547de01f415cf175250e2b0b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 12:18:08 +0200 Subject: [PATCH 184/590] auth-backend: update API report Signed-off-by: Patrik Oldsberg --- plugins/auth-backend/api-report.md | 624 ++++++++++++----------------- 1 file changed, 253 insertions(+), 371 deletions(-) diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md index bb25ff6d57..136f9a664d 100644 --- a/plugins/auth-backend/api-report.md +++ b/plugins/auth-backend/api-report.md @@ -23,9 +23,26 @@ import { TokenSet } from 'openid-client'; import { UserEntity } from '@backstage/catalog-model'; import { UserinfoResponse } from 'openid-client'; +// @public +export const atlassian: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; + // Warning: (ae-missing-release-tag) "AtlassianAuthProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // -// @public (undocumented) +// @public @deprecated (undocumented) export class AtlassianAuthProvider implements OAuthHandlers { // Warning: (ae-forgotten-export) The symbol "AtlassianAuthProviderOptions" needs to be exported by the entry point index.d.ts constructor(options: AtlassianAuthProviderOptions); @@ -45,21 +62,22 @@ export class AtlassianAuthProvider implements OAuthHandlers { start(req: OAuthStartRequest): Promise; } -// @public @deprecated (undocumented) -export type AtlassianProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; - -// @public @deprecated (undocumented) -export type Auth0ProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; +// @public +export const auth0: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; // @public export type AuthHandler = ( @@ -89,26 +107,8 @@ export type AuthProviderFactory = (options: { config: Config; logger: Logger; resolverContext: AuthResolverContext; - tokenManager: TokenManager; - tokenIssuer: TokenIssuer; - discovery: PluginEndpointDiscovery; - catalogApi: CatalogApi; }) => AuthProviderRouteHandlers; -// Warning: (ae-missing-release-tag) "AuthProviderFactoryOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public @deprecated (undocumented) -export type AuthProviderFactoryOptions = { - providerId: string; - globalConfig: AuthProviderConfig; - config: Config; - logger: Logger; - tokenManager: TokenManager; - tokenIssuer: TokenIssuer; - discovery: PluginEndpointDiscovery; - catalogApi: CatalogApi; -}; - // Warning: (ae-missing-release-tag) "AuthProviderRouteHandlers" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -139,9 +139,6 @@ export type AuthResolverCatalogUserQuery = // @public export type AuthResolverContext = { - logger: Logger; - tokenIssuer: TokenIssuer; - catalogIdentityClient: CatalogIdentityClient; issueToken(params: TokenParams): Promise<{ token: string; }>; @@ -160,13 +157,20 @@ export type AuthResponse = { backstageIdentity?: BackstageIdentityResponse; }; -// @public @deprecated (undocumented) -export type AwsAlbProviderOptions = { - authHandler?: AuthHandler; - signIn: { - resolver: SignInResolver; - }; -}; +// @public +export const awsAlb: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn: { + resolver: SignInResolver; + }; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; // @public (undocumented) export type AwsAlbResult = { @@ -175,6 +179,26 @@ export type AwsAlbResult = { accessToken: string; }; +// @public +export const bitbucket: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: Readonly<{ + usernameMatchingUserEntityAnnotation(): SignInResolver; + userIdMatchingUserEntityAnnotation(): SignInResolver; + }>; +}>; + // Warning: (ae-missing-release-tag) "BitbucketOAuthResult" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -206,20 +230,6 @@ export type BitbucketPassportProfile = Profile & { }; }; -// @public @deprecated (undocumented) -export type BitbucketProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; - -// @public @deprecated (undocumented) -export const bitbucketUserIdSignInResolver: SignInResolver; - -// @public @deprecated (undocumented) -export const bitbucketUsernameSignInResolver: SignInResolver; - // Warning: (ae-missing-release-tag) "CatalogIdentityClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -242,189 +252,6 @@ export type CookieConfigurer = (ctx: { secure: boolean; }; -// @public @deprecated (undocumented) -export const createAtlassianProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createAuth0Provider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createAwsAlbProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn: { - resolver: SignInResolver; - }; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createBitbucketProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createGcpIapProvider: (options: { - authHandler?: AuthHandler | undefined; - signIn: { - resolver: SignInResolver; - }; -}) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createGithubProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - stateEncoder?: StateEncoder | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createGitlabProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createGoogleProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createMicrosoftProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createOAuth2Provider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createOauth2ProxyProvider: (options: { - authHandler?: AuthHandler> | undefined; - signIn: { - resolver: SignInResolver>; - }; -}) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createOidcProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createOktaProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// @public @deprecated (undocumented) -export const createOneLoginProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - // Warning: (ae-missing-release-tag) "createOriginFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -435,23 +262,7 @@ export function createOriginFilter(config: Config): (origin: string) => boolean; // @public (undocumented) export function createRouter(options: RouterOptions): Promise; -// @public @deprecated (undocumented) -export const createSamlProvider: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, -) => AuthProviderFactory; - -// Warning: (ae-missing-release-tag) "factories" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export const defaultAuthProviderFactories: { [providerId: string]: AuthProviderFactory; }; @@ -466,13 +277,16 @@ export const encodeState: (state: OAuthState) => string; // @public (undocumented) export const ensuresXRequestedWith: (req: express.Request) => boolean; -// @public @deprecated (undocumented) -export type GcpIapProviderOptions = { - authHandler?: AuthHandler; - signIn: { - resolver: SignInResolver; - }; -}; +// @public +export const gcpIap: Readonly<{ + create: (options: { + authHandler?: AuthHandler | undefined; + signIn: { + resolver: SignInResolver; + }; + }) => AuthProviderFactory; + resolvers: never; +}>; // @public export type GcpIapResult = { @@ -489,10 +303,25 @@ export type GcpIapTokenInfo = { // @public export function getDefaultOwnershipEntityRefs(entity: Entity): string[]; -// Warning: (ae-missing-release-tag) "getEntityClaims" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public @deprecated (undocumented) -export function getEntityClaims(entity: UserEntity): TokenParams['claims']; +// @public +export const github: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + stateEncoder?: StateEncoder | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: Readonly<{ + usernameMatchingUserEntityName: () => SignInResolver; + }>; +}>; // Warning: (ae-missing-release-tag) "GithubOAuthResult" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -508,60 +337,92 @@ export type GithubOAuthResult = { refreshToken?: string; }; -// @public @deprecated (undocumented) -export type GithubProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; - stateEncoder?: StateEncoder; -}; +// @public +export const gitlab: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; -// @public @deprecated (undocumented) -export type GitlabProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; +// @public +export const google: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: Readonly<{ + emailLocalPartMatchingUserEntityName: () => SignInResolver; + emailMatchingUserEntityProfileEmail: () => SignInResolver; + emailMatchingUserEntityAnnotation(): SignInResolver; + }>; +}>; -// @public @deprecated (undocumented) -export const googleEmailSignInResolver: SignInResolver; +// @public +export const microsoft: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: Readonly<{ + emailLocalPartMatchingUserEntityName: () => SignInResolver; + emailMatchingUserEntityProfileEmail: () => SignInResolver; + emailMatchingUserEntityAnnotation(): SignInResolver; + }>; +}>; -// @public @deprecated (undocumented) -export type GoogleProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; +// @public +export const oauth2: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; -// @public @deprecated (undocumented) -export const microsoftEmailSignInResolver: SignInResolver; - -// @public @deprecated (undocumented) -export type MicrosoftProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; - -// @public @deprecated (undocumented) -export type OAuth2ProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; - -// @public @deprecated (undocumented) -export type Oauth2ProxyProviderOptions = { - authHandler: AuthHandler>; - signIn: { - resolver: SignInResolver>; - }; -}; +// @public +export const oauth2Proxy: Readonly<{ + create: (options: { + authHandler?: AuthHandler> | undefined; + signIn: { + resolver: SignInResolver>; + }; + }) => AuthProviderFactory; + resolvers: never; +}>; // @public export type OAuth2ProxyResult = { @@ -584,10 +445,7 @@ export class OAuthAdapter implements AuthProviderRouteHandlers { static fromConfig( config: AuthProviderConfig, handlers: OAuthHandlers, - options: Pick< - Options, - 'providerId' | 'persistScopes' | 'tokenIssuer' | 'callbackUrl' - >, + options: Pick, ): OAuthAdapter; // (undocumented) logout(req: express.Request, res: express.Response): Promise; @@ -697,38 +555,66 @@ export type OAuthState = { scope?: string; }; +// @public +export const oidc: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; + // @public export type OidcAuthResult = { tokenset: TokenSet; userinfo: UserinfoResponse; }; -// @public @deprecated (undocumented) -export type OidcProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; +// @public +export const okta: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: Readonly<{ + emailLocalPartMatchingUserEntityName: () => SignInResolver; + emailMatchingUserEntityProfileEmail: () => SignInResolver; + emailMatchingUserEntityAnnotation(): SignInResolver; + }>; +}>; -// @public @deprecated (undocumented) -export const oktaEmailSignInResolver: SignInResolver; - -// @public @deprecated (undocumented) -export type OktaProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; - -// @public @deprecated (undocumented) -export type OneLoginProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; +// @public +export const onelogin: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: never; +}>; // Warning: (ae-missing-release-tag) "postMessageResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1011,22 +897,30 @@ export interface RouterOptions { tokenManager: TokenManager; } +// @public +export const saml: Readonly<{ + create: ( + options?: + | { + authHandler?: AuthHandler | undefined; + signIn?: + | { + resolver: SignInResolver; + } + | undefined; + } + | undefined, + ) => AuthProviderFactory; + resolvers: Readonly<{ + nameIdMatchingUserEntityName(): SignInResolver; + }>; +}>; + // @public (undocumented) export type SamlAuthResult = { fullProfile: any; }; -// @public @deprecated (undocumented) -export const samlNameIdEntityNameSignInResolver: SignInResolver; - -// @public @deprecated (undocumented) -export type SamlProviderOptions = { - authHandler?: AuthHandler; - signIn?: { - resolver: SignInResolver; - }; -}; - // @public export type SignInInfo = { profile: ProfileInfo; @@ -1044,14 +938,6 @@ export type StateEncoder = (req: OAuthStartRequest) => Promise<{ encodedState: string; }>; -// @public @deprecated -export type TokenIssuer = { - issueToken(params: TokenParams): Promise; - listPublicKeys(): Promise<{ - keys: AnyJWK[]; - }>; -}; - // @public export type TokenParams = { claims: { @@ -1077,8 +963,4 @@ export type WebMessageResponse = type: 'authorization_response'; error: Error; }; - -// Warnings were encountered during analysis: -// -// src/identity/types.d.ts:38:9 - (ae-forgotten-export) The symbol "AnyJWK" needs to be exported by the entry point index.d.ts ``` From 4d74ec0b22b89228541b787ce397104aedfa6db7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 12:44:24 +0200 Subject: [PATCH 185/590] auth-backend: remove direct provider exports Signed-off-by: Patrik Oldsberg --- plugins/auth-backend/api-report.md | 263 ------------------ .../src/providers/atlassian/index.ts | 3 +- .../src/providers/atlassian/provider.ts | 1 + plugins/auth-backend/src/providers/index.ts | 26 +- 4 files changed, 13 insertions(+), 280 deletions(-) diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md index 136f9a664d..9e567cc6ab 100644 --- a/plugins/auth-backend/api-report.md +++ b/plugins/auth-backend/api-report.md @@ -23,25 +23,6 @@ import { TokenSet } from 'openid-client'; import { UserEntity } from '@backstage/catalog-model'; import { UserinfoResponse } from 'openid-client'; -// @public -export const atlassian: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - -// Warning: (ae-missing-release-tag) "AtlassianAuthProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public @deprecated (undocumented) export class AtlassianAuthProvider implements OAuthHandlers { // Warning: (ae-forgotten-export) The symbol "AtlassianAuthProviderOptions" needs to be exported by the entry point index.d.ts @@ -62,23 +43,6 @@ export class AtlassianAuthProvider implements OAuthHandlers { start(req: OAuthStartRequest): Promise; } -// @public -export const auth0: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - // @public export type AuthHandler = ( input: TAuthResult, @@ -157,21 +121,6 @@ export type AuthResponse = { backstageIdentity?: BackstageIdentityResponse; }; -// @public -export const awsAlb: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn: { - resolver: SignInResolver; - }; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - // @public (undocumented) export type AwsAlbResult = { fullProfile: Profile; @@ -179,26 +128,6 @@ export type AwsAlbResult = { accessToken: string; }; -// @public -export const bitbucket: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: Readonly<{ - usernameMatchingUserEntityAnnotation(): SignInResolver; - userIdMatchingUserEntityAnnotation(): SignInResolver; - }>; -}>; - // Warning: (ae-missing-release-tag) "BitbucketOAuthResult" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -277,17 +206,6 @@ export const encodeState: (state: OAuthState) => string; // @public (undocumented) export const ensuresXRequestedWith: (req: express.Request) => boolean; -// @public -export const gcpIap: Readonly<{ - create: (options: { - authHandler?: AuthHandler | undefined; - signIn: { - resolver: SignInResolver; - }; - }) => AuthProviderFactory; - resolvers: never; -}>; - // @public export type GcpIapResult = { iapToken: GcpIapTokenInfo; @@ -303,26 +221,6 @@ export type GcpIapTokenInfo = { // @public export function getDefaultOwnershipEntityRefs(entity: Entity): string[]; -// @public -export const github: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - stateEncoder?: StateEncoder | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: Readonly<{ - usernameMatchingUserEntityName: () => SignInResolver; - }>; -}>; - // Warning: (ae-missing-release-tag) "GithubOAuthResult" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -337,93 +235,6 @@ export type GithubOAuthResult = { refreshToken?: string; }; -// @public -export const gitlab: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - -// @public -export const google: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: Readonly<{ - emailLocalPartMatchingUserEntityName: () => SignInResolver; - emailMatchingUserEntityProfileEmail: () => SignInResolver; - emailMatchingUserEntityAnnotation(): SignInResolver; - }>; -}>; - -// @public -export const microsoft: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: Readonly<{ - emailLocalPartMatchingUserEntityName: () => SignInResolver; - emailMatchingUserEntityProfileEmail: () => SignInResolver; - emailMatchingUserEntityAnnotation(): SignInResolver; - }>; -}>; - -// @public -export const oauth2: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - -// @public -export const oauth2Proxy: Readonly<{ - create: (options: { - authHandler?: AuthHandler> | undefined; - signIn: { - resolver: SignInResolver>; - }; - }) => AuthProviderFactory; - resolvers: never; -}>; - // @public export type OAuth2ProxyResult = { fullProfile: JWTPayload; @@ -555,67 +366,12 @@ export type OAuthState = { scope?: string; }; -// @public -export const oidc: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - // @public export type OidcAuthResult = { tokenset: TokenSet; userinfo: UserinfoResponse; }; -// @public -export const okta: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: Readonly<{ - emailLocalPartMatchingUserEntityName: () => SignInResolver; - emailMatchingUserEntityProfileEmail: () => SignInResolver; - emailMatchingUserEntityAnnotation(): SignInResolver; - }>; -}>; - -// @public -export const onelogin: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: never; -}>; - // Warning: (ae-missing-release-tag) "postMessageResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -897,25 +653,6 @@ export interface RouterOptions { tokenManager: TokenManager; } -// @public -export const saml: Readonly<{ - create: ( - options?: - | { - authHandler?: AuthHandler | undefined; - signIn?: - | { - resolver: SignInResolver; - } - | undefined; - } - | undefined, - ) => AuthProviderFactory; - resolvers: Readonly<{ - nameIdMatchingUserEntityName(): SignInResolver; - }>; -}>; - // @public (undocumented) export type SamlAuthResult = { fullProfile: any; diff --git a/plugins/auth-backend/src/providers/atlassian/index.ts b/plugins/auth-backend/src/providers/atlassian/index.ts index dc6ce77166..8dff0197a3 100644 --- a/plugins/auth-backend/src/providers/atlassian/index.ts +++ b/plugins/auth-backend/src/providers/atlassian/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { atlassian } from './provider'; -export type { AtlassianAuthProvider } from './provider'; +export { atlassian, AtlassianAuthProvider } from './provider'; diff --git a/plugins/auth-backend/src/providers/atlassian/provider.ts b/plugins/auth-backend/src/providers/atlassian/provider.ts index 82feef5369..b693d226a2 100644 --- a/plugins/auth-backend/src/providers/atlassian/provider.ts +++ b/plugins/auth-backend/src/providers/atlassian/provider.ts @@ -59,6 +59,7 @@ export const atlassianDefaultAuthHandler: AuthHandler = async ({ }); /** + * @public * @deprecated This export is deprecated and will be removed in the future. */ export class AtlassianAuthProvider implements OAuthHandlers { diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts index 778783994f..de410a9407 100644 --- a/plugins/auth-backend/src/providers/index.ts +++ b/plugins/auth-backend/src/providers/index.ts @@ -14,21 +14,17 @@ * limitations under the License. */ -export * from './atlassian'; -export * from './auth0'; -export * from './aws-alb'; -export * from './bitbucket'; -export * from './github'; -export * from './gitlab'; -export * from './google'; -export * from './microsoft'; -export * from './oauth2'; -export * from './oauth2-proxy'; -export * from './oidc'; -export * from './okta'; -export * from './onelogin'; -export * from './saml'; -export * from './gcp-iap'; +export { AtlassianAuthProvider } from './atlassian'; +export type { AwsAlbResult } from './aws-alb'; +export type { + BitbucketOAuthResult, + BitbucketPassportProfile, +} from './bitbucket'; +export type { GithubOAuthResult } from './github'; +export type { OAuth2ProxyResult } from './oauth2-proxy'; +export type { OidcAuthResult } from './oidc'; +export type { SamlAuthResult } from './saml'; +export type { GcpIapResult, GcpIapTokenInfo } from './gcp-iap'; export { providers, defaultAuthProviderFactories } from './providers'; From 9d4040777e760639c307d979b75022699d8e615a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 17:40:02 +0200 Subject: [PATCH 186/590] changesets: add changeset for auth backend removals Signed-off-by: Patrik Oldsberg --- .changeset/popular-pots-yell.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .changeset/popular-pots-yell.md diff --git a/.changeset/popular-pots-yell.md b/.changeset/popular-pots-yell.md new file mode 100644 index 0000000000..f0decc9fb8 --- /dev/null +++ b/.changeset/popular-pots-yell.md @@ -0,0 +1,11 @@ +--- +'@backstage/plugin-auth-backend': minor +--- + +**BREAKING**: Removed all directly exported auth provider factories, option types, and sign-in resolvers. For example: `AwsAlbProviderOptions`, `bitbucketUserIdSignInResolver`, `createGithubProvider`. These are all still accessible via the `providers` export. For example, use `providers.github.create()` rather than `createGithubProvider()`, and `providers.bitbucket.resolvers.userIdMatchingUserEntityAnnotation()` rather than `bitbucketUserIdSignInResolver`. + +**BREAKING**: Removed the exported `AuthProviderFactoryOptions` type as well as the deprecated option fields of the `AuthProviderFactory` callback. This includes the `tokenManager`, `tokenIssuer`, `discovery`, and `catalogApi` fields. Existing usage of these should be replaced with the new utilities in the `resolverContext` field. The deprecated `TokenIssuer` type is now also removed, since it is no longer used. + +**BREAKING**: Removed `getEntityClaims`, use `getDefaultOwnershipEntityRefs` instead. + +**DEPRECATION**: Deprecated `AtlassianAuthProvider` as it was unintentionally exported. From 3faed18fd31d512218d09866e74c154631209116 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 17 Jun 2022 18:02:48 +0200 Subject: [PATCH 187/590] docs: update auth providers usage Signed-off-by: Patrik Oldsberg --- contrib/docs/tutorials/aws-alb-aad-oidc-auth.md | 7 ++----- docs/auth/bitbucket/provider.md | 12 +++++------- docs/auth/identity-resolver.md | 2 +- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md index 2b3e02c18b..3cedf5634b 100644 --- a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md +++ b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md @@ -122,10 +122,7 @@ When using ALB auth you can configure it as described [here](https://backstage.i - replace the content of `packages/backend/plugin/auth.ts` with the below and tweak it according to your needs. ```ts -import { - createRouter, - createAwsAlbProvider, -} from '@backstage/plugin-auth-backend'; +import { createRouter, providers } from '@backstage/plugin-auth-backend'; import { DEFAULT_NAMESPACE, stringifyEntityRef, @@ -145,7 +142,7 @@ export default async function createPlugin({ database, discovery, providerFactories: { - awsalb: createAwsAlbProvider({ + awsalb: providers.awsAlb.create({ authHandler: async ({ fullProfile }) => { let email: string | undefined = undefined; if (fullProfile.emails && fullProfile.emails.length > 0) { diff --git a/docs/auth/bitbucket/provider.md b/docs/auth/bitbucket/provider.md index c54fb75ffa..36859dab45 100644 --- a/docs/auth/bitbucket/provider.md +++ b/docs/auth/bitbucket/provider.md @@ -57,7 +57,7 @@ In order to use the Bitbucket provider for sign-in, you must configure it with a `signIn.resolver`. See the [Sign-In Resolver documentation](../identity-resolver.md) for more details on how this is done. Note that for the Bitbucket provider, you'll want to use -`bitbucket` as the provider ID, and `createBitbucketProvider` for the provider +`bitbucket` as the provider ID, and `providers.bitbucket.create` for the provider factory. The `@backstage/plugin-auth-backend` plugin also comes with two built-in @@ -74,16 +74,14 @@ same way, but uses the Bitbucket user ID instead, and matches on the The following is an example of how to use one of the built-in resolvers: ```ts -import { - createBitbucketProvider, - bitbucketUsernameSignInResolver, -} from '@backstage/plugin-auth-backend'; +import { providers } from '@backstage/plugin-auth-backend'; // ... providerFactories: { - bitbucket: createBitbucketProvider({ + bitbucket: providers.bitbucket.create({ signIn: { - resolver: bitbucketUsernameSignInResolver, + resolver: + providers.bitbucket.resolvers.usernameMatchingUserEntityAnnotation(), }, }), }, diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md index b314954105..c6d4ae2a89 100644 --- a/docs/auth/identity-resolver.md +++ b/docs/auth/identity-resolver.md @@ -304,7 +304,7 @@ export default async function createPlugin( return await createRouter({ ... providerFactories: { - google: createGoogleProvider({ + google: providers.google.create({ authHandler: async ({ fullProfile // Type: passport.Profile, idToken // Type: (Optional) string, From b13f84f3e1c1c4e694bd138c15de5c8fb5adaf92 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 13:21:03 +0000 Subject: [PATCH 188/590] chore(deps): update dependency esbuild to v0.14.46 Signed-off-by: Renovate Bot --- yarn.lock | 206 +++++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/yarn.lock b/yarn.lock index ccbfb88be7..778c534858 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11756,75 +11756,75 @@ es6-error@^4.1.1: resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild-android-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.45.tgz#696f078d97a1350ceea5db626b3bc4a60fc13555" - integrity sha512-krVmwL2uXQN1A+Ci4u2MR+Y0IAvQK0u3no5TsgguHVhTy138szjuohScCGjkpvLCpGLk7P4kFP1LKuntvJ0d4A== +esbuild-android-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.46.tgz#98d019853ca7b526d0d645bb4618fda425b74d35" + integrity sha512-ZyJqwAcjNbZprs0ZAxnUAOhEhdE5kTKwz+CZuLmZYNLAPyRgBtaC8pT2PCuPifNvV8Cl3yLlrQPaOCjovoyb5g== -esbuild-android-arm64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.45.tgz#d229da8040cea4a0041756d1abcea375b4e3f9db" - integrity sha512-62POGdzAjM+XOXEM5MmFW6k9Pjdjg1hTrXKKBbPE700LFF36B+1Jv9QkskT5UadbTk4cdH9BQ7bGiRPYY0p/Dw== +esbuild-android-arm64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.46.tgz#19835d5265b57120c14fba56a19fc317ca4bbda0" + integrity sha512-BKcnUksvCijO9ONv6b4SikZE/OZftwJvX91XROODZGQmuwGVg97jmLDVu3lxuHdFlMNNzxh8taJ2mbCWZzH/Iw== -esbuild-darwin-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.45.tgz#d7d38d91e4c03890d58c297131e9b82895a37a6a" - integrity sha512-dbkVUAnGx5IeZesWnIhnvxy7dSvgUQvfy0TVLzd9XVP3oI/VsKs8UNsfPrxI5HiN4SINv7oPAbxWceMpB7IqNA== +esbuild-darwin-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.46.tgz#2819465ab92f6df407e6462d9e56f6563a043a44" + integrity sha512-/ss2kO92sUJ9/1nHnMb3+oab8w6dyqKrMtPMvSYJ9KZIYGAZxz/WYxfFprY7Xk+ZxWnnlASSyZlG+If1nVmFYg== -esbuild-darwin-arm64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.45.tgz#d4df2871b94351d7d5561e41f91aadba46857838" - integrity sha512-O6Bz7nnOae5rvbh2Ueo8ibSr7+/eLjsbPdgeMsAZri+LkOa7nsVPnhmocpO3Hy/LWfagTtHy1O9HRPIaArPmTg== +esbuild-darwin-arm64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.46.tgz#2d523fa628930bba38a4f75cede75d6341bc3b5b" + integrity sha512-WX0JOaEFf6t+rIjXO6THsf/0fhQAt2Zb0/PSYlvXnuQQAmOmFAfPsuRNocp5ME0NGaUqZd4FxqqmLEVK3RzPAg== -esbuild-freebsd-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.45.tgz#e90106a2db3f5b0771392d3f9d8801b3138825c6" - integrity sha512-y1X2nr3XSWnDC7MRcy21EVAT0TiCtdefOntJ+SQcZnPBTURzX77f99S8lDF2KswukChkiacpd2Wd4VZieo7w7Q== +esbuild-freebsd-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.46.tgz#dbfbbb1cb943149aaa83b9e767ded6f14ad42ba5" + integrity sha512-o+ozPFuHRCAGCVWU2bLurOUgVkT0jcPEu082VBUY2Q/yLf+B+/3nXzh4Fjp5O21tOvJRTn7hUVydG9j5+vYE6A== -esbuild-freebsd-arm64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.45.tgz#e734c8ae8042cd9224406d45d6992261382bcbde" - integrity sha512-r3ZNejkx1BKXQ6sYOP6C5rTwgiUajyAh03wygLWZtl+SLyygvAnu+OouqtveesufjBDgujp4wZXP/n8PVqXkqg== +esbuild-freebsd-arm64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.46.tgz#fb066d6e7de2bd96138dd1c2fba5e8ce5233ed5a" + integrity sha512-9zicZ0X43WDKz3sjNfcqYO38xbfJpSWYXB+FxvYYkmBwGA52K0SAu4oKuTTLi8od8X2IIo1x5C5TUNvKDSVJww== -esbuild-linux-32@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.45.tgz#0f814a784c941bfd5a5dca7ff742b57744c5324b" - integrity sha512-Qk9cCO3PJig/Y+SdslN/Th4pbAjgaH9oUjVH28eMsLTPf6QDUuK6EED91jepJdR3vxhcnVjyl6JqtOWmP+uxCg== +esbuild-linux-32@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.46.tgz#ea2464b10fe188ee7c9be81a2757e2d69ffdb8c1" + integrity sha512-ZnTpZMVb0VGvL99R5eh4OrJwbUyvpM6M88VAMuHP4LvFjuvZrhgefjKqEGuWZZW7JRnAjKqjXLjWdhdSjwMFnQ== -esbuild-linux-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.45.tgz#2028a6dfb3fea7a5dd5e87cf00d02a36a3373e3c" - integrity sha512-IybO2ugqvc/Zzn1Kih3x0FVjYAy3GTCwhtcp91dbdqk3wPqxYCzObYspa8ca0s+OovI0Cnb+rhXrUtq8gBqlqw== +esbuild-linux-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.46.tgz#f4f2d181af6ea78137311712fca423f8fa954314" + integrity sha512-ECCRRZtX6l4ubeVhHhiVoK/uYAkvzNqfmR4gP4N/9H9RPu+b8YCcN4bQGp7xCuYIV6Xd41WpOMyO+xpcQvjtQQ== -esbuild-linux-arm64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.45.tgz#6fef4165583215918d45150148ac0a18d5ef6323" - integrity sha512-UNEyuHTwztrkEU/+mWIxGzKrYBo2cEtjYAZQVZB1kliANKgRITktg2miaO/b/VtNe84ob1aXSvW8XOPEn5RTGQ== +esbuild-linux-arm64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.46.tgz#113d17c523dfe80c9d4981d05c58f5ada3470e30" + integrity sha512-HX0TXCHyI0NEWG4jg8LlW1PbZQbnz+PUH56yjx996cgM5pC90u32drKs/tyJiyyQmNk9OXOogjKw7LEdp/Qc1w== -esbuild-linux-arm@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.45.tgz#e454f701ae5371322c8265f4356e098611e51f96" - integrity sha512-qKWJ4A4TAcxXV2TBLPw3Av5X2SYNfyNnBHNJTQJ5VuevK6Aq5i6XEMvUgdlcVuZ9MYPfS5aJZWglzDzJMf1Lpw== +esbuild-linux-arm@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.46.tgz#1b6ba77b0301572b2fed35fe922b1613b10b5c7e" + integrity sha512-RvTJEi4vj13c5FP9YPp+8Y6x6HK1E7uSqfy3y9UoeaNAzNZWA7fN1U3hQjTL/dy5zTJH5KE64mrt5k5+he+CQA== -esbuild-linux-mips64le@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.45.tgz#093cc86be71f9b0cd2876da23ee2f5d35b09a247" - integrity sha512-s/jcfw3Vpku5dIVSFVY7idJsGdIpIJ88IrkyprVgCG2yBeXatb67B7yIt0E1tL+OHrJJdNBw6GikCiMPAAu1VA== +esbuild-linux-mips64le@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.46.tgz#8775e12510eaf988a9bc5e6787cf0c87c3eb40d6" + integrity sha512-jnb2NDwGqJUVmxn1v0f7seNdDm0nRNWHP9Z3MrWAGnBCdnnDlsjqRFDnbKoaQvWONEa+rOOr/giK+VL0hgQExA== -esbuild-linux-ppc64le@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.45.tgz#8bddbf67157027e917b6e5b04230d7cf14d62cf2" - integrity sha512-lJItl6ESZnhSx951U9R7MTBopgwIELHlQzC6SBR023V5JC1rPRFDZ/UEBsV+7BFcCAfqlyb+odGEAmcBSf4XCA== +esbuild-linux-ppc64le@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.46.tgz#da003df59859b02e160827e26bc1e107bec23d07" + integrity sha512-uu3JTQUrwwauKY9z8yq5MnDyOlT3f2DNOzBcYz4dB78HqwEqilCsifoBGd0WcbED5n57dc59X+LZMTZ8Ose44w== -esbuild-linux-riscv64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.45.tgz#0f234f63595159cfc976fd5310e7902e8b5a7ad7" - integrity sha512-8anMu+QLl9MununVCGJN2I/JvUWPm1EVsBBLq/J+Nz4hr8t6QOCuEp0HRaeMohyl2XiMFBchVu0mwa05rF7GFQ== +esbuild-linux-riscv64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.46.tgz#b6c4faf9f8482e2a898ec2becac4a6789ae3ff22" + integrity sha512-OB29r1EG44ZY34JnXCRERxo7k4pRKoQdaoRg2HIeCavatsXZwW4LCakpLnMQ72vXT1HtpBUABEjHkKkn5JyrUg== -esbuild-linux-s390x@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.45.tgz#272288e0f30e4fa0f01d6df6572602c7df78c256" - integrity sha512-1TPeNvNCoahMw745KNTA6POKaFfSqQrBb3fdOL82GXZqyKU/6rHNwGP0NgHe88bAUMp3QZfjGfCGKxfBHL77RQ== +esbuild-linux-s390x@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.46.tgz#d30d0f7ee8466c4ec99ac2c689b70514320406b2" + integrity sha512-XQ/U9TueMSGYyPTKyZsJVraiuvxhwCDIMn/QwFXCRCJ6H/Cy/Rq33u9qhpeSziinHKfzJROGx5A8mQY6aYamdQ== esbuild-loader@^2.18.0: version "2.19.0" @@ -11838,61 +11838,61 @@ esbuild-loader@^2.18.0: tapable "^2.2.0" webpack-sources "^2.2.0" -esbuild-netbsd-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.45.tgz#0f9af25773e025cd1ca5e22277661cb15d36b406" - integrity sha512-55f2eZ8EQhhOZosqX0mApgRoI9PrVyXlHd9Uivk+B0B4WTKUgzkoHaVk4EkIUtNRQTpDWPciTlpb/C2tUYVejA== +esbuild-netbsd-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.46.tgz#fcf2b739b63731b5b264dc584240c0b61dbbf035" + integrity sha512-i15BwqHaAIFp1vBJkitAbHtwXcLk9TdHs/Ia1xGIAutQYXSJNPLM3Z4B4hyfHNEFl2yBqBIYpglMohv2ClNdOQ== -esbuild-openbsd-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.45.tgz#6d47a564eb4b80d9e3aeb4493918b36d17440228" - integrity sha512-Z5sNcT3oN9eryMW3mGn5HAgg7XCxiUS4isqH1tZXpsdOdOESbgbTEP0mBEJU0WU7Vt2gIN5XMbAp7Oigm0k71g== +esbuild-openbsd-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.46.tgz#fc7880751b78b325216e66470b9a3df7b1c21cbf" + integrity sha512-XwOIFCE140Y/PvjrwjFfa/QLWBuvhR1mPCOa35mKx02jt++wPNgf0qhn6HfdVC3vQe7R46RwTp4q2cp99fepEg== -esbuild-sunos-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.45.tgz#cca97d7d31214bddfa1970386883d1f3f2868cec" - integrity sha512-WmWu4wAm8mIxxK9aWFCj5VHunY3BHQDT3dAPexMLLszPyMF7RDtUYf+Dash9tjyitvnoxPAvR7DpWpirDLQIlQ== +esbuild-sunos-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.46.tgz#ab73b91e79ae53dddb035da9bb69ba7dd44d36ee" + integrity sha512-+kV3JnmfdxBVpHyFvuGXWtu6tXxXApOLPkSrVkMJf6+ns/3PLtPndpzwCzHjD+qYUEk8ln4MA+ufQ2qmjW5mZg== -esbuild-windows-32@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.45.tgz#afd98449fd6a741a4655e3e4f0e5ae7081765baf" - integrity sha512-DPPehKwPJFBoSG+jILc/vcJNN8pTwz1m6FWojxqtqPhgw8OabTgN4vL7gNMqL/FSeDxF+zyvZeeMrZFYF1d81Q== +esbuild-windows-32@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.46.tgz#88ad388c896325d273e92dbf28f146d1d34d4351" + integrity sha512-gzGC1Q11B/Bo5A2EX4N22oigWmhL7Z0eDyc8kbSoJjqSrGQuRE7B0uMpluO+q0O/gZ1S3zdw+M4PCWlqOIeXLA== -esbuild-windows-64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.45.tgz#5d284b712b119c6306ac5f32e2a611ac6eec2842" - integrity sha512-t6bxFZcp9bLmSs+1pCNL/BW2bq3QEQHxU4HoiMEyWfF8QBU8iNXFI1iLGdyCzB1Ue2739h55tpOvojFrfyNPWA== +esbuild-windows-64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.46.tgz#bfb21b68d54d0db86190f8073cbf66a86bd0de14" + integrity sha512-Do2daaskfOjmCB7o3ygz6fD3K6SPjZLERiZLktzHz2oUCwsebKu/gmop0+j/XdrVIXC32wFzHzDS+9CTu9OShw== -esbuild-windows-arm64@0.14.45: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.45.tgz#08089d4cc921939ed352d9c2d928b5d867a6dc67" - integrity sha512-DnhrvjECBJ2L0owoznPb4RqQKZ498SM8J+YHqmqzi0Gf/enkUwwTjB8vPCK6dDuFnNU/NE8f94FhKdkBHYruDQ== +esbuild-windows-arm64@0.14.46: + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.46.tgz#b8aa66a0c347342b9ae780b537d5574e9691c123" + integrity sha512-VEzMy6bM60/HT/URTDElyhfi2Pk0quCCrEhRlI4MRno/AIqYUGw0rZwkPl6PeoqVI6BgoBHGY576GWTiPmshCA== esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.39: - version "0.14.45" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.45.tgz#3e3192894f91c32cf19207726f136278be46e968" - integrity sha512-JOxGUD8jcs8xE8DjyGWC8by/vLMCXTJ/wuauWipL5kJRZx1dhpqIntb31QHjA45GZJWaXv7SjC/Zwu1bCkXWtQ== + version "0.14.46" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.46.tgz#d548cfc13fecfd4bc074ce38e0122d1dd9b067db" + integrity sha512-vdm5G1JdZBktva8dwQci/s44VbeBUg8g907xoZx77mqFZ4gU5GlMULNsdGeID+qXCXocsfYSGtE0LvqH3eiNQg== optionalDependencies: - esbuild-android-64 "0.14.45" - esbuild-android-arm64 "0.14.45" - esbuild-darwin-64 "0.14.45" - esbuild-darwin-arm64 "0.14.45" - esbuild-freebsd-64 "0.14.45" - esbuild-freebsd-arm64 "0.14.45" - esbuild-linux-32 "0.14.45" - esbuild-linux-64 "0.14.45" - esbuild-linux-arm "0.14.45" - esbuild-linux-arm64 "0.14.45" - esbuild-linux-mips64le "0.14.45" - esbuild-linux-ppc64le "0.14.45" - esbuild-linux-riscv64 "0.14.45" - esbuild-linux-s390x "0.14.45" - esbuild-netbsd-64 "0.14.45" - esbuild-openbsd-64 "0.14.45" - esbuild-sunos-64 "0.14.45" - esbuild-windows-32 "0.14.45" - esbuild-windows-64 "0.14.45" - esbuild-windows-arm64 "0.14.45" + esbuild-android-64 "0.14.46" + esbuild-android-arm64 "0.14.46" + esbuild-darwin-64 "0.14.46" + esbuild-darwin-arm64 "0.14.46" + esbuild-freebsd-64 "0.14.46" + esbuild-freebsd-arm64 "0.14.46" + esbuild-linux-32 "0.14.46" + esbuild-linux-64 "0.14.46" + esbuild-linux-arm "0.14.46" + esbuild-linux-arm64 "0.14.46" + esbuild-linux-mips64le "0.14.46" + esbuild-linux-ppc64le "0.14.46" + esbuild-linux-riscv64 "0.14.46" + esbuild-linux-s390x "0.14.46" + esbuild-netbsd-64 "0.14.46" + esbuild-openbsd-64 "0.14.46" + esbuild-sunos-64 "0.14.46" + esbuild-windows-32 "0.14.46" + esbuild-windows-64 "0.14.46" + esbuild-windows-arm64 "0.14.46" escalade@^3.1.1: version "3.1.1" From 66c79ff359b2507ddb57ef6b5408e7385d2b7f11 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 20 Jun 2022 15:25:33 +0200 Subject: [PATCH 189/590] auth-backend: avoid marking TokenIssuer as internal Signed-off-by: Patrik Oldsberg --- plugins/auth-backend/src/identity/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/auth-backend/src/identity/types.ts b/plugins/auth-backend/src/identity/types.ts index f0959e90bd..4765b50d7d 100644 --- a/plugins/auth-backend/src/identity/types.ts +++ b/plugins/auth-backend/src/identity/types.ts @@ -39,8 +39,6 @@ export type TokenParams = { /** * A TokenIssuer is able to issue verifiable ID Tokens on demand. - * - * @internal */ export type TokenIssuer = { /** From 18dad948a10a2034959e1eb14b3c41669683e1fb Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Mon, 20 Jun 2022 15:46:06 +0200 Subject: [PATCH 190/590] add custom search error Signed-off-by: Emma Indal --- plugins/search-backend-node/src/errors.ts | 23 +++++++++++++++++++++++ plugins/search-backend-node/src/index.ts | 1 + 2 files changed, 24 insertions(+) create mode 100644 plugins/search-backend-node/src/errors.ts diff --git a/plugins/search-backend-node/src/errors.ts b/plugins/search-backend-node/src/errors.ts new file mode 100644 index 0000000000..c6128f3f2e --- /dev/null +++ b/plugins/search-backend-node/src/errors.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2021 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 { CustomErrorBase } from '@backstage/errors'; + +/** + * Failed to query documents for index that does not exist. + * @public + */ +export class MissingIndexError extends CustomErrorBase {} diff --git a/plugins/search-backend-node/src/index.ts b/plugins/search-backend-node/src/index.ts index d342bb9259..854881829c 100644 --- a/plugins/search-backend-node/src/index.ts +++ b/plugins/search-backend-node/src/index.ts @@ -34,6 +34,7 @@ export type { RegisterCollatorParameters, RegisterDecoratorParameters, } from './types'; +export * from './errors'; export * from './indexing'; export * from './test-utils'; From c30ecd900f75cfc74a48f14f74bc663bd6121f60 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Mon, 20 Jun 2022 15:48:44 +0200 Subject: [PATCH 191/590] ElasticSearch engine throw MissingIndexError if error type is index_not_found_exception Signed-off-by: Emma Indal --- .../src/engines/ElasticSearchSearchEngine.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index 31112e3446..8f321a266c 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -26,6 +26,7 @@ import { SearchEngine, SearchQuery, } from '@backstage/plugin-search-common'; +import { MissingIndexError } from '@backstage/plugin-search-backend-node'; import { Client } from '@elastic/elasticsearch'; import esb from 'elastic-builder'; import { isEmpty, isNaN as nan, isNumber } from 'lodash'; @@ -362,6 +363,9 @@ export class ElasticSearchSearchEngine implements SearchEngine { previousPageCursor, }; } catch (e) { + if (e.meta.body.error.type === 'index_not_found_exception') { + throw new MissingIndexError(`Missing index for ${queryIndices}`, e); + } this.logger.error( `Failed to query documents for indices ${queryIndices}`, e, From 3830cc6e521fc129771d630ad179c26154100d56 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:10:32 +0000 Subject: [PATCH 192/590] fix(deps): update dependency rollup to v2.75.7 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a4cb216837..0fbd49a0f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22544,9 +22544,9 @@ rollup@^0.63.4: "@types/node" "*" rollup@^2.60.2: - version "2.75.6" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz#ac4dc8600f95942a0180f61c7c9d6200e374b439" - integrity sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA== + version "2.75.7" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz#221ff11887ae271e37dcc649ba32ce1590aaa0b9" + integrity sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ== optionalDependencies: fsevents "~2.3.2" From 4d1e94f1ec2e6852f2b752495efe29b365566188 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:11:25 +0000 Subject: [PATCH 193/590] fix(deps): update apollo graphql packages to v3.9.0 Signed-off-by: Renovate Bot --- yarn.lock | 106 +++++++++++++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/yarn.lock b/yarn.lock index a4cb216837..55f88ef402 100644 --- a/yarn.lock +++ b/yarn.lock @@ -49,6 +49,14 @@ resolved "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== +"@apollo/utils.keyvaluecache@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz#46f310f859067efe9fa126156c6954f8381080d2" + integrity sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA== + dependencies: + "@apollo/utils.logger" "^1.0.0" + lru-cache "^7.10.1" + "@apollo/utils.logger@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-1.0.0.tgz#6e3460a2250c2ef7c2c3b0be6b5e148a1596f12b" @@ -5964,7 +5972,7 @@ resolved "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5" integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.17.28", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.5": +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.5": version "4.17.28" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== @@ -5973,6 +5981,15 @@ "@types/qs" "*" "@types/range-parser" "*" +"@types/express-serve-static-core@4.17.29": + version "4.17.29" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" + integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/express-session@^1.17.2": version "1.17.4" resolved "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.4.tgz#97a30a35e853a61bdd26e727453b8ed314d6166b" @@ -7592,12 +7609,12 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-datasource@^3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.1.tgz#a1168dd68371930de3ed4245ad12fa8600efe2cc" - integrity sha512-Z3a8rEUXVPIZ1p8xrFL8bcNhWmhOmovgDArvwIwmJOBnh093ZpRfO+ESJEDAN4KswmyzCLDAwjsW4zQOONdRUw== +apollo-datasource@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" + integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== dependencies: - apollo-server-caching "^3.3.0" + "@apollo/utils.keyvaluecache" "^1.0.1" apollo-server-env "^4.2.1" apollo-reporting-protobuf@^3.3.1: @@ -7607,18 +7624,12 @@ apollo-reporting-protobuf@^3.3.1: dependencies: "@apollo/protobufjs" "1.2.2" -apollo-server-caching@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz#f501cbeb820a4201d98c2b768c085f22848d9dc5" - integrity sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ== - dependencies: - lru-cache "^6.0.0" - -apollo-server-core@^3.8.2: - version "3.8.2" - resolved "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.8.2.tgz#a065e00220d6c709b11b824197520adee6d897d2" - integrity sha512-cbzG928HG27W+juMVCIL1O//iyAj/Q2hnOu6YwrGrcqeE75ZIJSgSBm/gPHK20cI7nEjK2IWACx8Hj1nGAQ5Zg== +apollo-server-core@^3.9.0: + version "3.9.0" + resolved "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.9.0.tgz#44b39e378314cfc0596be7003d3f1f1397c88eea" + integrity sha512-WS54C33cTriDaBIcj7ijWv/fgeJICcrQKlP1Cn6pnZp/eumpMraezLeJ3gFWAXprOuR2E3fZe64lNlup0fMu8w== dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" "@apollo/utils.logger" "^1.0.0" "@apollo/utils.usagereporting" "^1.0.0" "@apollographql/apollo-tools" "^0.5.3" @@ -7626,13 +7637,12 @@ apollo-server-core@^3.8.2: "@graphql-tools/mock" "^8.1.2" "@graphql-tools/schema" "^8.0.0" "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.3.1" + apollo-datasource "^3.3.2" apollo-reporting-protobuf "^3.3.1" - apollo-server-caching "^3.3.0" apollo-server-env "^4.2.1" apollo-server-errors "^3.3.1" - apollo-server-plugin-base "^3.6.0" - apollo-server-types "^3.6.0" + apollo-server-plugin-base "^3.6.1" + apollo-server-types "^3.6.1" async-retry "^1.2.1" fast-json-stable-stringify "^2.1.0" graphql-tag "^2.11.0" @@ -7654,48 +7664,48 @@ apollo-server-errors@^3.3.1: resolved "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== -apollo-server-express@^3.0.0, apollo-server-express@^3.8.2: - version "3.8.2" - resolved "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.8.2.tgz#51285279f8a52eb7d88a4f4145261b6f69b12ba6" - integrity sha512-UIpjs0qwOGJ0U1IokrtfjgpQVoirr7E1w446mx6B0EqV8sIFgdEE253utxtHi80va37h/xuEIUuAZFRQaY6ClQ== +apollo-server-express@^3.0.0, apollo-server-express@^3.9.0: + version "3.9.0" + resolved "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.9.0.tgz#1ff3b53fe76e4e8be04b8477ea8a3d9586313af1" + integrity sha512-scSeHy9iB7W3OiF3uLQEzad9Jm9tEfDF8ACsJb2P+xX69uqg6zizsrQvj3qRhazCO7FKMcMu9zQFR0hy7zKbUA== dependencies: "@types/accepts" "^1.3.5" "@types/body-parser" "1.19.2" "@types/cors" "2.8.12" "@types/express" "4.17.13" - "@types/express-serve-static-core" "4.17.28" + "@types/express-serve-static-core" "4.17.29" accepts "^1.3.5" - apollo-server-core "^3.8.2" - apollo-server-types "^3.6.0" + apollo-server-core "^3.9.0" + apollo-server-types "^3.6.1" body-parser "^1.19.0" cors "^2.8.5" parseurl "^1.3.3" -apollo-server-plugin-base@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.6.0.tgz#f85e19fa4a33866ef1b4235077397a63a9a7343e" - integrity sha512-GtXhczRGpTLQyFPWeWSnX1VcN2JaaAU7WT8PzoTQuJKYJ/Aj5mPebHbfG+PXQlDmI8IgyCKf7B1HIRnJqvAZbg== +apollo-server-plugin-base@^3.6.1: + version "3.6.1" + resolved "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.6.1.tgz#33e9f26433d5a8b8ed5d27e9fa88de9ef0c2c704" + integrity sha512-bFpxzWO0LTTtSAkGVBeaAtnQXJ5ZCi8eaLN/eMSju8RByifmF3Kr6gAqcOZhOH/geQEt3Y6G8n3bR0eHTGxljQ== dependencies: - apollo-server-types "^3.6.0" + apollo-server-types "^3.6.1" -apollo-server-types@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.6.0.tgz#29fd8369aad99d42f72b760eb12bfe2c888da901" - integrity sha512-zISCkwXvwTHK2AysWSfLAUvDLSDJ0xj8pnfxDv34hqA+G9JqsLbykJdSL1Y1kT53HU4RWF6ymTuTwwOmmBiAWA== +apollo-server-types@^3.6.1: + version "3.6.1" + resolved "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.6.1.tgz#704e5309bd947306030df01f982e36d1d4753eaa" + integrity sha512-XOPlBlRdwP00PrG03OffGGWuzyei+J9t1rAnvyHsSdP0JCgQWigHJfvL1N9Bhgi4UTjl9JadKOJh1znLNlqIFQ== dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" "@apollo/utils.logger" "^1.0.0" apollo-reporting-protobuf "^3.3.1" - apollo-server-caching "^3.3.0" apollo-server-env "^4.2.1" apollo-server@^3.0.0: - version "3.8.2" - resolved "https://registry.npmjs.org/apollo-server/-/apollo-server-3.8.2.tgz#15a9263d56ac3a44a5c186d9aafed90c1c2687da" - integrity sha512-XBWTn9uMLKgob60qOlAphOIpY81dDfF5uonCvO154Qx5TJ6IRqER38StIgEgQLLRcR4RZ40uMvbwofZRHfXecA== + version "3.9.0" + resolved "https://registry.npmjs.org/apollo-server/-/apollo-server-3.9.0.tgz#391b60c4c24d37c65855cccc8aa886e684bc1776" + integrity sha512-g80gXDuK8fl2W0fQF/hEyeoO9AU+sO2gBzeJAYUyGLotYc+oL/Y3mTRk5GB8C7cXUXCg5uvWbUj8va0E5UZE7w== dependencies: "@types/express" "4.17.13" - apollo-server-core "^3.8.2" - apollo-server-express "^3.8.2" + apollo-server-core "^3.9.0" + apollo-server-express "^3.9.0" express "^4.17.1" aproba@^1.0.3: @@ -17434,16 +17444,16 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.10.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.10.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" + integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== + lru-cache@^7.3.1: version "7.3.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.3.1.tgz#7702e80694ec2bf19865567a469f2b081fcf53f5" integrity sha512-nX1x4qUrKqwbIAhv4s9et4FIUVzNOpeY07bsjGUy8gwJrXH/wScImSQqXErmo/b2jZY2r0mohbLA9zVj7u1cNw== -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: - version "7.10.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" - integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== - lunr@^2.3.9: version "2.3.9" resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" From cc2e92c20119f0be96bd8276f1e968f4f5a6c4c2 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 20 Jun 2022 16:12:24 +0200 Subject: [PATCH 194/590] chore: Bump got to version 11.8.5 Signed-off-by: Johan Haals --- yarn.lock | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index a4cb216837..e0c1da48d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13766,7 +13766,7 @@ google-protobuf@^3.15.8, google-protobuf@^3.19.1: resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.20.1.tgz#1b255c2b59bcda7c399df46c65206aa3c7a0ce8b" integrity sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw== -got@11.8.3, got@^11.8.0: +got@11.8.3: version "11.8.3" resolved "https://registry.npmjs.org/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg== @@ -13783,6 +13783,23 @@ got@11.8.3, got@^11.8.0: p-cancelable "^2.0.0" responselike "^2.0.0" +got@^11.8.0: + version "11.8.5" + resolved "https://registry.npmjs.org/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" + integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^9.6.0: version "9.6.0" resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" From 1e28c4336632edf6814e66ee5bb05406c0e8e560 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Mon, 20 Jun 2022 16:24:15 +0200 Subject: [PATCH 195/590] check error, if MissingIndexError return status code 400 with clear error message Signed-off-by: Emma Indal --- plugins/search-backend/src/service/router.ts | 24 ++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/plugins/search-backend/src/service/router.ts b/plugins/search-backend/src/service/router.ts index f54c2d388f..c85b3ed797 100644 --- a/plugins/search-backend/src/service/router.ts +++ b/plugins/search-backend/src/service/router.ts @@ -33,7 +33,10 @@ import { IndexableResultSet, SearchResultSet, } from '@backstage/plugin-search-common'; -import { SearchEngine } from '@backstage/plugin-search-backend-node'; +import { + SearchEngine, + MissingIndexError, +} from '@backstage/plugin-search-backend-node'; import { AuthorizedSearchEngine } from './AuthorizedSearchEngine'; const jsonObjectSchema: z.ZodSchema = z.lazy(() => { @@ -129,7 +132,10 @@ export async function createRouter( const router = Router(); router.get( '/query', - async (req: express.Request, res: express.Response) => { + async ( + req: express.Request, + res: express.Response, + ) => { const parseResult = requestSchema.safeParse(req.query); if (!parseResult.success) { @@ -154,9 +160,19 @@ export async function createRouter( const resultSet = await engine?.query(query, { token }); res.send(filterResultSet(toSearchResults(resultSet))); - } catch (err) { + } catch (error) { + if (error instanceof MissingIndexError) { + res + .status(400) + .send( + `\nNo index found for types: ${ + query.types ? query.types.join(',') : '' + }. This means there are no documents to search through.`, + ); + } + throw new Error( - `There was a problem performing the search query. ${err}`, + `There was a problem performing the search query. ${error}`, ); } }, From 887feaf6e428a765afefa6a6193f170e07436c8d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 15:01:49 +0000 Subject: [PATCH 196/590] fix(deps): update dependency @azure/msal-node to v1.10.0 Signed-off-by: Renovate Bot --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0fbd49a0f6..f800b27e98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -320,17 +320,17 @@ dependencies: debug "^4.1.1" -"@azure/msal-common@^6.4.0": - version "6.4.0" - resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.4.0.tgz#434a55be9639cb5c7910c0cc1a46555ff0bc6c39" - integrity sha512-WZdgq9f9O8cbxGzdRwLLMM5xjmLJ2mdtuzgXeiGxIRkVVlJ9nZ6sWnDFKa2TX8j72UXD1IfL0p/RYNoTXYoGfg== +"@azure/msal-common@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz#f4b52c6d9591cf8720dcb24c1d21fce2d186f871" + integrity sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA== "@azure/msal-node@^1.1.0", "@azure/msal-node@^1.3.0": - version "1.9.1" - resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.9.1.tgz#86f130fa50a5409a0e47a0ba192c7cdec42bd34c" - integrity sha512-chr914ZuKPvKEW1JPNDRhgdrzbA9PkVknV+q01h+eVhFZvHfO0pIFoP4dOU96ZdBkMmdD5kAP1Snv1gAdVXMIg== + version "1.10.0" + resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz#ee3a26201c4899cc6928cc331c31d3568d3cb728" + integrity sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA== dependencies: - "@azure/msal-common" "^6.4.0" + "@azure/msal-common" "^7.0.0" jsonwebtoken "^8.5.1" uuid "^8.3.0" From 29004975bf631d7e848bc4ed9bbc41be481e63b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 15:02:36 +0000 Subject: [PATCH 197/590] fix(deps): update dependency @microsoft/microsoft-graph-types to v2.21.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0fbd49a0f6..c5eb52f5de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4175,9 +4175,9 @@ typescript "~4.6.3" "@microsoft/microsoft-graph-types@^2.6.0": - version "2.20.0" - resolved "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.20.0.tgz#fc532a5dc146c0b8a6f78a633fe930535f8cdc42" - integrity sha512-T1EPoYdH4124Rg+h261dvW2qAeSRAotHM/6lv10fDsYX4DWsppvresmfhGbPrLApK/lRTRj93bn4/Nwwmdv4Zg== + version "2.21.0" + resolved "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.21.0.tgz#3244b41374307f590948e25fb2de8dad2a8a81c9" + integrity sha512-ZbYetXyUqHZliM8exZzF7IPEKVMvR+PaY+P9bjNHpxeiacF3U9+c40YRv0TJHpF6+50GWmJmPD6BsKHVRBZiCA== "@microsoft/tsdoc-config@~0.16.1": version "0.16.1" From 411e8e60819013fbcf847ded2be8d577abf4fc12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Tresarrieu?= Date: Mon, 20 Jun 2022 17:32:29 +0200 Subject: [PATCH 198/590] chore: add custom types for transform function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is to avoid exposing complex types from our internal deps. Signed-off-by: Côme Tresarrieu --- .../MarkdownContent/MarkdownContent.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index 4059482b79..3052aff7d9 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -64,12 +64,23 @@ const useStyles = makeStyles( { name: 'BackstageMarkdownContent' }, ); +type TransformLink = ( + href: string, + // Complex type from internal react-markdown dep library (hast)[./node_modules/@types/hast/index.d.ts] + children: any[], + title: string | null, +) => string; + type Props = { content: string; dialect?: 'gfm' | 'common-mark'; - linkTarget?: Options['linkTarget']; - transformLinkUri?: Options['transformLinkUri']; - transformImageUri?: Options['transformImageUri']; + linkTarget?: React.HTMLAttributeAnchorTarget | TransformLink; + transformLinkUri?: TransformLink; + transformImageUri?: ( + src: string, + alt: string, + title: string | null, + ) => string; }; const components: Options['components'] = { From fccddd80fd865c959a459c9e20375dd4270c855e Mon Sep 17 00:00:00 2001 From: Vladimir Masarik Date: Mon, 20 Jun 2022 17:25:00 +0200 Subject: [PATCH 199/590] docs: fix prettier complaints Signed-off-by: Vladimir Masarik --- docs/features/software-templates/writing-custom-actions.md | 2 +- docs/features/software-templates/writing-templates.md | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index abff0cf7c7..a9e1d297f3 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -137,7 +137,7 @@ export default async function createPlugin( config: env.config, reader: env.reader, }); - + const actions = [...builtInActions, createNewFileAction()]; return createRouter({ diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 3173a0500a..40b735764c 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -513,14 +513,12 @@ spec: title: URL endpoint type: string description: URL endpoint at which the component can be reached - default: "https://www.example.com" + default: 'https://www.example.com' enabledDB: title: Enable Database type: boolean default: false - -... - + ... steps: - id: fetch-base name: Fetch Base From dfff843da20830255255c80333a7e5fc4b141a9e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 16:01:15 +0000 Subject: [PATCH 200/590] chore(deps): update dependency @types/express-serve-static-core to v4.17.29 Signed-off-by: Renovate Bot --- yarn.lock | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5c3f7e7b0..6e3c54533a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5972,16 +5972,7 @@ resolved "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5" integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.5": - version "4.17.28" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express-serve-static-core@4.17.29": +"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.17.29", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.5": version "4.17.29" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== From a0462863e556ca232a9611522eef4c4b1548e758 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 16:02:13 +0000 Subject: [PATCH 201/590] fix(deps): update dependency @octokit/webhooks to v9.26.0 Signed-off-by: Renovate Bot --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5c3f7e7b0..c252eec6c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4878,19 +4878,19 @@ resolved "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-2.0.0.tgz#1108b9ea661ca6c81e4a8bfa63a09eb27d5bc2db" integrity sha512-35cfQ4YWlnZnmZKmIxlGPUPLtbkF8lr/A/1Sk1eC0ddLMwQN06dOuLc+dI3YLQS+T+MoNt3DIQ0NynwgKPilig== -"@octokit/webhooks-types@5.7.1": - version "5.7.1" - resolved "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.7.1.tgz#26452dcd72fa77ac85bb188fda2a5980eb292932" - integrity sha512-zabCzfWvvquxDzj1lU7GhJQteACGfGXnHfROJD4A7LKhRjlkaggoSkE5cWQJJ6nW2t/UI51dSFrEA+A4mhqfPw== +"@octokit/webhooks-types@5.8.0": + version "5.8.0" + resolved "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.8.0.tgz#b76d1a3e3ad82cec5680d3c6c3443a620047a6ef" + integrity sha512-8adktjIb76A7viIdayQSFuBEwOzwhDC+9yxZpKNHjfzrlostHCw0/N7JWpWMObfElwvJMk2fY2l1noENCk9wmw== "@octokit/webhooks@^9.0.1", "@octokit/webhooks@^9.14.1": - version "9.25.0" - resolved "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-9.25.0.tgz#f1bd7815af59fb37892b87c86d2cb8625a570e9a" - integrity sha512-pyCraAmxHSnfTMe4K+QnNH/nSCJolCc++J2SAfYBwPFm6gg2WTGxWuegzuHul+Xm71+V9qL2NhIXX48U7MvTIA== + version "9.26.0" + resolved "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-9.26.0.tgz#cf453bb313da3b66f1a90c84464d978e1c625cce" + integrity sha512-foZlsgrTDwAmD5j2Czn6ji10lbWjGDVsUxTIydjG9KTkAWKJrFapXJgO5SbGxRwfPd3OJdhK3nA2YPqVhxLXqA== dependencies: "@octokit/request-error" "^2.0.2" "@octokit/webhooks-methods" "^2.0.0" - "@octokit/webhooks-types" "5.7.1" + "@octokit/webhooks-types" "5.8.0" aggregate-error "^3.1.0" "@open-draft/until@^1.0.3": From 78a2a631f9498e43070bd555567840b06a72619c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 17:09:22 +0000 Subject: [PATCH 202/590] fix(deps): update dependency aws-sdk to v2.1157.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8ff0237204..6334baa237 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8057,9 +8057,9 @@ aws-sdk-mock@^5.2.1: traverse "^0.6.6" aws-sdk@^2.1122.0, aws-sdk@^2.840.0, aws-sdk@^2.948.0: - version "2.1151.0" - resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1151.0.tgz#8fcb41c3b919842a7b4e5c4cd9e124f6439b5b67" - integrity sha512-VvyzXAmWrX+klvwzA+9gSTY7blDnZOTl0UTKrqmFL4K7tOLieGLYTUkpUegcPxCjYgEg7JwvYolYUnUKiHa4oA== + version "2.1157.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1157.0.tgz#d00b5ea932439de38e19435b48a6a2b38aa7c805" + integrity sha512-30t+zhCECib8uaggd0Du8ifab4vtJjgVvNKxHWTpiLa3deTnM+0K7x3pwM99zxw0gLDxAUet/oURaoPJHwk/5Q== dependencies: buffer "4.9.2" events "1.1.1" From 113da5b9bad61ec02884ebdffadf7da4eb481ca7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 17:10:11 +0000 Subject: [PATCH 203/590] fix(deps): update dependency core-js to v3.23.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 8ff0237204..f82a89200b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10069,9 +10069,9 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.10: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.4.1, core-js@^3.6.5: - version "3.22.8" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz#23f860b1fe60797cc4f704d76c93fea8a2f60631" - integrity sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA== + version "3.23.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.23.1.tgz#9f9a9255115f62c512db56d567f636da32ca0b78" + integrity sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" From 79bc3dadfa64b4021c6e88c74c57477fe9a0569e Mon Sep 17 00:00:00 2001 From: apacciaroni Date: Mon, 20 Jun 2022 14:47:45 -0300 Subject: [PATCH 204/590] Added Funding Circle to ADOPTERS Signed-off-by: apacciaroni --- ADOPTERS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 538ae8b11e..10b605a8d4 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -181,5 +181,5 @@ _If you're using Backstage in your organization, please try to add your company | [Polarpoint](https://polarpoint.io/) | [Surj Bains](https://github.com/polarpoint-io) | We are using Backstage as our Developer portal as well as for hosting our DevOps portal for software catalog. | | [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. | | [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group. - - +| [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component. + From 0054d54afa494aa344c8797fe3e0228139d75d96 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 18:08:47 +0000 Subject: [PATCH 205/590] fix(deps): update dependency cronstrue to v2.10.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9363076f63..5431e7d274 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10187,9 +10187,9 @@ cron@^2.0.0: luxon "^1.23.x" cronstrue@^2.2.0: - version "2.9.0" - resolved "https://registry.npmjs.org/cronstrue/-/cronstrue-2.9.0.tgz#f63c376060c8e019d748564d6eb128d6cac76210" - integrity sha512-PZSsUZU7O+R0JdsquKMXlm41tm62oO5fVYoXi6QI/eRAYxgbkPJ/OcLrVxUM+JNRy5yv0QEI84YG1mUjEo4RLA== + version "2.10.0" + resolved "https://registry.npmjs.org/cronstrue/-/cronstrue-2.10.0.tgz#9b57e9acc18eb44ebe9be5dc993753fd7d6d8e56" + integrity sha512-WCCaKuuzjZJl/xTaJiK2KB2lhHqAz+cTAHgSiZQc/pNnF2XUSZX0FBfxAG0qa9CogToNoQw7pEBJExc77QnFBQ== cross-env@^7.0.0: version "7.0.3" From 652cd7744ad2a21eedbe34a3241baa0fc77a608f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 18:09:36 +0000 Subject: [PATCH 206/590] fix(deps): update dependency eslint to v8.18.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9363076f63..49b2188a30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12126,9 +12126,9 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^3.1.1" eslint@^8.6.0: - version "8.17.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" - integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== + version "8.18.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz#78d565d16c993d0b73968c523c0446b13da784fd" + integrity sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA== dependencies: "@eslint/eslintrc" "^1.3.0" "@humanwhocodes/config-array" "^0.9.2" From 626dcdc688e33ee0b1ea6bc0ec40f8b265a6f3b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 19:07:49 +0000 Subject: [PATCH 207/590] fix(deps): update dependency keyv to v4.3.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 8a48471223..84a14a2b9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16660,9 +16660,9 @@ keyv@^3.0.0: json-buffer "3.0.0" keyv@^4.0.0, keyv@^4.0.3: - version "4.3.0" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz#b4352e0e4fe7c94111947d6738a6d3fe7903027c" - integrity sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ== + version "4.3.1" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.3.1.tgz#7970672f137d987945821b1a07b524ce5a4edd27" + integrity sha512-nwP7AQOxFzELXsNq3zCx/oh81zu4DHWwCE6W9RaeHb7OHO0JpmKS8n801ovVQC7PTsZDWtPA5j1QY+/WWtARYg== dependencies: compress-brotli "^1.3.8" json-buffer "3.0.1" From f3bf1051fba99a6768ca3a24ac251ec8135aa1f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 19:08:55 +0000 Subject: [PATCH 208/590] fix(deps): update dependency aws-sdk to v2.1158.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8a48471223..f1e48ae0d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8057,9 +8057,9 @@ aws-sdk-mock@^5.2.1: traverse "^0.6.6" aws-sdk@^2.1122.0, aws-sdk@^2.840.0, aws-sdk@^2.948.0: - version "2.1157.0" - resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1157.0.tgz#d00b5ea932439de38e19435b48a6a2b38aa7c805" - integrity sha512-30t+zhCECib8uaggd0Du8ifab4vtJjgVvNKxHWTpiLa3deTnM+0K7x3pwM99zxw0gLDxAUet/oURaoPJHwk/5Q== + version "2.1158.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1158.0.tgz#924fb6dda1acecb1dc1c8901095cf64d6acdade4" + integrity sha512-uHYzZMGE+b50sWXaLhga4aD1SpB3+DEZclAkg9aYz2pDZlSDTOMh3uJ/ufsMBs7VcDKGS7mQRibCmCbwRGTIlg== dependencies: buffer "4.9.2" events "1.1.1" From 10a2ea28a35dbe0351626ca7e68e11711bed4e66 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 20:10:06 +0000 Subject: [PATCH 209/590] fix(deps): update dependency @google-cloud/container to v4.0.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 139d32e691..b82d3c8041 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2059,9 +2059,9 @@ xcase "^2.0.1" "@google-cloud/container@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@google-cloud/container/-/container-4.0.0.tgz#9bcfe2d404b739844766a91c0dd2b3fc63d014d1" - integrity sha512-nndrAVyZ34I9LykL1DIDONskl/hRmXmvtTbWrcm+Jep6Lm1bCJ0LkgMGg8yLS1tqWrdhIl73+xwcVfiY2dm7ig== + version "4.0.1" + resolved "https://registry.npmjs.org/@google-cloud/container/-/container-4.0.1.tgz#a3206d3030539e09b7beee8f351fad86c77af79d" + integrity sha512-JpsOsdKnCQm1b5aVNnO/2Urdg+qbCLi/srEnTupRj73Pu5wXLHXOCe3vy8Z2GvyCqu7qr89fMREQ4kO4QijnHA== dependencies: google-gax "^3.0.1" From c8b2509afb3af648a3e628dc347013cbb8c6c690 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 20:10:53 +0000 Subject: [PATCH 210/590] fix(deps): update dependency core-js to v3.23.2 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 139d32e691..958a700c27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10069,9 +10069,9 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.10: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.4.1, core-js@^3.6.5: - version "3.23.1" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.23.1.tgz#9f9a9255115f62c512db56d567f636da32ca0b78" - integrity sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w== + version "3.23.2" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.23.2.tgz#e07a60ca8b14dd129cabdc3d2551baf5a01c76f0" + integrity sha512-ELJOWxNrJfOH/WK4VJ3Qd+fOqZuOuDNDJz0xG6Bt4mGg2eO/UT9CljCrbqDGovjLKUrGajEEBcoTOc0w+yBYeQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" From b199c774efba110b044d67e8f0a02d2f45bec1ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 22:29:14 +0000 Subject: [PATCH 211/590] fix(deps): update dependency @roadiehq/backstage-plugin-github-pull-requests to v2.2.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a7821c4c16..1d2789e9a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5078,9 +5078,9 @@ zustand "3.6.9" "@roadiehq/backstage-plugin-github-pull-requests@^2.0.0": - version "2.1.4" - resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-pull-requests/-/backstage-plugin-github-pull-requests-2.1.4.tgz#2b60230a0a6330c9c7d6a8c08492361b12a1b83a" - integrity sha512-H0Nr2MFQ2iiMLve/l3jqe6HMYwKRkeWNPEvPGkAMMtYmtnMTRMrXuYv+5piPzlwXiwss0NedNdwlVcGsY1J/cw== + version "2.2.0" + resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-github-pull-requests/-/backstage-plugin-github-pull-requests-2.2.0.tgz#6c62c965842819bae185f96e1fbd1c26cf64c564" + integrity sha512-UNpfVMEx3WmUqIpIWPvf8uEZzCClff5H2krT/8iS3yaEP1ng9ZfLQPV7JgF8Bvaad37M08mCuvdmurtL6L3xSw== dependencies: "@backstage/catalog-model" "^1.0.0" "@backstage/core-components" "^0.9.0" From 0137c4a57c09fd4b8fa15f3e51321d4ae70627c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 22:30:52 +0000 Subject: [PATCH 212/590] fix(deps): update dependency eslint-plugin-react-hooks to v4.6.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a7821c4c16..1f6bf1d974 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12057,9 +12057,9 @@ eslint-plugin-notice@^0.9.10: metric-lcs "^0.1.2" eslint-plugin-react-hooks@^4.3.0: - version "4.5.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" - integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.28.0: version "7.30.0" From ca2885d5bc05114699ab4d9781cabc1120f98af7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 23:17:08 +0000 Subject: [PATCH 213/590] fix(deps): update dependency express-prom-bundle to v6.5.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1d2789e9a2..95fae6249c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12485,9 +12485,9 @@ expect@^27.5.1: jest-message-util "^27.5.1" express-prom-bundle@^6.3.6: - version "6.4.1" - resolved "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.4.1.tgz#a688050b9e090f6969825c33143106d3e0e5a70e" - integrity sha512-Sg0svLQe/SS5z1tHDTVfZVjNumobiDlXM0jmemt5Dm9K6BX8z9yCwEr93zbko6fNMR4zKav77iPfxUWi6gAjNA== + version "6.5.0" + resolved "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.5.0.tgz#cdf28b29907618cae933ed14d5b727f7404e810b" + integrity sha512-paFAm0FK7TV1Ln6Blh9edDt2mJ4Pk6Py/fjhZDMcoMHENYryBjCpnXDXuCu8NE1kkvp58IrPcAAkNeNqdvZnnw== dependencies: on-finished "^2.3.0" url-value-parser "^2.0.0" From 032f16f5dc29a98033cd135a4314d2accc1a7bea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Jun 2022 23:17:54 +0000 Subject: [PATCH 214/590] fix(deps): update dependency graphql-ws to v5.9.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1d2789e9a2..464890a6f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13896,9 +13896,9 @@ graphql-type-json@^0.3.2: integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== graphql-ws@^5.4.1: - version "5.8.2" - resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.8.2.tgz#800184b1addb20b3010dc06cb70877703a5fff20" - integrity sha512-hYo8kTGzxePFJtMGC7Y4cbypwifMphIJJ7n4TDcVUAfviRwQBnmZAbfZlC+XFwWDUaR7raEDQPxWctpccmE0JQ== + version "5.9.0" + resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.9.0.tgz#1fea3cca4582bbda15bc3a50bf30b539869b826f" + integrity sha512-CXv0l0nI1bgChwl4Rm+BqNOAKwL/C9T2N8RfmTkhQ38YLFdUXCi2WNW4oFp8BJP+t75nCLzjHHgR04sP1oF02w== graphql@^16.0.0, graphql@^16.3.0: version "16.5.0" From 71f102c1b5c33652b6536df1c90a1117d38bce26 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 02:22:25 +0000 Subject: [PATCH 215/590] chore(deps): update dependency esbuild to v0.14.47 Signed-off-by: Renovate Bot --- yarn.lock | 206 +++++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/yarn.lock b/yarn.lock index a2ffb79d08..6cdb59046f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11757,75 +11757,75 @@ es6-error@^4.1.1: resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild-android-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.46.tgz#98d019853ca7b526d0d645bb4618fda425b74d35" - integrity sha512-ZyJqwAcjNbZprs0ZAxnUAOhEhdE5kTKwz+CZuLmZYNLAPyRgBtaC8pT2PCuPifNvV8Cl3yLlrQPaOCjovoyb5g== +esbuild-android-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz#ef95b42c67bcf4268c869153fa3ad1466c4cea6b" + integrity sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g== -esbuild-android-arm64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.46.tgz#19835d5265b57120c14fba56a19fc317ca4bbda0" - integrity sha512-BKcnUksvCijO9ONv6b4SikZE/OZftwJvX91XROODZGQmuwGVg97jmLDVu3lxuHdFlMNNzxh8taJ2mbCWZzH/Iw== +esbuild-android-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz#4ebd7ce9fb250b4695faa3ee46fd3b0754ecd9e6" + integrity sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ== -esbuild-darwin-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.46.tgz#2819465ab92f6df407e6462d9e56f6563a043a44" - integrity sha512-/ss2kO92sUJ9/1nHnMb3+oab8w6dyqKrMtPMvSYJ9KZIYGAZxz/WYxfFprY7Xk+ZxWnnlASSyZlG+If1nVmFYg== +esbuild-darwin-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz#e0da6c244f497192f951807f003f6a423ed23188" + integrity sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA== -esbuild-darwin-arm64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.46.tgz#2d523fa628930bba38a4f75cede75d6341bc3b5b" - integrity sha512-WX0JOaEFf6t+rIjXO6THsf/0fhQAt2Zb0/PSYlvXnuQQAmOmFAfPsuRNocp5ME0NGaUqZd4FxqqmLEVK3RzPAg== +esbuild-darwin-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz#cd40fd49a672fca581ed202834239dfe540a9028" + integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== -esbuild-freebsd-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.46.tgz#dbfbbb1cb943149aaa83b9e767ded6f14ad42ba5" - integrity sha512-o+ozPFuHRCAGCVWU2bLurOUgVkT0jcPEu082VBUY2Q/yLf+B+/3nXzh4Fjp5O21tOvJRTn7hUVydG9j5+vYE6A== +esbuild-freebsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz#8da6a14c095b29c01fc8087a16cb7906debc2d67" + integrity sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ== -esbuild-freebsd-arm64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.46.tgz#fb066d6e7de2bd96138dd1c2fba5e8ce5233ed5a" - integrity sha512-9zicZ0X43WDKz3sjNfcqYO38xbfJpSWYXB+FxvYYkmBwGA52K0SAu4oKuTTLi8od8X2IIo1x5C5TUNvKDSVJww== +esbuild-freebsd-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz#ad31f9c92817ff8f33fd253af7ab5122dc1b83f6" + integrity sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ== -esbuild-linux-32@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.46.tgz#ea2464b10fe188ee7c9be81a2757e2d69ffdb8c1" - integrity sha512-ZnTpZMVb0VGvL99R5eh4OrJwbUyvpM6M88VAMuHP4LvFjuvZrhgefjKqEGuWZZW7JRnAjKqjXLjWdhdSjwMFnQ== +esbuild-linux-32@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz#de085e4db2e692ea30c71208ccc23fdcf5196c58" + integrity sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw== -esbuild-linux-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.46.tgz#f4f2d181af6ea78137311712fca423f8fa954314" - integrity sha512-ECCRRZtX6l4ubeVhHhiVoK/uYAkvzNqfmR4gP4N/9H9RPu+b8YCcN4bQGp7xCuYIV6Xd41WpOMyO+xpcQvjtQQ== +esbuild-linux-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz#2a9321bbccb01f01b04cebfcfccbabeba3658ba1" + integrity sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw== -esbuild-linux-arm64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.46.tgz#113d17c523dfe80c9d4981d05c58f5ada3470e30" - integrity sha512-HX0TXCHyI0NEWG4jg8LlW1PbZQbnz+PUH56yjx996cgM5pC90u32drKs/tyJiyyQmNk9OXOogjKw7LEdp/Qc1w== +esbuild-linux-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz#b9da7b6fc4b0ca7a13363a0c5b7bb927e4bc535a" + integrity sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw== -esbuild-linux-arm@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.46.tgz#1b6ba77b0301572b2fed35fe922b1613b10b5c7e" - integrity sha512-RvTJEi4vj13c5FP9YPp+8Y6x6HK1E7uSqfy3y9UoeaNAzNZWA7fN1U3hQjTL/dy5zTJH5KE64mrt5k5+he+CQA== +esbuild-linux-arm@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz#56fec2a09b9561c337059d4af53625142aded853" + integrity sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA== -esbuild-linux-mips64le@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.46.tgz#8775e12510eaf988a9bc5e6787cf0c87c3eb40d6" - integrity sha512-jnb2NDwGqJUVmxn1v0f7seNdDm0nRNWHP9Z3MrWAGnBCdnnDlsjqRFDnbKoaQvWONEa+rOOr/giK+VL0hgQExA== +esbuild-linux-mips64le@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz#9db21561f8f22ed79ef2aedb7bbef082b46cf823" + integrity sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg== -esbuild-linux-ppc64le@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.46.tgz#da003df59859b02e160827e26bc1e107bec23d07" - integrity sha512-uu3JTQUrwwauKY9z8yq5MnDyOlT3f2DNOzBcYz4dB78HqwEqilCsifoBGd0WcbED5n57dc59X+LZMTZ8Ose44w== +esbuild-linux-ppc64le@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz#dc3a3da321222b11e96e50efafec9d2de408198b" + integrity sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w== -esbuild-linux-riscv64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.46.tgz#b6c4faf9f8482e2a898ec2becac4a6789ae3ff22" - integrity sha512-OB29r1EG44ZY34JnXCRERxo7k4pRKoQdaoRg2HIeCavatsXZwW4LCakpLnMQ72vXT1HtpBUABEjHkKkn5JyrUg== +esbuild-linux-riscv64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz#9bd6dcd3dca6c0357084ecd06e1d2d4bf105335f" + integrity sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g== -esbuild-linux-s390x@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.46.tgz#d30d0f7ee8466c4ec99ac2c689b70514320406b2" - integrity sha512-XQ/U9TueMSGYyPTKyZsJVraiuvxhwCDIMn/QwFXCRCJ6H/Cy/Rq33u9qhpeSziinHKfzJROGx5A8mQY6aYamdQ== +esbuild-linux-s390x@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz#a458af939b52f2cd32fc561410d441a51f69d41f" + integrity sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw== esbuild-loader@^2.18.0: version "2.19.0" @@ -11839,61 +11839,61 @@ esbuild-loader@^2.18.0: tapable "^2.2.0" webpack-sources "^2.2.0" -esbuild-netbsd-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.46.tgz#fcf2b739b63731b5b264dc584240c0b61dbbf035" - integrity sha512-i15BwqHaAIFp1vBJkitAbHtwXcLk9TdHs/Ia1xGIAutQYXSJNPLM3Z4B4hyfHNEFl2yBqBIYpglMohv2ClNdOQ== +esbuild-netbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz#6388e785d7e7e4420cb01348d7483ab511b16aa8" + integrity sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ== -esbuild-openbsd-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.46.tgz#fc7880751b78b325216e66470b9a3df7b1c21cbf" - integrity sha512-XwOIFCE140Y/PvjrwjFfa/QLWBuvhR1mPCOa35mKx02jt++wPNgf0qhn6HfdVC3vQe7R46RwTp4q2cp99fepEg== +esbuild-openbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz#309af806db561aa886c445344d1aacab850dbdc5" + integrity sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw== -esbuild-sunos-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.46.tgz#ab73b91e79ae53dddb035da9bb69ba7dd44d36ee" - integrity sha512-+kV3JnmfdxBVpHyFvuGXWtu6tXxXApOLPkSrVkMJf6+ns/3PLtPndpzwCzHjD+qYUEk8ln4MA+ufQ2qmjW5mZg== +esbuild-sunos-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz#3f19612dcdb89ba6c65283a7ff6e16f8afbf8aaa" + integrity sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ== -esbuild-windows-32@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.46.tgz#88ad388c896325d273e92dbf28f146d1d34d4351" - integrity sha512-gzGC1Q11B/Bo5A2EX4N22oigWmhL7Z0eDyc8kbSoJjqSrGQuRE7B0uMpluO+q0O/gZ1S3zdw+M4PCWlqOIeXLA== +esbuild-windows-32@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz#a92d279c8458d5dc319abcfeb30aa49e8f2e6f7f" + integrity sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ== -esbuild-windows-64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.46.tgz#bfb21b68d54d0db86190f8073cbf66a86bd0de14" - integrity sha512-Do2daaskfOjmCB7o3ygz6fD3K6SPjZLERiZLktzHz2oUCwsebKu/gmop0+j/XdrVIXC32wFzHzDS+9CTu9OShw== +esbuild-windows-64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz#2564c3fcf0c23d701edb71af8c52d3be4cec5f8a" + integrity sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ== -esbuild-windows-arm64@0.14.46: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.46.tgz#b8aa66a0c347342b9ae780b537d5574e9691c123" - integrity sha512-VEzMy6bM60/HT/URTDElyhfi2Pk0quCCrEhRlI4MRno/AIqYUGw0rZwkPl6PeoqVI6BgoBHGY576GWTiPmshCA== +esbuild-windows-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz#86d9db1a22d83360f726ac5fba41c2f625db6878" + integrity sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ== esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.39: - version "0.14.46" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.46.tgz#d548cfc13fecfd4bc074ce38e0122d1dd9b067db" - integrity sha512-vdm5G1JdZBktva8dwQci/s44VbeBUg8g907xoZx77mqFZ4gU5GlMULNsdGeID+qXCXocsfYSGtE0LvqH3eiNQg== + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz#0d6415f6bd8eb9e73a58f7f9ae04c5276cda0e4d" + integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== optionalDependencies: - esbuild-android-64 "0.14.46" - esbuild-android-arm64 "0.14.46" - esbuild-darwin-64 "0.14.46" - esbuild-darwin-arm64 "0.14.46" - esbuild-freebsd-64 "0.14.46" - esbuild-freebsd-arm64 "0.14.46" - esbuild-linux-32 "0.14.46" - esbuild-linux-64 "0.14.46" - esbuild-linux-arm "0.14.46" - esbuild-linux-arm64 "0.14.46" - esbuild-linux-mips64le "0.14.46" - esbuild-linux-ppc64le "0.14.46" - esbuild-linux-riscv64 "0.14.46" - esbuild-linux-s390x "0.14.46" - esbuild-netbsd-64 "0.14.46" - esbuild-openbsd-64 "0.14.46" - esbuild-sunos-64 "0.14.46" - esbuild-windows-32 "0.14.46" - esbuild-windows-64 "0.14.46" - esbuild-windows-arm64 "0.14.46" + esbuild-android-64 "0.14.47" + esbuild-android-arm64 "0.14.47" + esbuild-darwin-64 "0.14.47" + esbuild-darwin-arm64 "0.14.47" + esbuild-freebsd-64 "0.14.47" + esbuild-freebsd-arm64 "0.14.47" + esbuild-linux-32 "0.14.47" + esbuild-linux-64 "0.14.47" + esbuild-linux-arm "0.14.47" + esbuild-linux-arm64 "0.14.47" + esbuild-linux-mips64le "0.14.47" + esbuild-linux-ppc64le "0.14.47" + esbuild-linux-riscv64 "0.14.47" + esbuild-linux-s390x "0.14.47" + esbuild-netbsd-64 "0.14.47" + esbuild-openbsd-64 "0.14.47" + esbuild-sunos-64 "0.14.47" + esbuild-windows-32 "0.14.47" + esbuild-windows-64 "0.14.47" + esbuild-windows-arm64 "0.14.47" escalade@^3.1.1: version "3.1.1" From 2ef58ab539d4e6fcf4f286d2a2e24159467e01ab Mon Sep 17 00:00:00 2001 From: Niklas Aronsson Date: Tue, 21 Jun 2022 06:59:44 +0200 Subject: [PATCH 216/590] TechInsightsBackend: Added 'scheduler' to code examples Signed-off-by: Niklas Aronsson --- .changeset/breezy-poems-grab.md | 5 +++++ plugins/tech-insights-backend/README.md | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/breezy-poems-grab.md diff --git a/.changeset/breezy-poems-grab.md b/.changeset/breezy-poems-grab.md new file mode 100644 index 0000000000..ac250b9c7e --- /dev/null +++ b/.changeset/breezy-poems-grab.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +--- + +TechInsightsBackend: Added missing 'scheduler' to code examples diff --git a/plugins/tech-insights-backend/README.md b/plugins/tech-insights-backend/README.md index e88d150393..c5c6e66270 100644 --- a/plugins/tech-insights-backend/README.md +++ b/plugins/tech-insights-backend/README.md @@ -106,6 +106,7 @@ const builder = buildTechInsightsContext({ database: env.database, discovery: env.discovery, tokenManager: env.tokenManager, + scheduler: env.scheduler, - factRetrievers: [], + factRetrievers: [myFactRetrieverRegistration], }); @@ -122,6 +123,7 @@ const builder = buildTechInsightsContext({ database: env.database, discovery: env.discovery, tokenManager: env.tokenManager, + scheduler: env.scheduler, - factRetrievers: [], + factRetrievers: process.env.MAIN_FACT_RETRIEVER_INSTANCE ? [myFactRetrieverRegistration] : [], }); @@ -281,6 +283,7 @@ export default async function createPlugin( database: env.database, discovery: env.discovery, tokenManager: env.tokenManager, + scheduler: env.scheduler, factRetrievers: [ createFactRetrieverRegistration({ cadence: '0 */6 * * *', // Run every 6 hours - https://crontab.guru/#0_*/6_*_*_* From df8a7349fab6f0f7c3bc536df7d9cc562b7df9c8 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Tue, 21 Jun 2022 09:43:00 +0200 Subject: [PATCH 217/590] chore/changeset: change from major to minor Signed-off-by: Johan Haals --- .changeset/red-games-decide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/red-games-decide.md b/.changeset/red-games-decide.md index ca5ff580b4..208cecfc0a 100644 --- a/.changeset/red-games-decide.md +++ b/.changeset/red-games-decide.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-api-docs-module-protoc-gen-doc': major +'@backstage/plugin-api-docs-module-protoc-gen-doc': minor --- Added the new `grpcDocsApiWidget` to render `protoc-gen-doc` generated descriptors by the `grpc-docs` package. From bce462d4e326f120fb18b5320537ec2628a516e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 07:45:37 +0000 Subject: [PATCH 218/590] fix(deps): update dependency @microsoft/microsoft-graph-types to v2.22.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index bca39feaef..61a9d59a1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4183,9 +4183,9 @@ typescript "~4.6.3" "@microsoft/microsoft-graph-types@^2.6.0": - version "2.21.0" - resolved "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.21.0.tgz#3244b41374307f590948e25fb2de8dad2a8a81c9" - integrity sha512-ZbYetXyUqHZliM8exZzF7IPEKVMvR+PaY+P9bjNHpxeiacF3U9+c40YRv0TJHpF6+50GWmJmPD6BsKHVRBZiCA== + version "2.22.0" + resolved "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.22.0.tgz#7ceb222311770ed5b240d627b657d25b3979964e" + integrity sha512-iKc5L036hc/wu13DX5kGf//3/WqTAErAPTyYKG6zT3vG070xXaaP7PInODznfyZduhiOvavmrRlQb34ajeDTUA== "@microsoft/tsdoc-config@~0.16.1": version "0.16.1" From 37539e29d840212ffeb962e56fc493b4f9a96e74 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 21 Jun 2022 09:47:10 +0200 Subject: [PATCH 219/590] scaffolder: show dry-run error cause Signed-off-by: Patrik Oldsberg --- .changeset/breezy-seas-exist.md | 5 +++++ .../TemplateEditorPage/TemplateEditorForm.tsx | 16 +++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 .changeset/breezy-seas-exist.md diff --git a/.changeset/breezy-seas-exist.md b/.changeset/breezy-seas-exist.md new file mode 100644 index 0000000000..2b061f11a8 --- /dev/null +++ b/.changeset/breezy-seas-exist.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +The template editor now shows the cause of request errors that happen during a dry-run. diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index 11b4da246d..d802ab07dc 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -212,11 +212,17 @@ export function TemplateEditorFormDirectoryEditorDryRun( return; } - await dryRun.execute({ - templateContent: selectedFile.content, - values: data, - files: directoryEditor.files, - }); + try { + await dryRun.execute({ + templateContent: selectedFile.content, + values: data, + files: directoryEditor.files, + }); + setErrorText(); + } catch (e) { + setErrorText(String(e.cause || e)); + throw e; + } }; const content = From 464bb0e6c80cd950b3432f6134d47650fa021138 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 21 Jun 2022 10:00:12 +0200 Subject: [PATCH 220/590] scaffolder: reduce max file size for dry-run content Signed-off-by: Patrik Oldsberg --- .changeset/strange-trains-collect.md | 5 +++++ .../src/components/TemplateEditorPage/DryRunContext.tsx | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/strange-trains-collect.md diff --git a/.changeset/strange-trains-collect.md b/.changeset/strange-trains-collect.md new file mode 100644 index 0000000000..3da9aff515 --- /dev/null +++ b/.changeset/strange-trains-collect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +The max content size for dry-run files has been reduced from 256k to 64k. diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx index 0a5bfeefd5..b592e3cecd 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/DryRunContext.tsx @@ -29,8 +29,8 @@ import React, { import { scaffolderApiRef } from '../../api'; import { ScaffolderDryRunResponse } from '../../types'; -const MAX_CONTENT_SIZE = 256 * 1024; -const CHUNK_SIZE = 0x8000; +const MAX_CONTENT_SIZE = 64 * 1024; +const CHUNK_SIZE = 32 * 1024; interface DryRunOptions { templateContent: string; From 741b6df63a59b721a6422dbecf89863f840c7e9f Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Tue, 21 Jun 2022 10:02:04 +0200 Subject: [PATCH 221/590] update api reports Signed-off-by: Emma Indal --- plugins/search-backend-node/api-report.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/search-backend-node/api-report.md b/plugins/search-backend-node/api-report.md index 7649bc5d0f..63273d7514 100644 --- a/plugins/search-backend-node/api-report.md +++ b/plugins/search-backend-node/api-report.md @@ -6,6 +6,7 @@ /// import { Config } from '@backstage/config'; +import { CustomErrorBase } from '@backstage/errors'; import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { DocumentDecoratorFactory } from '@backstage/plugin-search-common'; import { DocumentTypeInfo } from '@backstage/plugin-search-common'; @@ -113,6 +114,9 @@ export class LunrSearchEngineIndexer extends BatchSearchEngineIndexer { initialize(): Promise; } +// @public +export class MissingIndexError extends CustomErrorBase {} + // @public export class NewlineDelimitedJsonCollatorFactory implements DocumentCollatorFactory From 842282ecf94f597c189c053216e02da6951d3aa8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 21 Jun 2022 09:35:17 +0200 Subject: [PATCH 222/590] scaffolder: bump codemirror deps Signed-off-by: Patrik Oldsberg --- .changeset/curly-candles-battle.md | 5 + plugins/scaffolder/package.json | 8 +- yarn.lock | 192 ++++++++++++++--------------- 3 files changed, 104 insertions(+), 101 deletions(-) create mode 100644 .changeset/curly-candles-battle.md diff --git a/.changeset/curly-candles-battle.md b/.changeset/curly-candles-battle.md new file mode 100644 index 0000000000..9a4d850fd1 --- /dev/null +++ b/.changeset/curly-candles-battle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Bumped `codemirror` dependencies to `v6.0.0`. diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index fd8161646c..c6da6b8f2f 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -49,9 +49,9 @@ "@backstage/plugin-scaffolder-common": "^1.1.1", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", - "@codemirror/language": "^0.20.0", - "@codemirror/legacy-modes": "^0.20.0", - "@codemirror/view": "^0.20.2", + "@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", @@ -59,7 +59,7 @@ "@rjsf/core": "^3.2.1", "@rjsf/material-ui": "^3.2.1", "@types/json-schema": "^7.0.9", - "@uiw/react-codemirror": "^4.7.0", + "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^11.6.0", "humanize-duration": "^3.25.1", diff --git a/yarn.lock b/yarn.lock index a4cb216837..9690ad9b73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1718,97 +1718,84 @@ human-id "^1.0.2" prettier "^1.19.1" -"@codemirror/autocomplete@^0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.20.0.tgz#390cc444ea36474e77117f2153caad84214f0edf" - integrity sha512-F6VOM8lImn5ApqxJcaWgdl7hhlw8B5yAfZJGlsQifcpNotkZOMND61mBFZ84OmSLWxtT8/smkSeLvJupKbjP9w== +"@codemirror/autocomplete@^6.0.0": + version "6.0.2" + resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.2.tgz#119b9d147456418895de6fae09419465b58d7beb" + integrity sha512-9PDjnllmXan/7Uax87KGORbxerDJ/cu10SB+n4Jz0zXMEvIh3+TGgZxhIvDOtaQ4jDBQEM7kHYW4vLdQB0DGZQ== dependencies: - "@codemirror/language" "^0.20.0" - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.0" - "@lezer/common" "^0.16.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" -"@codemirror/basic-setup@^0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@codemirror/basic-setup/-/basic-setup-0.20.0.tgz#ed331e0b2d29efc0a09317de9e10467b992b0c7b" - integrity sha512-W/ERKMLErWkrVLyP5I8Yh8PXl4r+WFNkdYVSzkXYPQv2RMPSkWpr2BgggiSJ8AHF/q3GuApncDD8I4BZz65fyg== +"@codemirror/commands@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-6.0.0.tgz#9eaa4d53e9cdb2e13da52c8a03636a9f9ad45d2b" + integrity sha512-nVJDPiCQXWXj5AZxqNVXyIM3nOYauF4Dko9NGPSwgVdK+lXWJQhI5LGhS/AvdG5b7u7/pTQBkrQmzkLWRBF62A== dependencies: - "@codemirror/autocomplete" "^0.20.0" - "@codemirror/commands" "^0.20.0" - "@codemirror/language" "^0.20.0" - "@codemirror/lint" "^0.20.0" - "@codemirror/search" "^0.20.0" - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" -"@codemirror/commands@^0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-0.20.0.tgz#51405d442e6b8687b63e8fa27effc28179917c88" - integrity sha512-v9L5NNVA+A9R6zaFvaTbxs30kc69F6BkOoiEbeFw4m4I0exmDEKBILN6mK+GksJtvTzGBxvhAPlVFTdQW8GB7Q== +"@codemirror/language@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@codemirror/language/-/language-6.1.0.tgz#7686f0ecafd958c35332c3cc2aa3d564fd33dc44" + integrity sha512-CeqY80nvUFrJcXcBW115aNi06D0PS8NSW6nuJRSwbrYFkE0SfJnPfyLGrcM90AV95lqg5+4xUi99BCmzNaPGJg== dependencies: - "@codemirror/language" "^0.20.0" - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.0" - "@lezer/common" "^0.16.0" - -"@codemirror/language@^0.20.0": - version "0.20.2" - resolved "https://registry.npmjs.org/@codemirror/language/-/language-0.20.2.tgz#31c3712eac2251810986272dcd6a50510e0c1529" - integrity sha512-WB3Bnuusw0xhVvhBocieYKwJm04SOk5bPoOEYksVHKHcGHFOaYaw+eZVxR4gIqMMcGzOIUil0FsCmFk8yrhHpw== - dependencies: - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.0" - "@lezer/common" "^0.16.0" - "@lezer/highlight" "^0.16.0" - "@lezer/lr" "^0.16.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" style-mod "^4.0.0" -"@codemirror/legacy-modes@^0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-0.20.0.tgz#a1cea5eed05fa09a0cac4a39f41e362a136da5ea" - integrity sha512-SYllodnzD8OI6Y6NoFzCv+77cU9aTdfqDO0Zn8j5PbjUIAD+pIofwHAvecd9/ePLAICr+EYCEuqUxldHAR+pLQ== +"@codemirror/legacy-modes@^6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.1.0.tgz#f1c6d504069509c8d3d9220453132e559477400c" + integrity sha512-V/PgGpndkZeTn3Hdlg/gd8MLFdyvTCIX+iwJzjUw5iNziWiNsAY8X0jvf7m3gSfxnKkNzmid6l0g4rYSpiDaCw== dependencies: - "@codemirror/language" "^0.20.0" + "@codemirror/language" "^6.0.0" -"@codemirror/lint@^0.20.0": - version "0.20.1" - resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-0.20.1.tgz#791c83642f76103bbf6b8bfdc8020eff2b78b5e2" - integrity sha512-aWbeicDiNe5tb2aZuXs7sKk3hQ89Z1YcUuUX8ngQu23tT6EY4kcY2cayDjizvkLn8iHkObNf97uSudjNmUon2Q== +"@codemirror/lint@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz#a249b021ac9933b94fe312d994d220f0ef11a157" + integrity sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA== dependencies: - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.2" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" crelt "^1.0.5" -"@codemirror/search@^0.20.0": - version "0.20.1" - resolved "https://registry.npmjs.org/@codemirror/search/-/search-0.20.1.tgz#9eba0514218a673e29501a889a4fcb7da7ce24ad" - integrity sha512-ROe6gRboQU5E4z6GAkNa2kxhXqsGNbeLEisbvzbOeB7nuDYXUZ70vGIgmqPu0tB+1M3F9yWk6W8k2vrFpJaD4Q== +"@codemirror/search@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@codemirror/search/-/search-6.0.0.tgz#43bd6341d9aff18869386d2fce27519850e919e3" + integrity sha512-rL0rd3AhI0TAsaJPUaEwC63KHLO7KL0Z/dYozXj6E7L3wNHRyx7RfE0/j5HsIf912EE5n2PCb4Vg0rGYmDv4UQ== dependencies: - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" crelt "^1.0.5" -"@codemirror/state@^0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@codemirror/state/-/state-0.20.0.tgz#3343d209169813b0152b77361cd78bea01549a73" - integrity sha512-R3XrAWCS5Xm9lx+4pDET4EUPEg+8bDfAa5zoOFIhx+VChsfew9Vy33dAjCXS5ES4Q8UecW4WM4UudmUFpZ+86A== +"@codemirror/state@^6.0.0": + version "6.0.1" + resolved "https://registry.npmjs.org/@codemirror/state/-/state-6.0.1.tgz#a1994f14c49e2f77cb9e26aef35f63a8b3707c6c" + integrity sha512-6vYgaXc4KjSY0BUfSVDJooGcoswg/RJZpq/ZGjsUYmY0KN1lmB8u03nv+jiG1ncUV5qoggyxFT5AGD5Ak+5Zrw== -"@codemirror/theme-one-dark@^0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-0.20.0.tgz#112074e446d46931d1104405154ccbe8c8874009" - integrity sha512-iqTKaiOZddwlc2rYF+9D60Gfyz9EsSawVejSjyP2FCtOwZ1X0frG5/ByTKH5FBDD2+P7W8+h/OIG4r5dWq4bgA== +"@codemirror/theme-one-dark@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.0.0.tgz#81a999a568217f68522bd8846cbf7210ca2a59df" + integrity sha512-jTCfi1I8QT++3m21Ui6sU8qwu3F/hLv161KLxfvkV1cYWSBwyUanmQFs89ChobQjBHi2x7s2k71wF9WYvE8fdw== dependencies: - "@codemirror/language" "^0.20.0" - "@codemirror/state" "^0.20.0" - "@codemirror/view" "^0.20.0" - "@lezer/highlight" "^0.16.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/highlight" "^1.0.0" -"@codemirror/view@^0.20.0", "@codemirror/view@^0.20.2": - version "0.20.7" - resolved "https://registry.npmjs.org/@codemirror/view/-/view-0.20.7.tgz#1d0acc740f71f92abef4b437c030d4e6c39ab6dc" - integrity sha512-pqEPCb9QFTOtHgAH5XU/oVy9UR/Anj6r+tG5CRmkNVcqSKEPmBU05WtN/jxJCFZBXf6HumzWC9ydE4qstO3TxQ== +"@codemirror/view@^6.0.0": + version "6.0.1" + resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.0.1.tgz#f56327a5cd241eff5393cfdfbceea897b5266967" + integrity sha512-n5olUr4Ld+XDTZN8+cnUHzkqJPeO2kr55HvBQ+4C1xWlDaRGrsedAoxCgeuGZsXRTUup/H/0e2kAN+a0R3skdA== dependencies: - "@codemirror/state" "^0.20.0" + "@codemirror/state" "^6.0.0" style-mod "^4.0.0" w3c-keyname "^2.2.4" @@ -3933,24 +3920,24 @@ npmlog "^4.1.2" write-file-atomic "^3.0.3" -"@lezer/common@^0.16.0": - version "0.16.0" - resolved "https://registry.npmjs.org/@lezer/common/-/common-0.16.0.tgz#b6023a0a682b0b7676d0e7f0e0838f71bde39fcd" - integrity sha512-H6sPCku+asKWYaNjwfQ1Uvcay9UP1Pdzu4qpy8GtRZ0cKT2AAGnj9MQGiRtY18MDntvhYRJxNGv7FNWOSV/e8A== +"@lezer/common@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@lezer/common/-/common-1.0.0.tgz#1c95ae53ec17706aa3cbcc88b52c23f22ed56096" + integrity sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA== -"@lezer/highlight@^0.16.0": - version "0.16.0" - resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-0.16.0.tgz#95f7b7ee3c32c8a0f6ce499c085e8b1f927ffbdc" - integrity sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ== +"@lezer/highlight@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.0.0.tgz#1dc82300f5d39fbd67ae1194b5519b4c381878d3" + integrity sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA== dependencies: - "@lezer/common" "^0.16.0" + "@lezer/common" "^1.0.0" -"@lezer/lr@^0.16.0": - version "0.16.1" - resolved "https://registry.npmjs.org/@lezer/lr/-/lr-0.16.1.tgz#abe8c538d3f1a811ce5731847e3d0470c7709dcd" - integrity sha512-RuRD84dWY9If8BanfaaWNe0YhRdYWtni92GpB4C4/7JgHyAIfdkJz7miBjgILm3gOsBjJsJh56vb1ckxSQEWBg== +"@lezer/lr@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@lezer/lr/-/lr-1.0.0.tgz#89e30c1e710b8715ac5c847ad063418c51d6e750" + integrity sha512-k6DEqBh4HxqO/cVGedb6Ern6LS7K6IOzfydJ5WaqCR26v6UR9sIFyb6PS+5rPUs/mXgnBR/QQCW7RkyjSCMoQA== dependencies: - "@lezer/common" "^0.16.0" + "@lezer/common" "^1.0.0" "@manypkg/find-root@^1.1.0": version "1.1.0" @@ -6809,9 +6796,9 @@ "@types/node" "*" "@types/tern@*": - version "0.23.3" - resolved "https://registry.npmjs.org/@types/tern/-/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460" - integrity sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w== + version "0.23.4" + resolved "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" + integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== dependencies: "@types/estree" "*" @@ -7131,16 +7118,14 @@ "@typescript-eslint/types" "5.9.0" eslint-visitor-keys "^3.0.0" -"@uiw/react-codemirror@^4.7.0": - version "4.7.0" - resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.7.0.tgz#cca6cb2e91f5c5c5e545b389cc55fb307087be75" - integrity sha512-gRBsIScecZzqj1/vqPZ6XxykccBkp+qv6wLFyTk2DxHzuPl4cDIQwqCBl81u80by5nCKambceRkTvpiQ6oJ2Ew== +"@uiw/react-codemirror@^4.9.3": + version "4.9.3" + resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.9.3.tgz#3d7abc434b140f01119332e25e9f49ace7c381bf" + integrity sha512-iT/daKF852ZsNJGvqmxRFJ4KTOJSikeoCMl7jhUUJTETdozUf0/DqUQhvazAoduMRzqqHYnN/5isdITCyy2P6g== dependencies: "@babel/runtime" ">=7.11.0" - "@codemirror/basic-setup" "^0.20.0" - "@codemirror/state" "^0.20.0" - "@codemirror/theme-one-dark" "^0.20.0" - "@codemirror/view" "^0.20.0" + "@codemirror/theme-one-dark" "^6.0.0" + codemirror "^6.0.0" "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -9496,6 +9481,19 @@ codemirror@^5.65.3: resolved "https://registry.npmjs.org/codemirror/-/codemirror-5.65.3.tgz#2d029930d5a293bc5fb96ceea64654803c0d4ac7" integrity sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ== +codemirror@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/codemirror/-/codemirror-6.0.0.tgz#48aac6370d188f0761807ad9c3b62da7e7f72446" + integrity sha512-c4XR9QtDn+NhKLM2FBsnRn9SFdRH7G6594DYC/fyKKIsTOcdLF0WNWRd+f6kNyd5j1vgYPucbIeq2XkywYCwhA== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + codeowners-utils@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/codeowners-utils/-/codeowners-utils-1.0.2.tgz#9d30148bf957c53d55f75df432cb1e3b4bc6ee28" From a0c54475a69deb9ba37be1cba6a9269d23f490db Mon Sep 17 00:00:00 2001 From: tomasrb Date: Thu, 16 Jun 2022 21:43:41 -0700 Subject: [PATCH 223/590] Add DORA metrics plugin Signed-off-by: tomasrb --- microsite/data/plugins/dora-metrics.yaml | 9 +++++++++ microsite/static/img/okay.png | Bin 0 -> 46181 bytes 2 files changed, 9 insertions(+) create mode 100644 microsite/data/plugins/dora-metrics.yaml create mode 100644 microsite/static/img/okay.png diff --git a/microsite/data/plugins/dora-metrics.yaml b/microsite/data/plugins/dora-metrics.yaml new file mode 100644 index 0000000000..b94499e324 --- /dev/null +++ b/microsite/data/plugins/dora-metrics.yaml @@ -0,0 +1,9 @@ +--- +title: DORA Metrics +author: Okay +authorUrl: https://www.okayhq.com +category: Metrics +description: Embed dashboards (like DORA metrics) in your team or service pages from any dev tools (including Github, Gitlab, Jira, Argo, CircleCI, Buildkite, Pagerduty, Rollbar, Sentry, etc). +documentation: https://github.com/OkayHQ/backstage-plugin +iconUrl: img/okay.png +npmPackageName: '@okayhq/backstage-plugin' diff --git a/microsite/static/img/okay.png b/microsite/static/img/okay.png new file mode 100644 index 0000000000000000000000000000000000000000..357219d9d2c51e1d9a16f3f7a0c4fc476936d685 GIT binary patch literal 46181 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 literal 0 HcmV?d00001 From 2231987c104c09f4462f9125a6c09546c2890f67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 21 Jun 2022 09:04:17 +0000 Subject: [PATCH 224/590] Version Packages (next) --- .changeset/pre.json | 37 +- docs/releases/v1.4.0-next.0-changelog.md | 1365 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 8 + packages/app-defaults/package.json | 10 +- packages/app/CHANGELOG.md | 55 + packages/app/package.json | 102 +- packages/backend-common/CHANGELOG.md | 9 + packages/backend-common/package.json | 8 +- packages/backend-tasks/CHANGELOG.md | 7 + packages/backend-tasks/package.json | 8 +- packages/backend-test-utils/CHANGELOG.md | 8 + packages/backend-test-utils/package.json | 8 +- packages/backend/CHANGELOG.md | 38 + packages/backend/package.json | 66 +- packages/catalog-client/CHANGELOG.md | 7 + packages/catalog-client/package.json | 6 +- packages/catalog-model/CHANGELOG.md | 10 + packages/catalog-model/package.json | 4 +- packages/cli/CHANGELOG.md | 6 + packages/cli/package.json | 12 +- packages/config/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 6 + packages/core-app-api/package.json | 6 +- packages/core-components/CHANGELOG.md | 6 + packages/core-components/package.json | 8 +- packages/core-plugin-api/package.json | 6 +- packages/create-app/CHANGELOG.md | 14 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 13 + packages/dev-utils/package.json | 18 +- packages/errors/package.json | 2 +- packages/integration-react/CHANGELOG.md | 8 + packages/integration-react/package.json | 12 +- packages/integration/CHANGELOG.md | 6 + packages/integration/package.json | 6 +- packages/release-manifests/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 16 + .../techdocs-cli-embedded-app/package.json | 24 +- packages/techdocs-cli/CHANGELOG.md | 10 + packages/techdocs-cli/package.json | 10 +- packages/test-utils/CHANGELOG.md | 7 + packages/test-utils/package.json | 6 +- packages/theme/package.json | 2 +- packages/types/package.json | 2 +- packages/version-bridge/package.json | 2 +- plugins/adr-backend/CHANGELOG.md | 11 + plugins/adr-backend/package.json | 14 +- plugins/adr-common/CHANGELOG.md | 8 + plugins/adr-common/package.json | 8 +- plugins/adr/CHANGELOG.md | 12 + plugins/adr/package.json | 20 +- plugins/airbrake-backend/CHANGELOG.md | 7 + plugins/airbrake-backend/package.json | 6 +- plugins/airbrake/CHANGELOG.md | 11 + plugins/airbrake/package.json | 20 +- plugins/allure/CHANGELOG.md | 9 + plugins/allure/package.json | 16 +- plugins/analytics-module-ga/CHANGELOG.md | 7 + plugins/analytics-module-ga/package.json | 12 +- plugins/apache-airflow/CHANGELOG.md | 7 + plugins/apache-airflow/package.json | 12 +- .../CHANGELOG.md | 7 + .../package.json | 4 +- plugins/api-docs/CHANGELOG.md | 10 + plugins/api-docs/package.json | 18 +- plugins/app-backend/CHANGELOG.md | 7 + plugins/app-backend/package.json | 8 +- plugins/auth-backend/CHANGELOG.md | 11 + plugins/auth-backend/package.json | 14 +- plugins/auth-node/CHANGELOG.md | 7 + plugins/auth-node/package.json | 6 +- plugins/azure-devops-backend/CHANGELOG.md | 8 + plugins/azure-devops-backend/package.json | 6 +- plugins/azure-devops-common/package.json | 2 +- plugins/azure-devops/CHANGELOG.md | 10 + plugins/azure-devops/package.json | 16 +- plugins/badges-backend/CHANGELOG.md | 9 + plugins/badges-backend/package.json | 10 +- plugins/badges/CHANGELOG.md | 9 + plugins/badges/package.json | 16 +- plugins/bazaar-backend/CHANGELOG.md | 8 + plugins/bazaar-backend/package.json | 8 +- plugins/bazaar/CHANGELOG.md | 12 + plugins/bazaar/package.json | 18 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 7 + plugins/bitbucket-cloud-common/package.json | 6 +- plugins/bitrise/CHANGELOG.md | 9 + plugins/bitrise/package.json | 16 +- .../catalog-backend-module-aws/CHANGELOG.md | 11 + .../catalog-backend-module-aws/package.json | 14 +- .../catalog-backend-module-azure/CHANGELOG.md | 11 + .../catalog-backend-module-azure/package.json | 16 +- .../CHANGELOG.md | 10 + .../package.json | 16 +- .../CHANGELOG.md | 11 + .../package.json | 16 +- .../CHANGELOG.md | 11 + .../package.json | 16 +- .../CHANGELOG.md | 11 + .../package.json | 16 +- .../CHANGELOG.md | 11 + .../package.json | 16 +- .../catalog-backend-module-ldap/CHANGELOG.md | 9 + .../catalog-backend-module-ldap/package.json | 10 +- .../CHANGELOG.md | 9 + .../package.json | 14 +- plugins/catalog-backend/CHANGELOG.md | 12 + plugins/catalog-backend/package.json | 20 +- plugins/catalog-common/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 10 + plugins/catalog-graph/package.json | 20 +- plugins/catalog-graphql/CHANGELOG.md | 7 + plugins/catalog-graphql/package.json | 8 +- plugins/catalog-import/CHANGELOG.md | 13 + plugins/catalog-import/package.json | 22 +- plugins/catalog-react/CHANGELOG.md | 10 + plugins/catalog-react/package.json | 18 +- plugins/catalog/CHANGELOG.md | 32 + plugins/catalog/package.json | 22 +- .../CHANGELOG.md | 8 + .../package.json | 8 +- plugins/cicd-statistics/CHANGELOG.md | 8 + plugins/cicd-statistics/package.json | 6 +- plugins/circleci/CHANGELOG.md | 9 + plugins/circleci/package.json | 16 +- plugins/cloudbuild/CHANGELOG.md | 9 + plugins/cloudbuild/package.json | 16 +- plugins/code-climate/CHANGELOG.md | 9 + plugins/code-climate/package.json | 14 +- plugins/code-coverage-backend/CHANGELOG.md | 10 + plugins/code-coverage-backend/package.json | 12 +- plugins/code-coverage/CHANGELOG.md | 9 + plugins/code-coverage/package.json | 16 +- plugins/codescene/CHANGELOG.md | 7 + plugins/codescene/package.json | 12 +- plugins/config-schema/CHANGELOG.md | 7 + plugins/config-schema/package.json | 12 +- plugins/cost-insights/CHANGELOG.md | 8 + plugins/cost-insights/package.json | 14 +- plugins/dynatrace/CHANGELOG.md | 9 + plugins/dynatrace/package.json | 16 +- .../example-todo-list-backend/CHANGELOG.md | 8 + .../example-todo-list-backend/package.json | 8 +- plugins/example-todo-list-common/package.json | 8 +- plugins/example-todo-list/CHANGELOG.md | 7 + plugins/example-todo-list/package.json | 12 +- plugins/explore-react/package.json | 6 +- plugins/explore/CHANGELOG.md | 9 + plugins/explore/package.json | 16 +- plugins/firehydrant/CHANGELOG.md | 8 + plugins/firehydrant/package.json | 14 +- plugins/fossa/CHANGELOG.md | 9 + plugins/fossa/package.json | 16 +- plugins/gcalendar/CHANGELOG.md | 7 + plugins/gcalendar/package.json | 12 +- plugins/gcp-projects/CHANGELOG.md | 7 + plugins/gcp-projects/package.json | 12 +- plugins/git-release-manager/CHANGELOG.md | 8 + plugins/git-release-manager/package.json | 14 +- plugins/github-actions/CHANGELOG.md | 11 + plugins/github-actions/package.json | 18 +- plugins/github-deployments/CHANGELOG.md | 11 + plugins/github-deployments/package.json | 20 +- .../github-pull-requests-board/CHANGELOG.md | 12 + .../github-pull-requests-board/package.json | 16 +- plugins/gitops-profiles/CHANGELOG.md | 7 + plugins/gitops-profiles/package.json | 12 +- plugins/gocd/CHANGELOG.md | 9 + plugins/gocd/package.json | 16 +- plugins/graphiql/CHANGELOG.md | 7 + plugins/graphiql/package.json | 12 +- plugins/graphql-backend/CHANGELOG.md | 8 + plugins/graphql-backend/package.json | 8 +- plugins/home/CHANGELOG.md | 10 + plugins/home/package.json | 18 +- plugins/ilert/CHANGELOG.md | 9 + plugins/ilert/package.json | 16 +- plugins/jenkins-backend/CHANGELOG.md | 10 + plugins/jenkins-backend/package.json | 12 +- plugins/jenkins-common/package.json | 2 +- plugins/jenkins/CHANGELOG.md | 9 + plugins/jenkins/package.json | 16 +- plugins/kafka-backend/CHANGELOG.md | 8 + plugins/kafka-backend/package.json | 8 +- plugins/kafka/CHANGELOG.md | 9 + plugins/kafka/package.json | 16 +- plugins/kubernetes-backend/CHANGELOG.md | 13 + plugins/kubernetes-backend/package.json | 10 +- plugins/kubernetes-common/CHANGELOG.md | 11 + plugins/kubernetes-common/package.json | 6 +- plugins/kubernetes/CHANGELOG.md | 10 + plugins/kubernetes/package.json | 18 +- plugins/lighthouse/CHANGELOG.md | 9 + plugins/lighthouse/package.json | 16 +- plugins/newrelic-dashboard/CHANGELOG.md | 9 + plugins/newrelic-dashboard/package.json | 12 +- plugins/newrelic/CHANGELOG.md | 7 + plugins/newrelic/package.json | 12 +- plugins/org/CHANGELOG.md | 9 + plugins/org/package.json | 18 +- plugins/pagerduty/CHANGELOG.md | 36 + plugins/pagerduty/package.json | 16 +- plugins/periskop-backend/CHANGELOG.md | 7 + plugins/periskop-backend/package.json | 6 +- plugins/periskop/CHANGELOG.md | 9 + plugins/periskop/package.json | 16 +- plugins/permission-backend/CHANGELOG.md | 9 + plugins/permission-backend/package.json | 10 +- plugins/permission-common/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 8 + plugins/permission-node/package.json | 8 +- plugins/permission-react/package.json | 4 +- plugins/proxy-backend/CHANGELOG.md | 7 + plugins/proxy-backend/package.json | 6 +- plugins/rollbar-backend/CHANGELOG.md | 7 + plugins/rollbar-backend/package.json | 8 +- plugins/rollbar/CHANGELOG.md | 9 + plugins/rollbar/package.json | 16 +- .../CHANGELOG.md | 9 + .../package.json | 10 +- .../CHANGELOG.md | 9 + .../package.json | 10 +- .../CHANGELOG.md | 7 + .../package.json | 6 +- plugins/scaffolder-backend/CHANGELOG.md | 16 + plugins/scaffolder-backend/package.json | 18 +- plugins/scaffolder-common/CHANGELOG.md | 7 + plugins/scaffolder-common/package.json | 6 +- plugins/scaffolder/CHANGELOG.md | 23 + plugins/scaffolder/package.json | 26 +- .../CHANGELOG.md | 7 + .../package.json | 8 +- plugins/search-backend-module-pg/CHANGELOG.md | 8 + plugins/search-backend-module-pg/package.json | 10 +- plugins/search-backend-node/CHANGELOG.md | 8 + plugins/search-backend-node/package.json | 10 +- plugins/search-backend/CHANGELOG.md | 10 + plugins/search-backend/package.json | 12 +- plugins/search-common/package.json | 2 +- plugins/search-react/CHANGELOG.md | 7 + plugins/search-react/package.json | 8 +- plugins/search/CHANGELOG.md | 10 + plugins/search/package.json | 18 +- plugins/sentry/CHANGELOG.md | 9 + plugins/sentry/package.json | 16 +- plugins/shortcuts/CHANGELOG.md | 7 + plugins/shortcuts/package.json | 12 +- plugins/sonarqube/CHANGELOG.md | 9 + plugins/sonarqube/package.json | 16 +- plugins/splunk-on-call/CHANGELOG.md | 9 + plugins/splunk-on-call/package.json | 16 +- plugins/stack-overflow/CHANGELOG.md | 10 + plugins/stack-overflow/package.json | 14 +- .../CHANGELOG.md | 8 + .../package.json | 8 +- plugins/tech-insights-backend/CHANGELOG.md | 12 + plugins/tech-insights-backend/package.json | 16 +- plugins/tech-insights-common/package.json | 2 +- plugins/tech-insights-node/CHANGELOG.md | 7 + plugins/tech-insights-node/package.json | 6 +- plugins/tech-insights/CHANGELOG.md | 9 + plugins/tech-insights/package.json | 16 +- plugins/tech-radar/CHANGELOG.md | 7 + plugins/tech-radar/package.json | 12 +- .../techdocs-addons-test-utils/CHANGELOG.md | 14 + .../techdocs-addons-test-utils/package.json | 22 +- plugins/techdocs-backend/CHANGELOG.md | 11 + plugins/techdocs-backend/package.json | 18 +- .../CHANGELOG.md | 10 + .../package.json | 20 +- plugins/techdocs-node/CHANGELOG.md | 9 + plugins/techdocs-node/package.json | 10 +- plugins/techdocs-react/CHANGELOG.md | 9 + plugins/techdocs-react/package.json | 8 +- plugins/techdocs/CHANGELOG.md | 14 + plugins/techdocs/package.json | 24 +- plugins/todo-backend/CHANGELOG.md | 10 + plugins/todo-backend/package.json | 12 +- plugins/todo/CHANGELOG.md | 9 + plugins/todo/package.json | 16 +- plugins/user-settings/CHANGELOG.md | 7 + plugins/user-settings/package.json | 12 +- plugins/vault-backend/CHANGELOG.md | 13 + plugins/vault-backend/package.json | 10 +- plugins/vault/CHANGELOG.md | 10 + plugins/vault/package.json | 16 +- plugins/xcmetrics/CHANGELOG.md | 7 + plugins/xcmetrics/package.json | 12 +- yarn.lock | 285 +++- 290 files changed, 3954 insertions(+), 1028 deletions(-) create mode 100644 docs/releases/v1.4.0-next.0-changelog.md create mode 100644 plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 500bf4ac83..6ea515cda8 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -156,7 +156,40 @@ "@backstage/plugin-user-settings": "0.4.5", "@backstage/plugin-vault": "0.1.0", "@backstage/plugin-vault-backend": "0.1.0", - "@backstage/plugin-xcmetrics": "0.2.26" + "@backstage/plugin-xcmetrics": "0.2.26", + "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.0.0" }, - "changesets": [] + "changesets": [ + "beige-horses-scream", + "breezy-poems-grab", + "breezy-seas-exist", + "chilled-mirrors-grab", + "curly-candles-battle", + "curvy-weeks-matter", + "eleven-mice-collect", + "great-roses-pump", + "large-kangaroos-poke", + "modern-ducks-lay", + "nasty-zoos-cross", + "nervous-humans-sip", + "polite-eagles-invite", + "purple-beans-march", + "red-games-decide", + "renovate-9454dab", + "rude-llamas-lie", + "shaggy-melons-drive", + "sharp-planes-turn", + "short-olives-train", + "smooth-sheep-hide", + "strange-trains-collect", + "sweet-plants-sparkle", + "tame-guests-wave", + "techdocs-gorgeous-plants-sniff", + "techdocs-the-whole-pulse", + "thick-radios-drive", + "unlucky-stingrays-juggle", + "weak-bananas-deliver", + "wet-dolphins-act", + "wicked-icons-grin" + ] } diff --git a/docs/releases/v1.4.0-next.0-changelog.md b/docs/releases/v1.4.0-next.0-changelog.md new file mode 100644 index 0000000000..c6b9fd7cf9 --- /dev/null +++ b/docs/releases/v1.4.0-next.0-changelog.md @@ -0,0 +1,1365 @@ +# Release v1.4.0-next.0 + +## @backstage/catalog-model@1.1.0-next.0 + +### Minor Changes + +- 1380b389dc: Adding an optional type field to entity links to group and categorize links + +### Patch Changes + +- c3cfc83af2: Updated JSDoc to be MDX compatible. + +## @backstage/plugin-api-docs-module-protoc-gen-doc@0.1.0-next.0 + +### Minor Changes + +- e0328f2107: Added the new `grpcDocsApiWidget` to render `protoc-gen-doc` generated descriptors by the `grpc-docs` package. + +## @backstage/plugin-kubernetes-backend@0.7.0-next.0 + +### Minor Changes + +- 0791af993f: Refactor `KubernetesObjectsProvider` with new methods, `KubernetesServiceLocator` now takes an `Entity` instead of `serviceId` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-kubernetes-common@0.4.0-next.0 + +## @backstage/plugin-kubernetes-common@0.4.0-next.0 + +### Minor Changes + +- 0791af993f: Refactor `KubernetesObjectsProvider` with new methods, `KubernetesServiceLocator` now takes an `Entity` instead of `serviceId` + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + +## @backstage/plugin-pagerduty@0.5.0-next.0 + +### Minor Changes + +- 8798f8d93f: Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. + _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ + + **BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to + accept 2 arguments: config and ClientApiDependencies + The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests. + + **BREAKING** A new query method `getServiceByEntity` that is used to query for Services by either the `integrationKey` or `serviceId` + annotation values if they are defined. The `integrationKey` value is preferred currently over `serviceId`. As such, the previous + `getServiceByIntegrationKey` method has been removed. + + **BREAKING** The return values for each Client query method has been changed to return an object instead of raw values. + For example, the `getIncidentsByServiceId` query method now returns an object in the shape of `{ incidents: Incident[] }` + instead of just `Incident[]`. + This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions. + + **BREAKING** All public exported types that relate to entities within PagerDuty have been prefixed with `PagerDuty` (e.g. `ServicesResponse` is now `PagerDutyServicesResponse` and `User` is now `PagerDutyUser`) + + In addition, various enhancements/bug fixes were introduced: + + - The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage + - If no service can be found for the provided integration key, a new Error Message Empty State component will be shown instead of an error alert + - Introduces the `fetchApi` to replace standard `window.fetch` + - ensures that Identity Authorization is respected and provided in API requests + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-scaffolder@1.4.0-next.0 + +### Minor Changes + +- 3500c13a33: A new template editor has been added which is accessible via the context menu on the top right hand corner of the Create page. It allows you to load a template from a local directory, edit it with a preview, execute it in dry-run mode, and view the results. Note that the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) must be supported by your browser for this to be available. + + To support the new template editor the `ScaffolderApi` now has an optional `dryRun` method, which is implemented by the default `ScaffolderClient`. + +### Patch Changes + +- 37539e29d8: The template editor now shows the cause of request errors that happen during a dry-run. +- 842282ecf9: Bumped `codemirror` dependencies to `v6.0.0`. +- 464bb0e6c8: The max content size for dry-run files has been reduced from 256k to 64k. +- a7c0b34d70: Swap usage of `MaterialTable` with `Table` from `core-components` +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + +## @backstage/plugin-scaffolder-backend@1.4.0-next.0 + +### Minor Changes + +- 3500c13a33: Added a new `/v2/dry-run` endpoint that allows for a synchronous dry run of a provided template. A `supportsDryRun` option has been added to `createTemplateAction`, which signals whether the action should be executed during dry runs. When enabled, the action context will have the new `isDryRun` property set to signal if the action is being executed during a dry run. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-scaffolder-common@1.1.2-next.0 + +## @backstage/plugin-vault-backend@0.2.0-next.0 + +### Minor Changes + +- 5ebf2c7023: Throw exceptions instead of swallow them, remove some exported types from the `api-report`, small changes in the API responses & expose the vault `baseUrl` to the frontend as well + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/backend-test-utils@0.1.26-next.0 + +## @backstage/app-defaults@1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/core-app-api@1.0.4-next.0 + +## @backstage/backend-common@0.14.1-next.0 + +### Patch Changes + +- b1edb5cfd9: Fix parsing of S3 URLs for the default region. +- c3cfc83af2: Updated JSDoc to be MDX compatible. +- Updated dependencies + - @backstage/integration@1.2.2-next.0 + +## @backstage/backend-tasks@0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/backend-test-utils@0.1.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/cli@0.17.3-next.0 + +## @backstage/catalog-client@1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + +## @backstage/cli@0.17.3-next.0 + +### Patch Changes + +- d2256c0384: Fix `webpack-dev-server` deprecations. + +## @backstage/core-app-api@1.0.4-next.0 + +### Patch Changes + +- 8fe2357101: The `signOut` method of the `IdentityApi` will now navigate the user back to the base URL of the app as indicated by the `app.baseUrl` config. + +## @backstage/core-components@0.9.6-next.0 + +### Patch Changes + +- c3cfc83af2: Updated JSDoc to be MDX compatible. + +## @backstage/create-app@0.4.29-next.0 + +### Patch Changes + +- bc87604c26: Added an explicit `node-gyp` dependency to the root `package.json`. This is to work around a bug in older versions of `node-gyp` that causes Python execution to fail on macOS. + + You can add this workaround to your existing project by adding `node-gyp` as a `devDependency` in your root `package.json` file: + + ```diff + "devDependencies": { + + "node-gyp": "^9.0.0" + }, + ``` + +## @backstage/dev-utils@1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + +## @backstage/integration@1.2.2-next.0 + +### Patch Changes + +- 8829e175f2: Allow frontend visibility for `integrations` itself. + +## @backstage/integration-react@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + +## @techdocs/cli@1.1.3-next.0 + +### Patch Changes + +- 14ce0d9347: Fixed a bug that prevented docker images from being pulled by default when generating TechDocs. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-techdocs-node@1.1.3-next.0 + +## @backstage/test-utils@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.0.4-next.0 + +## @backstage/plugin-adr@0.1.2-next.0 + +### Patch Changes + +- 7d47e7e512: Track discover event and result rank for `AdrSearchResultListItem` +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-adr-common@0.1.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + +## @backstage/plugin-adr-backend@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-adr-common@0.1.2-next.0 + +## @backstage/plugin-adr-common@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + +## @backstage/plugin-airbrake@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/dev-utils@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + +## @backstage/plugin-airbrake-backend@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-allure@0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-analytics-module-ga@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-apache-airflow@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-api-docs@0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-app-backend@0.3.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-auth-backend@0.14.2-next.0 + +### Patch Changes + +- 859346bfbb: Updated dependency `google-auth-library` to `^8.0.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-auth-node@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-azure-devops@0.1.23-next.0 + +### Patch Changes + +- e049e41048: Exporting azureDevOpsApiRef, AzureGitTagsIcon, and all hooks for the benefit of other plugins. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-azure-devops-backend@0.3.13-next.0 + +### Patch Changes + +- 13a232ec22: Added comments to example to help avoid confusion as to where lines need to be added +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-badges@0.2.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-badges-backend@0.1.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-bazaar@0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-bazaar-backend@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/backend-test-utils@0.1.26-next.0 + +## @backstage/plugin-bitbucket-cloud-common@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.2.2-next.0 + +## @backstage/plugin-bitrise@0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-catalog@1.3.1-next.0 + +### Patch Changes + +- dcaf1cb418: Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as `white`. + + This was an issue for themes that use a header with a white background. By default, the color of the icon is now `theme.palette.bursts.fontColor`. + + It can now also be overridden in the theme, which is only necessary if the header title, subtitle and three-dots icon need to have different colors. For example: + + ```typescript + export function createThemeOverrides(theme: BackstageTheme): Overrides { + return { + PluginCatalogEntityContextMenu: { + button: { + color: 'blue', + }, + }, + ... + }, + ... + } + ``` + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + +## @backstage/plugin-catalog-backend@1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-scaffolder-common@1.1.2-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.1.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.1.1-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + +## @backstage/plugin-catalog-graph@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-catalog-graphql@0.3.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + +## @backstage/plugin-catalog-import@0.8.10-next.0 + +### Patch Changes + +- 272106fdad: Support use without `integrations` or only integrations without frontend visible properties (e.g., `bitbucketCloud`) being configured by checking `integrations.github` directly without attempting to load `integrations`. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + +## @backstage/plugin-catalog-react@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-cicd-statistics@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-cicd-statistics@0.1.9-next.0 + +## @backstage/plugin-circleci@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-cloudbuild@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-code-climate@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-code-coverage@0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-code-coverage-backend@0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-codescene@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-config-schema@0.1.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-cost-insights@0.11.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-dynatrace@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-explore@0.3.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-firehydrant@0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-fossa@0.2.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-gcalendar@0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-gcp-projects@0.3.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-git-release-manager@0.3.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + +## @backstage/plugin-github-actions@0.5.7-next.0 + +### Patch Changes + +- 217f919f0a: Minor cleanup of the API surface. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-github-deployments@0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + +## @backstage/plugin-github-pull-requests-board@0.1.1-next.0 + +### Patch Changes + +- c6690d9d24: Fix bug on fetching teams repositories where were being filtered by type service unnecessarily +- 04e1504e85: Support namespaced teams and fetch all kinds +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-gitops-profiles@0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-gocd@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-graphiql@0.2.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-graphql-backend@0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-catalog-graphql@0.3.11-next.0 + +## @backstage/plugin-home@0.4.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-stack-overflow@0.1.3-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-ilert@0.1.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-jenkins@0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-jenkins-backend@0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-kafka@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-kafka-backend@0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + +## @backstage/plugin-kubernetes@0.6.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-kubernetes-common@0.4.0-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-lighthouse@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-newrelic@0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-newrelic-dashboard@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-org@0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-periskop@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-periskop-backend@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-permission-backend@0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + +## @backstage/plugin-permission-node@0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + +## @backstage/plugin-proxy-backend@0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-rollbar@0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-rollbar-backend@0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/integration@1.2.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/integration@1.2.2-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + +## @backstage/plugin-scaffolder-common@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + +## @backstage/plugin-search@0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + +## @backstage/plugin-search-backend@0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@0.6.3-next.0 + +## @backstage/plugin-search-backend-module-pg@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + +## @backstage/plugin-search-backend-node@0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + +## @backstage/plugin-search-react@0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-sentry@0.3.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-shortcuts@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-sonarqube@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-splunk-on-call@0.3.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-stack-overflow@0.1.3-next.0 + +### Patch Changes + +- 12ae3eed2f: - Publicly exports `StackOverflowIcon`. + - `HomePageStackOverflowQuestions` accepts optional icon property. +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-home@0.4.23-next.0 + +## @backstage/plugin-tech-insights@0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-tech-insights-backend@0.4.2-next.0 + +### Patch Changes + +- 2ef58ab539: TechInsightsBackend: Added missing 'scheduler' to code examples +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + +## @backstage/plugin-tech-insights-node@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## @backstage/plugin-tech-radar@0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-techdocs@1.2.1-next.0 + +### Patch Changes + +- 3cbebf710e: Reorder browser tab title in Techdocs pages to have the site name first. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + +## @backstage/plugin-techdocs-backend@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-techdocs-node@1.1.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + +## @backstage/plugin-techdocs-node@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + +## @backstage/plugin-techdocs-react@1.0.2-next.0 + +### Patch Changes + +- c3cfc83af2: Updated JSDoc to be MDX compatible. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-todo@0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-todo-backend@0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## @backstage/plugin-user-settings@0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @backstage/plugin-vault@0.1.1-next.0 + +### Patch Changes + +- 5ebf2c7023: Export missing parameters and added them to the api-report. Also adapted the API to the expected response from the backend +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + +## @backstage/plugin-xcmetrics@0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## example-app@0.2.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.4.0-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/plugin-stack-overflow@0.1.3-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/plugin-azure-devops@0.1.23-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/plugin-catalog-import@0.8.10-next.0 + - @backstage/plugin-pagerduty@0.5.0-next.0 + - @backstage/plugin-github-actions@0.5.7-next.0 + - @backstage/plugin-airbrake@0.3.7-next.0 + - @backstage/plugin-api-docs@0.8.7-next.0 + - @backstage/plugin-badges@0.2.31-next.0 + - @backstage/plugin-catalog-graph@0.2.19-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-circleci@0.3.7-next.0 + - @backstage/plugin-cloudbuild@0.3.7-next.0 + - @backstage/plugin-code-coverage@0.1.34-next.0 + - @backstage/plugin-cost-insights@0.11.29-next.0 + - @backstage/plugin-dynatrace@0.1.1-next.0 + - @backstage/plugin-explore@0.3.38-next.0 + - @backstage/plugin-gocd@0.1.13-next.0 + - @backstage/plugin-home@0.4.23-next.0 + - @backstage/plugin-jenkins@0.7.6-next.0 + - @backstage/plugin-kafka@0.3.7-next.0 + - @backstage/plugin-kubernetes@0.6.7-next.0 + - @backstage/plugin-lighthouse@0.3.7-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.15-next.0 + - @backstage/plugin-org@0.5.7-next.0 + - @backstage/plugin-rollbar@0.4.7-next.0 + - @backstage/plugin-search@0.9.1-next.0 + - @backstage/plugin-sentry@0.3.45-next.0 + - @backstage/plugin-tech-insights@0.2.3-next.0 + - @backstage/plugin-todo@0.2.9-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-apache-airflow@0.1.15-next.0 + - @backstage/plugin-gcalendar@0.3.3-next.0 + - @backstage/plugin-gcp-projects@0.3.26-next.0 + - @backstage/plugin-graphiql@0.2.39-next.0 + - @backstage/plugin-newrelic@0.3.25-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + - @backstage/plugin-shortcuts@0.2.8-next.0 + - @backstage/plugin-tech-radar@0.5.14-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.0 + - @backstage/plugin-user-settings@0.4.6-next.0 + +## example-backend@0.2.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-backend@0.4.2-next.0 + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/plugin-auth-backend@0.14.2-next.0 + - @backstage/plugin-kubernetes-backend@0.7.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-azure-devops-backend@0.3.13-next.0 + - example-app@0.2.73-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-app-backend@0.3.34-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-badges-backend@0.1.28-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-code-coverage-backend@0.1.32-next.0 + - @backstage/plugin-graphql-backend@0.1.24-next.0 + - @backstage/plugin-jenkins-backend@0.1.24-next.0 + - @backstage/plugin-kafka-backend@0.2.27-next.0 + - @backstage/plugin-permission-backend@0.5.9-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/plugin-proxy-backend@0.2.28-next.0 + - @backstage/plugin-rollbar-backend@0.1.31-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.0 + - @backstage/plugin-search-backend@0.5.4-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.6-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.5-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + - @backstage/plugin-techdocs-backend@1.1.3-next.0 + - @backstage/plugin-todo-backend@0.1.31-next.0 + - @backstage/catalog-client@1.0.4-next.0 + +## techdocs-cli-embedded-app@0.2.72-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + +## @internal/plugin-todo-list@1.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + +## @internal/plugin-todo-list-backend@1.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 diff --git a/package.json b/package.json index dd2a85e757..823db687d3 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.3.0", + "version": "1.4.0-next.0", "dependencies": { "@manypkg/get-packages": "^1.1.3", "@microsoft/api-documenter": "^7.17.11", diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index fb1756eba2..929e53e248 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/app-defaults +## 1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/core-app-api@1.0.4-next.0 + ## 1.0.3 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 0a35b16c3a..92de05204d 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.0.3", + "version": "1.0.4-next.0", "private": false, "publishConfig": { "access": "public", @@ -33,8 +33,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/core-components": "^0.9.5", - "@backstage/core-app-api": "^1.0.3", + "@backstage/core-components": "^0.9.6-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/plugin-permission-react": "^0.4.2", "@backstage/theme": "^0.2.15", @@ -46,8 +46,8 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@types/jest": "^26.0.7", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 74601b6417..119200eca6 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,60 @@ # example-app +## 0.2.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.4.0-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/plugin-stack-overflow@0.1.3-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/plugin-azure-devops@0.1.23-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/plugin-catalog-import@0.8.10-next.0 + - @backstage/plugin-pagerduty@0.5.0-next.0 + - @backstage/plugin-github-actions@0.5.7-next.0 + - @backstage/plugin-airbrake@0.3.7-next.0 + - @backstage/plugin-api-docs@0.8.7-next.0 + - @backstage/plugin-badges@0.2.31-next.0 + - @backstage/plugin-catalog-graph@0.2.19-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-circleci@0.3.7-next.0 + - @backstage/plugin-cloudbuild@0.3.7-next.0 + - @backstage/plugin-code-coverage@0.1.34-next.0 + - @backstage/plugin-cost-insights@0.11.29-next.0 + - @backstage/plugin-dynatrace@0.1.1-next.0 + - @backstage/plugin-explore@0.3.38-next.0 + - @backstage/plugin-gocd@0.1.13-next.0 + - @backstage/plugin-home@0.4.23-next.0 + - @backstage/plugin-jenkins@0.7.6-next.0 + - @backstage/plugin-kafka@0.3.7-next.0 + - @backstage/plugin-kubernetes@0.6.7-next.0 + - @backstage/plugin-lighthouse@0.3.7-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.15-next.0 + - @backstage/plugin-org@0.5.7-next.0 + - @backstage/plugin-rollbar@0.4.7-next.0 + - @backstage/plugin-search@0.9.1-next.0 + - @backstage/plugin-sentry@0.3.45-next.0 + - @backstage/plugin-tech-insights@0.2.3-next.0 + - @backstage/plugin-todo@0.2.9-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-apache-airflow@0.1.15-next.0 + - @backstage/plugin-gcalendar@0.3.3-next.0 + - @backstage/plugin-gcp-projects@0.3.26-next.0 + - @backstage/plugin-graphiql@0.2.39-next.0 + - @backstage/plugin-newrelic@0.3.25-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + - @backstage/plugin-shortcuts@0.2.8-next.0 + - @backstage/plugin-tech-radar@0.5.14-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.0 + - @backstage/plugin-user-settings@0.4.6-next.0 + ## 0.2.72 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index df9119d602..9c43f03f49 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,66 +1,66 @@ { "name": "example-app", - "version": "0.2.72", + "version": "0.2.73-next.0", "private": true, "backstage": { "role": "frontend" }, "bundled": true, "dependencies": { - "@backstage/app-defaults": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/cli": "^0.17.2", + "@backstage/app-defaults": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/cli": "^0.17.3-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-app-api": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-airbrake": "^0.3.6", - "@backstage/plugin-api-docs": "^0.8.6", - "@backstage/plugin-azure-devops": "^0.1.22", - "@backstage/plugin-apache-airflow": "^0.1.14", - "@backstage/plugin-badges": "^0.2.30", - "@backstage/plugin-catalog": "^1.3.0", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-airbrake": "^0.3.7-next.0", + "@backstage/plugin-api-docs": "^0.8.7-next.0", + "@backstage/plugin-azure-devops": "^0.1.23-next.0", + "@backstage/plugin-apache-airflow": "^0.1.15-next.0", + "@backstage/plugin-badges": "^0.2.31-next.0", + "@backstage/plugin-catalog": "^1.3.1-next.0", "@backstage/plugin-catalog-common": "^1.0.3", - "@backstage/plugin-catalog-graph": "^0.2.18", - "@backstage/plugin-catalog-import": "^0.8.9", - "@backstage/plugin-catalog-react": "^1.1.1", - "@backstage/plugin-circleci": "^0.3.6", - "@backstage/plugin-cloudbuild": "^0.3.6", - "@backstage/plugin-code-coverage": "^0.1.33", - "@backstage/plugin-cost-insights": "^0.11.28", - "@backstage/plugin-dynatrace": "^0.1.0", - "@backstage/plugin-explore": "^0.3.37", - "@backstage/plugin-gcalendar": "^0.3.2", - "@backstage/plugin-gcp-projects": "^0.3.25", - "@backstage/plugin-github-actions": "^0.5.6", - "@backstage/plugin-gocd": "^0.1.12", - "@backstage/plugin-graphiql": "^0.2.38", - "@backstage/plugin-home": "^0.4.22", - "@backstage/plugin-jenkins": "^0.7.5", - "@backstage/plugin-kafka": "^0.3.6", - "@backstage/plugin-kubernetes": "^0.6.6", - "@backstage/plugin-lighthouse": "^0.3.6", - "@backstage/plugin-newrelic": "^0.3.24", - "@backstage/plugin-newrelic-dashboard": "^0.1.14", - "@backstage/plugin-org": "^0.5.6", - "@backstage/plugin-pagerduty": "0.4.0", + "@backstage/plugin-catalog-graph": "^0.2.19-next.0", + "@backstage/plugin-catalog-import": "^0.8.10-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", + "@backstage/plugin-circleci": "^0.3.7-next.0", + "@backstage/plugin-cloudbuild": "^0.3.7-next.0", + "@backstage/plugin-code-coverage": "^0.1.34-next.0", + "@backstage/plugin-cost-insights": "^0.11.29-next.0", + "@backstage/plugin-dynatrace": "^0.1.1-next.0", + "@backstage/plugin-explore": "^0.3.38-next.0", + "@backstage/plugin-gcalendar": "^0.3.3-next.0", + "@backstage/plugin-gcp-projects": "^0.3.26-next.0", + "@backstage/plugin-github-actions": "^0.5.7-next.0", + "@backstage/plugin-gocd": "^0.1.13-next.0", + "@backstage/plugin-graphiql": "^0.2.39-next.0", + "@backstage/plugin-home": "^0.4.23-next.0", + "@backstage/plugin-jenkins": "^0.7.6-next.0", + "@backstage/plugin-kafka": "^0.3.7-next.0", + "@backstage/plugin-kubernetes": "^0.6.7-next.0", + "@backstage/plugin-lighthouse": "^0.3.7-next.0", + "@backstage/plugin-newrelic": "^0.3.25-next.0", + "@backstage/plugin-newrelic-dashboard": "^0.1.15-next.0", + "@backstage/plugin-org": "^0.5.7-next.0", + "@backstage/plugin-pagerduty": "0.5.0-next.0", "@backstage/plugin-permission-react": "^0.4.2", - "@backstage/plugin-rollbar": "^0.4.6", - "@backstage/plugin-scaffolder": "^1.3.0", - "@backstage/plugin-search": "^0.9.0", - "@backstage/plugin-search-react": "^0.2.1", + "@backstage/plugin-rollbar": "^0.4.7-next.0", + "@backstage/plugin-scaffolder": "^1.4.0-next.0", + "@backstage/plugin-search": "^0.9.1-next.0", + "@backstage/plugin-search-react": "^0.2.2-next.0", "@backstage/plugin-search-common": "^0.3.5", - "@backstage/plugin-sentry": "^0.3.44", - "@backstage/plugin-shortcuts": "^0.2.7", - "@backstage/plugin-stack-overflow": "^0.1.2", - "@backstage/plugin-tech-radar": "^0.5.13", - "@backstage/plugin-techdocs": "^1.2.0", - "@backstage/plugin-techdocs-react": "^1.0.1", - "@backstage/plugin-techdocs-module-addons-contrib": "^1.0.1", - "@backstage/plugin-todo": "^0.2.8", - "@backstage/plugin-user-settings": "^0.4.5", - "@backstage/plugin-tech-insights": "^0.2.2", + "@backstage/plugin-sentry": "^0.3.45-next.0", + "@backstage/plugin-shortcuts": "^0.2.8-next.0", + "@backstage/plugin-stack-overflow": "^0.1.3-next.0", + "@backstage/plugin-tech-radar": "^0.5.14-next.0", + "@backstage/plugin-techdocs": "^1.2.1-next.0", + "@backstage/plugin-techdocs-react": "^1.0.2-next.0", + "@backstage/plugin-techdocs-module-addons-contrib": "^1.0.2-next.0", + "@backstage/plugin-todo": "^0.2.9-next.0", + "@backstage/plugin-user-settings": "^0.4.6-next.0", + "@backstage/plugin-tech-insights": "^0.2.3-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -81,7 +81,7 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/test-utils": "^1.1.1", + "@backstage/test-utils": "^1.1.2-next.0", "@rjsf/core": "^3.2.1", "@testing-library/cypress": "^8.0.2", "@testing-library/jest-dom": "^5.10.1", diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 9e5a28f76b..92b3271ec0 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-common +## 0.14.1-next.0 + +### Patch Changes + +- b1edb5cfd9: Fix parsing of S3 URLs for the default region. +- c3cfc83af2: Updated JSDoc to be MDX compatible. +- Updated dependencies + - @backstage/integration@1.2.2-next.0 + ## 0.14.0 ### Minor Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index d4da05eaa6..9c459373ff 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.14.0", + "version": "0.14.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -38,7 +38,7 @@ "@backstage/config": "^1.0.1", "@backstage/config-loader": "^1.1.2", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/types": "^1.0.0", "@google-cloud/storage": "^6.0.0", "@manypkg/get-packages": "^1.1.3", @@ -91,8 +91,8 @@ } }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/archiver": "^5.1.0", "@types/base64-stream": "^1.0.2", "@types/compression": "^1.7.0", diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 34be280bbc..b73abb2d5a 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/backend-tasks +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.3.2 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index e96a71c597..f99baea1d5 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.3.2", + "version": "0.3.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -33,7 +33,7 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@backstage/types": "^1.0.0", @@ -48,8 +48,8 @@ "zod": "^3.9.5" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/cron": "^2.0.0", "wait-for-expect": "^3.0.2" }, diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 104f17a2e8..a9da9b0a3c 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/backend-test-utils +## 0.1.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/cli@0.17.3-next.0 + ## 0.1.25 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index abc55944ea..56aa23bfd8 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.25", + "version": "0.1.26-next.0", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -34,8 +34,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/cli": "^0.17.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/cli": "^0.17.3-next.0", "@backstage/config": "^1.0.1", "better-sqlite3": "^7.5.0", "knex": "^1.0.2", @@ -46,7 +46,7 @@ "uuid": "^8.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 1602a34c37..3dfde23cae 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,43 @@ # example-backend +## 0.2.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights-backend@0.4.2-next.0 + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/plugin-auth-backend@0.14.2-next.0 + - @backstage/plugin-kubernetes-backend@0.7.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-azure-devops-backend@0.3.13-next.0 + - example-app@0.2.73-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-app-backend@0.3.34-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-badges-backend@0.1.28-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-code-coverage-backend@0.1.32-next.0 + - @backstage/plugin-graphql-backend@0.1.24-next.0 + - @backstage/plugin-jenkins-backend@0.1.24-next.0 + - @backstage/plugin-kafka-backend@0.2.27-next.0 + - @backstage/plugin-permission-backend@0.5.9-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/plugin-proxy-backend@0.2.28-next.0 + - @backstage/plugin-rollbar-backend@0.1.31-next.0 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.2-next.0 + - @backstage/plugin-search-backend@0.5.4-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@0.1.6-next.0 + - @backstage/plugin-search-backend-module-pg@0.3.5-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.18-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + - @backstage/plugin-techdocs-backend@1.1.3-next.0 + - @backstage/plugin-todo-backend@0.1.31-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.2.72 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 9dedf360c1..0023a169bf 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.72", + "version": "0.2.73-next.0", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -26,39 +26,39 @@ "build-image": "docker build ../.. -f Dockerfile --tag example-backend" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-app-backend": "^0.3.33", - "@backstage/plugin-auth-backend": "^0.14.1", - "@backstage/plugin-auth-node": "^0.2.2", - "@backstage/plugin-azure-devops-backend": "^0.3.12", - "@backstage/plugin-badges-backend": "^0.1.27", - "@backstage/plugin-catalog-backend": "^1.2.0", - "@backstage/plugin-code-coverage-backend": "^0.1.31", - "@backstage/plugin-graphql-backend": "^0.1.23", - "@backstage/plugin-jenkins-backend": "^0.1.23", - "@backstage/plugin-kubernetes-backend": "^0.6.0", - "@backstage/plugin-kafka-backend": "^0.2.26", - "@backstage/plugin-permission-backend": "^0.5.8", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-app-backend": "^0.3.34-next.0", + "@backstage/plugin-auth-backend": "^0.14.2-next.0", + "@backstage/plugin-auth-node": "^0.2.3-next.0", + "@backstage/plugin-azure-devops-backend": "^0.3.13-next.0", + "@backstage/plugin-badges-backend": "^0.1.28-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", + "@backstage/plugin-code-coverage-backend": "^0.1.32-next.0", + "@backstage/plugin-graphql-backend": "^0.1.24-next.0", + "@backstage/plugin-jenkins-backend": "^0.1.24-next.0", + "@backstage/plugin-kubernetes-backend": "^0.7.0-next.0", + "@backstage/plugin-kafka-backend": "^0.2.27-next.0", + "@backstage/plugin-permission-backend": "^0.5.9-next.0", "@backstage/plugin-permission-common": "^0.6.2", - "@backstage/plugin-permission-node": "^0.6.2", - "@backstage/plugin-proxy-backend": "^0.2.27", - "@backstage/plugin-rollbar-backend": "^0.1.30", - "@backstage/plugin-scaffolder-backend": "^1.3.0", - "@backstage/plugin-scaffolder-backend-module-rails": "^0.4.1", - "@backstage/plugin-search-backend": "^0.5.3", - "@backstage/plugin-search-backend-node": "^0.6.2", - "@backstage/plugin-search-backend-module-elasticsearch": "^0.1.5", - "@backstage/plugin-search-backend-module-pg": "^0.3.4", - "@backstage/plugin-techdocs-backend": "^1.1.2", - "@backstage/plugin-tech-insights-backend": "^0.4.1", - "@backstage/plugin-tech-insights-node": "^0.3.1", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.17", - "@backstage/plugin-todo-backend": "^0.1.30", + "@backstage/plugin-permission-node": "^0.6.3-next.0", + "@backstage/plugin-proxy-backend": "^0.2.28-next.0", + "@backstage/plugin-rollbar-backend": "^0.1.31-next.0", + "@backstage/plugin-scaffolder-backend": "^1.4.0-next.0", + "@backstage/plugin-scaffolder-backend-module-rails": "^0.4.2-next.0", + "@backstage/plugin-search-backend": "^0.5.4-next.0", + "@backstage/plugin-search-backend-node": "^0.6.3-next.0", + "@backstage/plugin-search-backend-module-elasticsearch": "^0.1.6-next.0", + "@backstage/plugin-search-backend-module-pg": "^0.3.5-next.0", + "@backstage/plugin-techdocs-backend": "^1.1.3-next.0", + "@backstage/plugin-tech-insights-backend": "^0.4.2-next.0", + "@backstage/plugin-tech-insights-node": "^0.3.2-next.0", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.18-next.0", + "@backstage/plugin-todo-backend": "^0.1.31-next.0", "@gitbeaker/node": "^35.1.0", "@octokit/rest": "^18.5.3", "better-sqlite3": "^7.5.0", @@ -75,7 +75,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/express-serve-static-core": "^4.17.5", diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 93d232dc24..8ea70b67be 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/catalog-client +## 1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + ## 1.0.3 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 76818ed10f..893b057e37 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.0.3", + "version": "1.0.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,12 +33,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/errors": "^1.0.0", "cross-fetch": "^3.1.5" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7", "msw": "^0.42.0" }, diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 7d491dad5b..6501c32409 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/catalog-model +## 1.1.0-next.0 + +### Minor Changes + +- 1380b389dc: Adding an optional type field to entity links to group and categorize links + +### Patch Changes + +- c3cfc83af2: Updated JSDoc to be MDX compatible. + ## 1.0.3 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 328482fd24..ba2521b927 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.0.3", + "version": "1.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,7 +43,7 @@ "uuid": "^8.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7", "@types/json-schema": "^7.0.5", "@types/lodash": "^4.14.151", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4da56c18bd..dbceb46db1 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/cli +## 0.17.3-next.0 + +### Patch Changes + +- d2256c0384: Fix `webpack-dev-server` deprecations. + ## 0.17.2 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 071fc74f97..08f67249f5 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.17.2", + "version": "0.17.3-next.0", "private": false, "publishConfig": { "access": "public" @@ -126,13 +126,13 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-app-api": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@types/diff": "^5.0.0", "@types/express": "^4.17.6", diff --git a/packages/config/package.json b/packages/config/package.json index bc0693fa73..fc99531bb4 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -37,7 +37,7 @@ "lodash": "^4.17.21" }, "devDependencies": { - "@backstage/test-utils": "^1.1.1-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@types/jest": "^26.0.7", "@types/node": "^16.0.0" }, diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 8d78e51c62..c4d2f9d8fe 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/core-app-api +## 1.0.4-next.0 + +### Patch Changes + +- 8fe2357101: The `signOut` method of the `IdentityApi` will now navigate the user back to the base URL of the app as indicated by the `app.baseUrl` config. + ## 1.0.3 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index cbf9d7eb40..be95a344fa 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.0.3", + "version": "1.0.4-next.0", "private": false, "publishConfig": { "access": "public", @@ -49,8 +49,8 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index faec6d3d90..ccccade63d 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/core-components +## 0.9.6-next.0 + +### Patch Changes + +- c3cfc83af2: Updated JSDoc to be MDX compatible. + ## 0.9.5 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 867909b3cf..f4b4f55089 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.9.5", + "version": "0.9.6-next.0", "private": false, "publishConfig": { "access": "public", @@ -79,9 +79,9 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/core-app-api": "^1.0.3", - "@backstage/cli": "^0.17.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 8d525b5f0f..5f468dba51 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -46,9 +46,9 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 775aed3faa..77d36048ba 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/create-app +## 0.4.29-next.0 + +### Patch Changes + +- bc87604c26: Added an explicit `node-gyp` dependency to the root `package.json`. This is to work around a bug in older versions of `node-gyp` that causes Python execution to fail on macOS. + + You can add this workaround to your existing project by adding `node-gyp` as a `devDependency` in your root `package.json` file: + + ```diff + "devDependencies": { + + "node-gyp": "^9.0.0" + }, + ``` + ## 0.4.28 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index bca9fe9b68..d67e7c6f54 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.28", + "version": "0.4.29-next.0", "private": false, "publishConfig": { "access": "public" diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 563de9fc44..26aa5ce212 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/dev-utils +## 1.0.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + ## 1.0.3 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 2da041d9b7..8835aea7c6 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.3", + "version": "1.0.4-next.0", "private": false, "publishConfig": { "access": "public", @@ -33,14 +33,14 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/app-defaults": "^1.0.3", - "@backstage/core-app-api": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/app-defaults": "^1.0.4-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-catalog-react": "^1.1.1", - "@backstage/test-utils": "^1.1.1", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -59,7 +59,7 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7", "@types/node": "^16.0.0" }, diff --git a/packages/errors/package.json b/packages/errors/package.json index 8327246224..849c451e84 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -38,7 +38,7 @@ "serialize-error": "^8.0.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7" }, "files": [ diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index d03553f50d..30326e1205 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-react +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + ## 1.1.1 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 580b91509f..ea87dfc724 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.1", + "version": "1.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,9 +25,9 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -38,9 +38,9 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 736d9ff2a1..9a9b679b19 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/integration +## 1.2.2-next.0 + +### Patch Changes + +- 8829e175f2: Allow frontend visibility for `integrations` itself. + ## 1.2.1 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 06faef890d..f103d63bbb 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration", "description": "Helpers for managing integrations towards external systems", - "version": "1.2.1", + "version": "1.2.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -43,9 +43,9 @@ "lodash": "^4.17.21" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@backstage/config-loader": "^1.1.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/test-utils": "^1.1.2-next.0", "@types/jest": "^26.0.7", "@types/luxon": "^2.0.4", "msw": "^0.42.0" diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json index f0627a9c95..822c3c1a52 100644 --- a/packages/release-manifests/package.json +++ b/packages/release-manifests/package.json @@ -36,7 +36,7 @@ "cross-fetch": "^3.1.5" }, "devDependencies": { - "@backstage/test-utils": "^1.1.1", + "@backstage/test-utils": "^1.1.2-next.0", "msw": "^0.42.0", "@types/jest": "^26.0.7", "@types/node": "^16.0.0" diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 58102369ed..b6ce6d4a97 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,21 @@ # techdocs-cli-embedded-app +## 0.2.72-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + ## 0.2.71 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 8029d604db..959be03e52 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,24 +1,24 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.71", + "version": "0.2.72-next.0", "private": true, "backstage": { "role": "frontend" }, "bundled": true, "dependencies": { - "@backstage/app-defaults": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/cli": "^0.17.2", + "@backstage/app-defaults": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/cli": "^0.17.3-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-app-api": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-catalog": "^1.3.0", - "@backstage/plugin-techdocs": "^1.2.0", - "@backstage/plugin-techdocs-react": "^1.0.1", - "@backstage/test-utils": "^1.1.1", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-catalog": "^1.3.1-next.0", + "@backstage/plugin-techdocs": "^1.2.1-next.0", + "@backstage/plugin-techdocs-react": "^1.0.2-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1", @@ -30,7 +30,7 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 21eb2393b7..aa1870d5da 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,15 @@ # @techdocs/cli +## 1.1.3-next.0 + +### Patch Changes + +- 14ce0d9347: Fixed a bug that prevented docker images from being pulled by default when generating TechDocs. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-techdocs-node@1.1.3-next.0 + ## 1.1.2 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index d1db470572..7f556a8dd7 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.1.2", + "version": "1.1.3-next.0", "private": false, "publishConfig": { "access": "public" @@ -37,7 +37,7 @@ "techdocs-cli": "bin/techdocs-cli" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/commander": "^2.12.2", "@types/fs-extra": "^9.0.6", "@types/http-proxy": "^1.17.4", @@ -62,11 +62,11 @@ "ext": "ts" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/cli-common": "^0.1.9", "@backstage/config": "^1.0.1", - "@backstage/plugin-techdocs-node": "^1.1.2", + "@backstage/plugin-techdocs-node": "^1.1.3-next.0", "@types/dockerode": "^3.3.0", "commander": "^9.1.0", "dockerode": "^3.3.1", diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index d8e9a8dd11..56bcd3ec62 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/test-utils +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.0.4-next.0 + ## 1.1.1 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 0c52f47325..17886b76ce 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.1.1", + "version": "1.1.2-next.0", "private": false, "publishConfig": { "access": "public", @@ -34,7 +34,7 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/core-app-api": "^1.0.3", + "@backstage/core-app-api": "^1.0.4-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/plugin-permission-common": "^0.6.2", "@backstage/plugin-permission-react": "^0.4.2", @@ -55,7 +55,7 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7", "@types/node": "^16.11.26", "msw": "^0.42.0" diff --git a/packages/theme/package.json b/packages/theme/package.json index d10999fefb..0e4d26fbea 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -36,7 +36,7 @@ "@material-ui/core": "^4.12.2" }, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/packages/types/package.json b/packages/types/package.json index 5ea10709ec..9d26ee25e7 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -34,7 +34,7 @@ }, "dependencies": {}, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/zen-observable": "^0.8.0", "zen-observable": "^0.8.15" }, diff --git a/packages/version-bridge/package.json b/packages/version-bridge/package.json index 81ec8017a1..357350bef7 100644 --- a/packages/version-bridge/package.json +++ b/packages/version-bridge/package.json @@ -37,7 +37,7 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0", + "@backstage/cli": "^0.17.3-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0" diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 946df67282..8262032252 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-adr-backend +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-adr-common@0.1.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index c192e0cd85..7ed696a650 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,13 +29,13 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-adr-common": "^0.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-adr-common": "^0.1.2-next.0", "@backstage/plugin-search-common": "^0.3.5", "luxon": "^2.0.2", "marked": "^4.0.14", @@ -44,7 +44,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/marked": "^4.0.0", "@types/supertest": "^2.0.8", "supertest": "^6.1.3", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index d9a0207248..07bbac4e8e 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-adr-common +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index d3607f3a99..fee09a03e1 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.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,12 +30,12 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/integration": "^1.2.1", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/integration": "^1.2.2-next.0", "@backstage/plugin-search-common": "^0.3.5" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index 61e28f3834..7d0e47a5f1 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-adr +## 0.1.2-next.0 + +### Patch Changes + +- 7d47e7e512: Track discover event and result rank for `AdrSearchResultListItem` +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-adr-common@0.1.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 194cc44ae4..4bff140277 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,13 +22,13 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-adr-common": "^0.1.1", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-adr-common": "^0.1.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-search-common": "^0.3.5", - "@backstage/plugin-search-react": "^0.2.1", + "@backstage/plugin-search-react": "^0.2.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -44,10 +44,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index e24e510782..5810bda422 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-airbrake-backend +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.2.6 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 4e56593990..979137cbff 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.6", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,7 +22,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@types/express": "*", "express": "^4.17.1", @@ -33,7 +33,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/http-proxy-middleware": "^0.19.3", "@types/supertest": "^2.0.8", "supertest": "^6.1.6", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index a09bf6c668..b1a86b6e22 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-airbrake +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/dev-utils@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index b98785889f..755e99c522 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,12 +23,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", - "@backstage/test-utils": "^1.1.1", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -40,10 +40,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/app-defaults": "^1.0.3", - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/app-defaults": "^1.0.4-next.0", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 26b754fbf8..06f84b5f42 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-allure +## 0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.22 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index b5d95973f2..2499a70f28 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.22", + "version": "0.1.23-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,10 +25,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -40,10 +40,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index b8a14619d4..d9fe0e6c0d 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-analytics-module-ga +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.1.17 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 7196539053..0b137d5a44 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.17", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,7 +25,7 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -38,10 +38,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index 7f1fc05e69..73c1c2ae18 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-apache-airflow +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.1.14 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 5455bd602b..63f444075e 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.1.14", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,7 +23,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -36,10 +36,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md new file mode 100644 index 0000000000..c6ca346a62 --- /dev/null +++ b/plugins/api-docs-module-protoc-gen-doc/CHANGELOG.md @@ -0,0 +1,7 @@ +# @backstage/plugin-api-docs-module-protoc-gen-doc + +## 0.1.0-next.0 + +### Minor Changes + +- e0328f2107: Added the new `grpcDocsApiWidget` to render `protoc-gen-doc` generated descriptors by the `grpc-docs` package. diff --git a/plugins/api-docs-module-protoc-gen-doc/package.json b/plugins/api-docs-module-protoc-gen-doc/package.json index 81e7b7ea45..2ce03b5803 100644 --- a/plugins/api-docs-module-protoc-gen-doc/package.json +++ b/plugins/api-docs-module-protoc-gen-doc/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs-module-protoc-gen-doc", "description": "Additional functionalities for the api-docs plugin that renders the output of the protoc-gen-doc", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,7 +37,7 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0", + "@backstage/cli": "^0.17.3-next.0", "@testing-library/jest-dom": "^5.16.4", "@types/react": "^16.13.1 || ^17.0.0" }, diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 2d61c19e62..f5998235ca 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-api-docs +## 0.8.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.8.6 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 9cd1e3aef0..9db7530f84 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.6", + "version": "0.8.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,11 +34,11 @@ }, "dependencies": { "@asyncapi/react-component": "1.0.0-next.38", - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog": "^1.3.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog": "^1.3.1-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -57,10 +57,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 6e86ece20d..aa3baa77da 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-app-backend +## 0.3.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.3.33 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 5efb839730..173b15c80c 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.33", + "version": "0.3.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,7 +33,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config-loader": "^1.1.2", "@backstage/config": "^1.0.1", "@backstage/types": "^1.0.0", @@ -50,8 +50,8 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@backstage/types": "^1.0.0", "@types/supertest": "^2.0.8", "mock-fs": "^5.1.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 0f69289de5..00c8669c4d 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend +## 0.14.2-next.0 + +### Patch Changes + +- 859346bfbb: Updated dependency `google-auth-library` to `^8.0.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.14.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index d0a4438afa..c1fe319e3c 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.14.1", + "version": "0.14.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,10 +33,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/plugin-auth-node": "^0.2.2", - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/plugin-auth-node": "^0.2.3-next.0", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@backstage/types": "^1.0.0", @@ -76,8 +76,8 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/body-parser": "^1.19.0", "@types/cookie-parser": "^1.4.2", "@types/express-session": "^1.17.2", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 4381303915..68fef0b00d 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-auth-node +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.2.2 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 2281d2d35e..bac48aa559 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.2", + "version": "0.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,7 +23,7 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "jose": "^4.6.0", @@ -31,7 +31,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "lodash": "^4.17.21", "msw": "^0.42.0", "uuid": "^8.0.0" diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index f9d414bef9..95fb110ed8 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-azure-devops-backend +## 0.3.13-next.0 + +### Patch Changes + +- 13a232ec22: Added comments to example to help avoid confusion as to where lines need to be added +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index e85ba907c6..d0fd5eaf80 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.12", + "version": "0.3.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,7 +23,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/plugin-azure-devops-common": "^0.2.3", "@types/express": "^4.17.6", @@ -35,7 +35,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "supertest": "^6.1.6", "msw": "^0.42.0" diff --git a/plugins/azure-devops-common/package.json b/plugins/azure-devops-common/package.json index 0f52082db6..2e39961ca8 100644 --- a/plugins/azure-devops-common/package.json +++ b/plugins/azure-devops-common/package.json @@ -32,7 +32,7 @@ "clean": "backstage-cli package clean" }, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index 8de9bd00a8..297dc81883 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-azure-devops +## 0.1.23-next.0 + +### Patch Changes + +- e049e41048: Exporting azureDevOpsApiRef, AzureGitTagsIcon, and all hooks for the benefit of other plugins. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.22 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 8fad3a8697..5375737866 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.1.22", + "version": "0.1.23-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,12 +30,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", "@backstage/plugin-azure-devops-common": "^0.2.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -49,10 +49,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 3b80f26ca1..6f69cf8662 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-badges-backend +## 0.1.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.1.27 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index d1b5d094d9..b7a727c3b0 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.27", + "version": "0.1.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,9 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@types/express": "^4.17.6", @@ -48,7 +48,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" }, diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index ff7b290b68..0d789f0f3d 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-badges +## 0.2.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.2.30 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index aeade2c50a..c12aedee98 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.30", + "version": "0.2.31-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,11 +30,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -46,10 +46,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 4b0cb04530..cfc222eb55 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bazaar-backend +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/backend-test-utils@0.1.26-next.0 + ## 0.1.17 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 5f723a9dfb..c0769fe5b8 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.1.17", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,8 +23,8 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-test-utils": "^0.1.25", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-test-utils": "^0.1.26-next.0", "@backstage/config": "^1.0.1", "@types/express": "^4.17.6", "express": "^4.17.1", @@ -34,7 +34,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 911390ee28..577b50f11e 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-bazaar +## 0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.21 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index cb3318b4e9..5f16d8a9bc 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.1.21", + "version": "0.1.22-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,13 +24,13 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/cli": "^0.17.2", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog": "^1.3.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog": "^1.3.1-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@date-io/luxon": "1.x", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -47,8 +47,8 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", "@testing-library/jest-dom": "^5.10.1", "cross-fetch": "^3.1.5" }, diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 62100f2e0b..f066706277 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.2.2-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index a02196bc39..46ec37791c 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.1.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,11 +28,11 @@ "update-models": "yarn refresh-schema && yarn generate-models && yarn reduce-models" }, "dependencies": { - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "cross-fetch": "^3.1.5" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@openapitools/openapi-generator-cli": "^2.4.26", "msw": "^0.42.0", "ts-morph": "^15.0.0" diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index 0badfe894d..86662fdeba 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-bitrise +## 0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.33 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 1d17b5a4b5..a42a513fbf 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.33", + "version": "0.1.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,10 +24,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -43,10 +43,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index d246ae9677..28bd008062 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.1.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 53ed33c47d..1a825a397d 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.6", + "version": "0.1.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,13 +33,13 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@backstage/types": "^1.0.0", "aws-sdk": "^2.840.0", "lodash": "^4.17.21", @@ -48,7 +48,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151", "aws-sdk-mock": "^5.2.1", "yaml": "^1.9.2" diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index fcc8126ad0..b39064e4e5 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 5b0966f960..3e244dc913 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.4", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,13 +33,13 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", - "@backstage/backend-tasks": "^0.3.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@backstage/types": "^1.0.0", "lodash": "^4.17.21", "msw": "^0.42.0", @@ -48,8 +48,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151" }, "files": [ diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 4f83b02e1f..c0d71dd190 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.1.1-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index aea92c3b56..d55e8d9c8f 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.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,18 +33,18 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-tasks": "^0.3.2", + "@backstage/backend-tasks": "^0.3.3-next.0", "@backstage/config": "^1.0.1", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-bitbucket-cloud-common": "^0.1.0", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-bitbucket-cloud-common": "^0.1.1-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "uuid": "^8.0.0", "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "msw": "^0.42.0" }, "files": [ diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 8c3b2c6ad5..225e2cda88 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.1.1-next.0 + ## 0.2.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 8b9c3b4e91..d7df9542a6 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.0", + "version": "0.2.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,13 +33,13 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-bitbucket-cloud-common": "^0.1.0", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-bitbucket-cloud-common": "^0.1.1-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@backstage/types": "^1.0.0", "lodash": "^4.17.21", "msw": "^0.42.0", @@ -47,8 +47,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151" }, "files": [ diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 8654556d28..483ff47997 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 55c33d2578..0668a2858b 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.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,13 +28,13 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "fs-extra": "10.1.0", "msw": "^0.42.0", "node-fetch": "^2.6.7", @@ -42,8 +42,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/fs-extra": "^9.0.1" }, "files": [ diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 553504c46f..b97a043aba 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-github +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 680c812c4c..c3adbbf212 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.1.4", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,13 +33,13 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@backstage/types": "^1.0.0", "@octokit/graphql": "^4.5.8", "lodash": "^4.17.21", @@ -49,8 +49,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151" }, "files": [ diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index f785a935e6..343b2b9d7b 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 4780d86530..8d39a8dc05 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.4", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,13 +33,13 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", - "@backstage/backend-tasks": "^0.3.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@backstage/types": "^1.0.0", "lodash": "^4.17.21", "msw": "^0.42.0", @@ -48,8 +48,8 @@ "uuid": "^8.0.0" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151", "@types/uuid": "^8.0.0" }, diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 072ef991d4..3afb99dc79 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.5.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 288fccf7a5..a8c28018f2 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.0", + "version": "0.5.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,11 +33,11 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@backstage/types": "^1.0.0", "@types/ldapjs": "^2.2.0", "ldapjs": "^2.2.0", @@ -46,7 +46,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151" }, "files": [ diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index d6a0f7c7b7..d50e93edcc 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + ## 0.3.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 3131dc6daa..e2e75af446 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.3.3", + "version": "0.3.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,10 +34,10 @@ }, "dependencies": { "@azure/msal-node": "^1.1.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", "@microsoft/microsoft-graph-types": "^2.6.0", "@types/node-fetch": "^2.5.12", "lodash": "^4.17.21", @@ -48,9 +48,9 @@ "qs": "^6.9.4" }, "devDependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151", "msw": "^0.42.0" }, diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index f235285617..84f80243fd 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend +## 1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-scaffolder-common@1.1.2-next.0 + ## 1.2.0 ### Minor Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index c33dccd8a7..61a8e68412 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.2.0", + "version": "1.2.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,16 +34,16 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/plugin-catalog-common": "^1.0.3", "@backstage/plugin-permission-common": "^0.6.2", - "@backstage/plugin-permission-node": "^0.6.2", - "@backstage/plugin-scaffolder-common": "^1.1.1", + "@backstage/plugin-permission-node": "^0.6.3-next.0", + "@backstage/plugin-scaffolder-common": "^1.1.2-next.0", "@backstage/plugin-search-common": "^0.3.5", "@backstage/types": "^1.0.0", "@types/express": "^4.17.6", @@ -68,10 +68,10 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@backstage/plugin-permission-common": "^0.6.2", - "@backstage/plugin-search-backend-node": "0.6.2", + "@backstage/plugin-search-backend-node": "0.6.3-next.0", "@types/core-js": "^2.5.4", "@types/git-url-parse": "^9.0.0", "@types/lodash": "^4.14.151", diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 27e7764812..3adb442c3e 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -38,7 +38,7 @@ "@backstage/plugin-search-common": "^0.3.5" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 2afbca45c5..5ce0a2d31b 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-graph +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 508453b387..786f284628 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.18", + "version": "0.2.19-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,11 +24,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -45,11 +45,11 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/plugin-catalog": "^1.3.0", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/plugin-catalog": "^1.3.1-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/types": "^1.0.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index b7c6aa5723..16f0bb50d9 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-graphql +## 0.3.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + ## 0.3.10 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 3e631906a6..411ae5ec17 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.10", + "version": "0.3.11-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/types": "^1.0.0", "apollo-server": "^3.0.0", @@ -46,8 +46,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@graphql-codegen/cli": "^2.3.1", "@graphql-codegen/graphql-modules-preset": "^2.3.2", "@graphql-codegen/typescript": "^2.4.2", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 5ee8857f18..1240ab1fc4 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-import +## 0.8.10-next.0 + +### Patch Changes + +- 272106fdad: Support use without `integrations` or only integrations without frontend visible properties (e.g., `bitbucketCloud`) being configured by checking `integrations.github` directly without attempting to load `integrations`. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + ## 0.8.9 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 0c72baaf9f..527faad4b3 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.8.9", + "version": "0.8.10-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,15 +34,15 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", @@ -60,10 +60,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index ba7f7deb6d..8b396ca878 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-react +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 1.1.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 47e99f23d8..a525a0af50 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.1.1", + "version": "1.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,12 +34,12 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/plugin-catalog-common": "^1.0.3", "@backstage/plugin-permission-common": "^0.6.2", "@backstage/plugin-permission-react": "^0.4.2", @@ -63,11 +63,11 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", "@backstage/plugin-catalog-common": "^1.0.3", - "@backstage/plugin-scaffolder-common": "^1.1.1", - "@backstage/test-utils": "^1.1.1", + "@backstage/plugin-scaffolder-common": "^1.1.2-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 5f4e9809c0..cc64ccd3ee 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/plugin-catalog +## 1.3.1-next.0 + +### Patch Changes + +- dcaf1cb418: Previously, the color of the Entity Context Menu (in the Entity Page Header) was hardcoded as `white`. + + This was an issue for themes that use a header with a white background. By default, the color of the icon is now `theme.palette.bursts.fontColor`. + + It can now also be overridden in the theme, which is only necessary if the header title, subtitle and three-dots icon need to have different colors. For example: + + ```typescript + export function createThemeOverrides(theme: BackstageTheme): Overrides { + return { + PluginCatalogEntityContextMenu: { + button: { + color: 'blue', + }, + }, + ... + }, + ... + } + ``` + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + ## 1.3.0 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 792df94e18..786083356a 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.3.0", + "version": "1.3.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,16 +34,16 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/integration-react": "^1.1.1", + "@backstage/integration-react": "^1.1.2-next.0", "@backstage/plugin-catalog-common": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-search-common": "^0.3.5", - "@backstage/plugin-search-react": "^0.2.1", + "@backstage/plugin-search-react": "^0.2.2-next.0", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", "@material-ui/core": "^4.12.2", @@ -61,11 +61,11 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", "@backstage/plugin-permission-react": "^0.4.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index de73c87469..14d234e35c 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-cicd-statistics@0.1.9-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index dd48ad7719..3f6d9d6731 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.2", + "version": "0.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,16 +29,16 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/plugin-cicd-statistics": "^0.1.8", + "@backstage/plugin-cicd-statistics": "^0.1.9-next.0", "@gitbeaker/browser": "^35.6.0", "@gitbeaker/core": "^35.6.0", "luxon": "^2.0.2", "p-limit": "^4.0.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/catalog-model": "^1.0.3" + "@backstage/catalog-model": "^1.1.0-next.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 498cfa47a3..e8856187c9 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cicd-statistics +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.8 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 0859afd945..c09dc7c995 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.8", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -37,9 +37,9 @@ "@types/luxon": "^2.0.5" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@date-io/luxon": "^1.3.13", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.11.2", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index 39cfcea568..1c1b551102 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-circleci +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 3e00add228..789c6f5668 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.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,10 +35,10 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -55,10 +55,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index 8454cc5cd4..d31721fee7 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cloudbuild +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index b1f14356e0..b95a6253cc 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.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,10 +34,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -52,10 +52,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 7cc1362a4d..407aacb6e2 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-code-climate +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.6 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 193fc71f3c..2bb8e7aaf2 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.6", + "version": "0.1.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,10 +23,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -40,9 +40,9 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index ebf82cc984..b354cd364a 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-code-coverage-backend +## 0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.1.31 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 0bc5281648..78b57974b9 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.1.31", + "version": "0.1.32-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,12 +23,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", @@ -39,7 +39,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/express-xml-bodyparser": "^0.3.2", "@types/supertest": "^2.0.8", "msw": "^0.42.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 474c324e98..90fef2528b 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-code-coverage +## 0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.33 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index f72d73d293..793fc61ee0 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.1.33", + "version": "0.1.34-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,12 +24,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -46,10 +46,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 2443fda056..17a14cd3a9 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-codescene +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 47006c25c7..41190404cb 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,7 +23,7 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", "@backstage/theme": "^0.2.15", @@ -38,10 +38,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 1128a525fe..3943ec30c5 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-config-schema +## 0.1.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.1.29 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 0a6c6f2d88..d806bf6d70 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.29", + "version": "0.1.30-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,7 +25,7 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", "@backstage/theme": "^0.2.15", @@ -41,10 +41,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 5b726f558c..1c51ec6050 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cost-insights +## 0.11.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + ## 0.11.28 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index 9cb8d22db9..6ea67d5425 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.11.28", + "version": "0.11.29-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,9 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -60,10 +60,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index fddf3667af..a7a17ce678 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-dynatrace +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 9ee59f38a3..018d3fdb19 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "0.1.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,8 +22,8 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.9.13", @@ -33,14 +33,14 @@ "react-use": "^17.2.4" }, "peerDependencies": { - "@backstage/plugin-catalog-react": "^1.1.1-next.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 46a980fbe3..17b2afc9ec 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list-backend +## 1.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + ## 1.0.2 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 7aaed0532b..b27b050a50 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.2", + "version": "1.0.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,10 +20,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-auth-node": "^0.2.2", + "@backstage/plugin-auth-node": "^0.2.3-next.0", "@types/express": "^4.17.6", "cross-fetch": "^3.1.5", "express": "^4.17.1", @@ -33,7 +33,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "@types/uuid": "^8.0.0", "msw": "^0.42.0", diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 596a37b210..1e90afb13a 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -26,10 +26,10 @@ "@backstage/plugin-permission-common": "^0.6.2" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@types/node": "^16.11.26", "msw": "^0.42.0", "cross-fetch": "^3.1.5" diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 31404fa73d..f33b659b7e 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list +## 1.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 1.0.2 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index c80b9a48ea..4c5fb0c83e 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.2", + "version": "1.0.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,7 +21,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -33,10 +33,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 00ec76258d..021365d056 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -36,9 +36,9 @@ "@backstage/core-plugin-api": "^1.0.3" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 712e3203fb..895dd9b0ab 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-explore +## 0.3.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.37 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 201be77085..4290cf668c 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.3.37", + "version": "0.3.38-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,10 +34,10 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-explore-react": "^0.0.18", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 065d6e0bd5..6b02c041dc 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-firehydrant +## 0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.23 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index a86a122fd0..2574e28871 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.23", + "version": "0.1.24-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,9 +25,9 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -39,10 +39,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index 07880deb60..e3710b1d3e 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-fossa +## 0.2.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.2.38 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index e97dc7c0f9..c286f8fd82 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.38", + "version": "0.2.39-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,11 +35,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index c5d63a19db..7c6db3657b 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-gcalendar +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.3.2 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index b74129b8bc..77dfc8af18 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.2", + "version": "0.3.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,7 +22,7 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", "@backstage/theme": "^0.2.15", @@ -43,10 +43,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index 6c95f8ea4d..4420fb00cc 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-gcp-projects +## 0.3.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.3.25 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 0434e6b25a..fa1aa611bd 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.25", + "version": "0.3.26-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -47,10 +47,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 7b3a0bc993..c4a44de3c8 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-git-release-manager +## 0.3.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + ## 0.3.19 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 9ae263b882..2d6bf1ec73 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.19", + "version": "0.3.20-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,9 +24,9 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -43,10 +43,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 23e66cc1f6..01e47f8e49 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-github-actions +## 0.5.7-next.0 + +### Patch Changes + +- 217f919f0a: Minor cleanup of the API surface. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.5.6 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index f843755e9b..16122a2d12 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.6", + "version": "0.5.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,11 +36,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -55,10 +55,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 45a93e3b34..1ba6a113a5 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-github-deployments +## 0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + ## 0.1.37 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 1a27d21aa2..dd537c4b21 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.37", + "version": "0.1.38-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,13 +24,13 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -43,10 +43,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index 629713540e..483329f784 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.1-next.0 + +### Patch Changes + +- c6690d9d24: Fix bug on fetching teams repositories where were being filtered by type service unnecessarily +- 04e1504e85: Support namespaced teams and fetch all kinds +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index 24909c5b5d..6f12e656ca 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.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,11 +35,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -49,9 +49,9 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index eea6cc0554..611f5dab40 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-gitops-profiles +## 0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.3.24 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index ee7b3da11b..3246b5edb7 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.24", + "version": "0.3.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,7 +35,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -48,10 +48,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 1df24b97cd..9c37f08aad 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gocd +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.12 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 1bf938fb1d..25af6a6d4d 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.12", + "version": "0.1.13-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,11 +31,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -49,10 +49,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 56cc49f3a4..8fb1c85078 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-graphiql +## 0.2.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.2.38 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 4cbbc7f262..9d933da2e1 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.38", + "version": "0.2.39-next.0", "private": false, "publishConfig": { "access": "public", @@ -34,7 +34,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -49,10 +49,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index d1426552e0..0f826cd492 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-graphql-backend +## 0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-catalog-graphql@0.3.11-next.0 + ## 0.1.23 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index d7b03bddf5..6293b17f4f 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.23", + "version": "0.1.24-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,9 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", - "@backstage/plugin-catalog-graphql": "^0.3.10", + "@backstage/plugin-catalog-graphql": "^0.3.11-next.0", "@graphql-tools/schema": "^8.3.1", "@types/express": "^4.17.6", "apollo-server": "^3.0.0", @@ -51,7 +51,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "msw": "^0.42.0", "supertest": "^6.1.3" diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index ef03c3797c..a5069b9352 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-home +## 0.4.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-stack-overflow@0.1.3-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.4.22 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index d1529a37fd..c3ec2f3a51 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.22", + "version": "0.4.23-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,12 +34,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", - "@backstage/plugin-stack-overflow": "^0.1.2", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", + "@backstage/plugin-stack-overflow": "^0.1.3-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index cd74af4e74..f6845ac116 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-ilert +## 0.1.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.32 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 341c934836..69a1728b76 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.1.32", + "version": "0.1.33-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,11 +24,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@date-io/luxon": "1.x", "@material-ui/core": "^4.12.2", @@ -43,10 +43,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index ef18b5708d..ff91e37269 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-jenkins-backend +## 0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.1.23 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 1ab98c3255..ac78d61831 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.23", + "version": "0.1.24-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,12 +25,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-auth-node": "^0.2.2", + "@backstage/plugin-auth-node": "^0.2.3-next.0", "@backstage/plugin-jenkins-common": "^0.1.5", "@backstage/plugin-permission-common": "^0.6.2", "@types/express": "^4.17.6", @@ -41,7 +41,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jenkins": "^0.23.1", "@types/supertest": "^2.0.8", "msw": "^0.42.0", diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index c47ac94a2b..78d9cf2532 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -26,7 +26,7 @@ "@backstage/plugin-permission-common": "^0.6.2" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index fd4e4420e7..4519ba9e78 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.7.5 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index ae86828505..586fcf04dd 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.5", + "version": "0.7.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,11 +35,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-jenkins-common": "^0.1.5", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -54,10 +54,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 32b147ffdd..9a912b07ef 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kafka-backend +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + ## 0.2.26 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 965b15bd6b..b78c297586 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.26", + "version": "0.2.27-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,8 +35,8 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@types/express": "^4.17.6", @@ -47,7 +47,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest-when": "^3.5.0", "@types/lodash": "^4.14.151", "jest-when": "^3.1.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index c2743bf92b..06d84866f6 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kafka +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 43f4b8d35c..18dfdc05fc 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.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,10 +24,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -39,10 +39,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index d829136819..a3747e47aa 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kubernetes-backend +## 0.7.0-next.0 + +### Minor Changes + +- 0791af993f: Refactor `KubernetesObjectsProvider` with new methods, `KubernetesServiceLocator` now takes an `Entity` instead of `serviceId` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/plugin-kubernetes-common@0.4.0-next.0 + ## 0.6.0 ### Minor Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 33dcc1dfff..5ee2dfbc61 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.6.0", + "version": "0.7.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,11 +36,11 @@ }, "dependencies": { "@azure/identity": "^2.0.4", - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-kubernetes-common": "^0.3.0", + "@backstage/plugin-kubernetes-common": "^0.4.0-next.0", "@google-cloud/container": "^4.0.0", "@kubernetes/client-node": "^0.16.0", "@types/express": "^4.17.6", @@ -61,7 +61,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/aws4": "^1.5.1", "aws-sdk-mock": "^5.2.1", "supertest": "^6.1.3" diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index d9f7e60c13..560f700be0 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-kubernetes-common +## 0.4.0-next.0 + +### Minor Changes + +- 0791af993f: Refactor `KubernetesObjectsProvider` with new methods, `KubernetesServiceLocator` now takes an `Entity` instead of `serviceId` + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + ## 0.3.0 ### Minor Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index 62c9eb9745..6b576f79ca 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.3.0", + "version": "0.4.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,11 +38,11 @@ "url": "https://github.com/backstage/backstage/issues" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@kubernetes/client-node": "^0.16.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "jest": { "roots": [ diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 29f0ed0241..3765441a95 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes +## 0.6.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-kubernetes-common@0.4.0-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.6.6 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 1b63484224..1bc3b47f3c 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.6.6", + "version": "0.6.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,12 +34,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", - "@backstage/plugin-kubernetes-common": "^0.3.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", + "@backstage/plugin-kubernetes-common": "^0.4.0-next.0", "@backstage/theme": "^0.2.15", "@kubernetes/client-node": "^0.16.0", "@material-ui/core": "^4.12.2", @@ -57,10 +57,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index 7dc3e30b1f..f3dc92b790 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-lighthouse +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 5f7097c704..2dc5aa5f04 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.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,11 +35,11 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -51,10 +51,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 54a058fcb9..b10750b453 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-newrelic-dashboard +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.14 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 8166928a6a..969853a9dc 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.1.14", + "version": "0.1.15-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,19 +23,19 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", "@testing-library/jest-dom": "^5.10.1", "@types/react": "^16.13.1 || ^17.0.0", "cross-fetch": "^3.1.5" diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index 97da241a56..7753c672c8 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-newrelic +## 0.3.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.3.24 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 09f3d3196d..7c67d63436 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.24", + "version": "0.3.25-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,7 +35,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -47,10 +47,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 73129feed6..0432f9ef45 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-org +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.5.6 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 2b62e81683..33d9f6da7f 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.5.6", + "version": "0.5.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,10 +29,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -48,11 +48,11 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index 3f6a54f367..5222d06b45 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,41 @@ # @backstage/plugin-pagerduty +## 0.5.0-next.0 + +### Minor Changes + +- 8798f8d93f: Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. + _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ + + **BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to + accept 2 arguments: config and ClientApiDependencies + The `PagerDutyClient` now relies on a `fetchApi` being available to execute `fetch` requests. + + **BREAKING** A new query method `getServiceByEntity` that is used to query for Services by either the `integrationKey` or `serviceId` + annotation values if they are defined. The `integrationKey` value is preferred currently over `serviceId`. As such, the previous + `getServiceByIntegrationKey` method has been removed. + + **BREAKING** The return values for each Client query method has been changed to return an object instead of raw values. + For example, the `getIncidentsByServiceId` query method now returns an object in the shape of `{ incidents: Incident[] }` + instead of just `Incident[]`. + This same pattern goes for `getChangeEventsByServiceId` and `getOnCallByPolicyId` functions. + + **BREAKING** All public exported types that relate to entities within PagerDuty have been prefixed with `PagerDuty` (e.g. `ServicesResponse` is now `PagerDutyServicesResponse` and `User` is now `PagerDutyUser`) + + In addition, various enhancements/bug fixes were introduced: + + - The `PagerDutyCard` component now wraps error and loading messages with an `InfoCard` to contain errors/messages. This enforces a consistent experience on the EntityPage + - If no service can be found for the provided integration key, a new Error Message Empty State component will be shown instead of an error alert + - Introduces the `fetchApi` to replace standard `window.fetch` + - ensures that Identity Authorization is respected and provided in API requests + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.4.0 ### Minor Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 6d11ee8d69..0c81aba5ad 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.4.0", + "version": "0.5.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,11 +34,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index 3a4de21e28..0a270b9f0a 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-periskop-backend +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index a555124743..bc27a76e81 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.4", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,7 +24,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@types/express": "*", "cross-fetch": "^3.0.6", @@ -35,7 +35,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "msw": "^0.42.0", "supertest": "^6.1.6" diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 9c5887509b..eb82d4cbac 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-periskop +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index c7c6af850b..b5c72b52fe 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.4", + "version": "0.1.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,11 +25,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -42,10 +42,10 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index f0e391d8d8..3c86015f00 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-backend +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + ## 0.5.8 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index fd3ce984cc..69762f67de 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.8", + "version": "0.5.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,12 +22,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-auth-node": "^0.2.2", + "@backstage/plugin-auth-node": "^0.2.3-next.0", "@backstage/plugin-permission-common": "^0.6.2", - "@backstage/plugin-permission-node": "^0.6.2", + "@backstage/plugin-permission-node": "^0.6.3-next.0", "@types/express": "*", "dataloader": "^2.0.0", "express": "^4.17.1", @@ -39,7 +39,7 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/lodash": "^4.14.151", "@types/supertest": "^2.0.8", "supertest": "^6.1.6", diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 82ab09c853..3988bc0ded 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -48,7 +48,7 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7", "msw": "^0.42.0" } diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 889b3ba374..190dfbdbb5 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-permission-node +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + ## 0.6.2 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 1281b4ecba..b6ef506197 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.6.2", + "version": "0.6.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,10 +33,10 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-auth-node": "^0.2.2", + "@backstage/plugin-auth-node": "^0.2.3-next.0", "@backstage/plugin-permission-common": "^0.6.2", "@types/express": "^4.17.6", "express": "^4.17.1", @@ -44,7 +44,7 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "msw": "^0.42.0", "supertest": "^6.1.3" diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index ffdb72d385..98f1200881 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -44,8 +44,8 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@types/jest": "^26.0.7" diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index b23cce864d..fe6aaf541d 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-proxy-backend +## 0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.2.27 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index a0f7668e3e..12a265516b 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.27", + "version": "0.2.28-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,7 +32,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@types/express": "^4.17.6", "express": "^4.17.1", @@ -46,7 +46,7 @@ "yup": "^0.32.9" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/http-proxy-middleware": "^0.19.3", "@types/supertest": "^2.0.8", "@types/uuid": "^8.0.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index 75e665c02d..1947f00622 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-rollbar-backend +## 0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.1.30 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 53fba7bfe3..bcea34e3c4 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.30", + "version": "0.1.31-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@types/express": "^4.17.6", "camelcase-keys": "^7.0.1", @@ -50,8 +50,8 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "msw": "^0.42.0", "supertest": "^6.1.3" diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index bb55d819a3..67288eb5f0 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-rollbar +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.4.6 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index 5633c9b09a..c75896f622 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.6", + "version": "0.4.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,10 +35,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 698a746a2a..199920e449 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/integration@1.2.2-next.0 + ## 0.2.8 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 630f672231..b6e7a04b64 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.8", + "version": "0.2.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,10 +23,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-scaffolder-backend": "^1.3.0", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-scaffolder-backend": "^1.4.0-next.0", "@backstage/config": "^1.0.1", "@backstage/types": "^1.0.0", "command-exists": "^1.2.9", @@ -35,7 +35,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/fs-extra": "^9.0.1", "@types/mock-fs": "^4.13.0", "@types/jest": "^26.0.7", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 6a1f59ef7e..d5967d3c5f 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + - @backstage/integration@1.2.2-next.0 + ## 0.4.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 1f755a8f81..2223c4787e 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.1", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,17 +24,17 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/plugin-scaffolder-backend": "^1.3.0", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/plugin-scaffolder-backend": "^1.4.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/types": "^1.0.0", "command-exists": "^1.2.9", "fs-extra": "^10.0.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/jest": "^26.0.7", "@types/node": "^16.11.26", "@types/command-exists": "^1.2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index a6da817ba6..367adc7034 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.4.0-next.0 + ## 0.2.6 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index b876b5e87c..123d563fad 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.6", + "version": "0.2.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,13 +24,13 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/plugin-scaffolder-backend": "^1.3.0", + "@backstage/plugin-scaffolder-backend": "^1.4.0-next.0", "@backstage/types": "^1.0.0", "winston": "^3.2.1", "yeoman-environment": "^3.9.1" }, "devDependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@types/jest": "^26.0.7" }, "files": [ diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 598de4122f..ba7ffe278c 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-scaffolder-backend +## 1.4.0-next.0 + +### Minor Changes + +- 3500c13a33: Added a new `/v2/dry-run` endpoint that allows for a synchronous dry run of a provided template. A `supportsDryRun` option has been added to `createTemplateAction`, which signals whether the action should be executed during dry runs. When enabled, the action context will have the new `isDryRun` property set to signal if the action is being executed during a dry run. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-backend@1.2.1-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-scaffolder-common@1.1.2-next.0 + ## 1.3.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 9dfe00672e..dba891bfa2 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.3.0", + "version": "1.4.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,14 +34,14 @@ "build:assets": "node scripts/build-nunjucks.js" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/plugin-catalog-backend": "^1.2.0", - "@backstage/plugin-scaffolder-common": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", + "@backstage/plugin-scaffolder-common": "^1.1.2-next.0", "@backstage/types": "^1.0.0", "@gitbeaker/core": "^35.6.0", "@gitbeaker/node": "^35.1.0", @@ -76,8 +76,8 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/git-url-parse": "^9.0.0", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 27a1abc7d2..1370f192f6 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-common +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + ## 1.1.1 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index beeec6430d..06d178caf3 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.1.1", + "version": "1.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,10 +39,10 @@ "url": "https://github.com/backstage/backstage/issues" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/types": "^1.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" } } diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 617fe95457..715c2136f8 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder +## 1.4.0-next.0 + +### Minor Changes + +- 3500c13a33: A new template editor has been added which is accessible via the context menu on the top right hand corner of the Create page. It allows you to load a template from a local directory, edit it with a preview, execute it in dry-run mode, and view the results. Note that the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API) must be supported by your browser for this to be available. + + To support the new template editor the `ScaffolderApi` now has an optional `dryRun` method, which is implemented by the default `ScaffolderClient`. + +### Patch Changes + +- 37539e29d8: The template editor now shows the cause of request errors that happen during a dry-run. +- 842282ecf9: Bumped `codemirror` dependencies to `v6.0.0`. +- 464bb0e6c8: The max content size for dry-run files has been reduced from 256k to 64k. +- a7c0b34d70: Swap usage of `MaterialTable` with `Table` from `core-components` +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-scaffolder-common@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + ## 1.3.0 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index c6da6b8f2f..2c81ef7162 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.3.0", + "version": "1.4.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,18 +35,18 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/integration-react": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/integration-react": "^1.1.2-next.0", "@backstage/plugin-catalog-common": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-permission-react": "^0.4.2", - "@backstage/plugin-scaffolder-common": "^1.1.1", + "@backstage/plugin-scaffolder-common": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", "@codemirror/language": "^6.0.0", @@ -80,11 +80,11 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/plugin-catalog": "^1.3.0", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/plugin-catalog": "^1.3.1-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index a4247a2210..72b81689dd 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@0.6.3-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 719e923c5b..99339ef99c 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": "0.1.5", + "version": "0.1.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -25,7 +25,7 @@ "dependencies": { "@acuris/aws-es-connection": "^2.2.0", "@backstage/config": "^1.0.1", - "@backstage/plugin-search-backend-node": "^0.6.2", + "@backstage/plugin-search-backend-node": "^0.6.3-next.0", "@backstage/plugin-search-common": "^0.3.5", "@elastic/elasticsearch": "7.13.0", "aws-sdk": "^2.948.0", @@ -35,8 +35,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/cli": "^0.17.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/cli": "^0.17.3-next.0", "@elastic/elasticsearch-mock": "^1.0.0" }, "files": [ diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index fe18f8254b..054c477cfb 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-backend-module-pg +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + ## 0.3.4 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index b34d2c65b8..cf072f5fe3 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.3.4", + "version": "0.3.5-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,15 +23,15 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/plugin-search-backend-node": "^0.6.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/plugin-search-backend-node": "^0.6.3-next.0", "@backstage/plugin-search-common": "^0.3.5", "lodash": "^4.17.21", "knex": "^1.0.2" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2" + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 82f83436cd..366cf55e6e 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-backend-node +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + ## 0.6.2 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 3ebfb8782f..0db5793549 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": "0.6.2", + "version": "0.6.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,8 +23,8 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@backstage/plugin-permission-common": "^0.6.2", @@ -38,8 +38,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/cli": "^0.17.2", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/ndjson": "^2.0.1" }, "files": [ diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index e214d6bb16..9640805095 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + ## 0.5.3 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 6daa65bcb4..bd2cc3ecb6 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": "0.5.3", + "version": "0.5.4-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -23,13 +23,13 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/plugin-auth-node": "^0.2.2", + "@backstage/plugin-auth-node": "^0.2.3-next.0", "@backstage/plugin-permission-common": "^0.6.2", - "@backstage/plugin-permission-node": "^0.6.2", - "@backstage/plugin-search-backend-node": "^0.6.2", + "@backstage/plugin-permission-node": "^0.6.3-next.0", + "@backstage/plugin-search-backend-node": "^0.6.3-next.0", "@backstage/plugin-search-common": "^0.3.5", "@backstage/types": "^1.0.0", "@types/express": "^4.17.6", @@ -43,7 +43,7 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" }, diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index ae4c65d11e..86005e8756 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -43,7 +43,7 @@ "@backstage/plugin-permission-common": "^0.6.2" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "jest": { "roots": [ diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 5f38994eeb..0d203f1c06 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-search-react +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.2.1 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index c0914e6409..925804ea52 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "0.2.1", + "version": "0.2.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,7 +32,7 @@ }, "dependencies": { "@backstage/plugin-search-common": "^0.3.5", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/version-bridge": "^1.0.1", "@backstage/theme": "^0.2.15", @@ -48,8 +48,8 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/core-app-api": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", "@testing-library/jest-dom": "^5.10.1", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 6283cee29b..985b7807c3 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search +## 0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + ## 0.9.0 ### Minor Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index b658490b00..196b09a874 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": "0.9.0", + "version": "0.9.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,14 +33,14 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-search-common": "^0.3.5", - "@backstage/plugin-search-react": "^0.2.1", + "@backstage/plugin-search-react": "^0.2.2-next.0", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", "@backstage/version-bridge": "^1.0.1", @@ -57,10 +57,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 1a469a83af..7a87d94aa6 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sentry +## 0.3.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.44 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index a75447f0ab..aaa008b368 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.3.44", + "version": "0.3.45-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,10 +35,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 4513e09dab..6343bf2b58 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-shortcuts +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index d1d3f9fba4..651cbf64e1 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.2.7", + "version": "0.2.8-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,7 +24,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", @@ -42,10 +42,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 2b3d6840da..01b09623e4 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sonarqube +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index d9310ffdde..6deb2cbebd 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.3.6", + "version": "0.3.7-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,10 +36,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -53,10 +53,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index e65afb1285..d7f227a116 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-splunk-on-call +## 0.3.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.3.30 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index baecd2f9c5..ca97ebca34 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.3.30", + "version": "0.3.31-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,10 +34,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -51,10 +51,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index d0f5f39f4b..0b0845b7b6 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-stack-overflow +## 0.1.3-next.0 + +### Patch Changes + +- 12ae3eed2f: - Publicly exports `StackOverflowIcon`. + - `HomePageStackOverflowQuestions` accepts optional icon property. +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-home@0.4.23-next.0 + ## 0.1.2 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 1438ddcd50..922277c74a 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.2", + "version": "0.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,9 +24,9 @@ }, "dependencies": { "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/plugin-home": "^0.4.22", + "@backstage/plugin-home": "^0.4.23-next.0", "@backstage/plugin-search-common": "^0.3.5", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -42,10 +42,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/jest": "^26.0.7", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index ba2392b5ee..3911f2111f 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + ## 0.1.17 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index a6782c57fb..c1d9b020e6 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.17", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,11 +34,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@backstage/plugin-tech-insights-common": "^0.2.4", - "@backstage/plugin-tech-insights-node": "^0.3.1", + "@backstage/plugin-tech-insights-node": "^0.3.2-next.0", "ajv": "^8.10.0", "json-rules-engine": "^6.1.2", "lodash": "^4.17.21", @@ -46,7 +46,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 9e496d9046..41b303b5ca 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-tech-insights-backend +## 0.4.2-next.0 + +### Patch Changes + +- 2ef58ab539: TechInsightsBackend: Added missing 'scheduler' to code examples +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/plugin-tech-insights-node@0.3.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.4.1 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 5ae890ae1b..5461f22789 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.4.1", + "version": "0.4.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,14 +34,14 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@backstage/plugin-tech-insights-common": "^0.2.4", - "@backstage/plugin-tech-insights-node": "^0.3.1", + "@backstage/plugin-tech-insights-node": "^0.3.2-next.0", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", @@ -54,8 +54,8 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "@types/semver": "^7.3.8", "supertest": "^6.1.3", diff --git a/plugins/tech-insights-common/package.json b/plugins/tech-insights-common/package.json index bc9bbcd792..5d6bc49611 100644 --- a/plugins/tech-insights-common/package.json +++ b/plugins/tech-insights-common/package.json @@ -38,7 +38,7 @@ "@backstage/types": "^1.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2-next.0" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index c6af55abd5..64d150d275 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-tech-insights-node +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + ## 0.3.1 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 904f149d6c..f4e53ca987 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.3.1", + "version": "0.3.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,7 +33,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", + "@backstage/backend-common": "^0.14.1-next.0", "@backstage/config": "^1.0.1", "@backstage/plugin-tech-insights-common": "^0.2.4", "@backstage/types": "^1.0.0", @@ -42,7 +42,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2" + "@backstage/cli": "^0.17.3-next.0" }, "files": [ "dist" diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 867f639067..3a900ddda9 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-tech-insights +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.2.2 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 0956db7cf3..bcf8037b5d 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.2.2", + "version": "0.2.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,11 +28,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-tech-insights-common": "^0.2.4", "@backstage/theme": "^0.2.15", "@backstage/types": "^1.0.0", @@ -47,10 +47,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index 049a1b9c4c..96455c64b1 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-tech-radar +## 0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.5.13 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index de2eab6fd1..4bd4462cd1 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.5.13", + "version": "0.5.14-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -49,10 +49,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index aabdec8922..711a426a6a 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + - @backstage/test-utils@1.1.2-next.0 + ## 1.0.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 35d176566e..0debd31d49 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.1", + "version": "1.0.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,15 +32,15 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/core-components": "^0.9.5", - "@backstage/core-app-api": "^1.0.3", + "@backstage/core-components": "^0.9.6-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-catalog": "^1.3.0", - "@backstage/plugin-search-react": "^0.2.1", - "@backstage/plugin-techdocs": "^1.2.0", - "@backstage/plugin-techdocs-react": "^1.0.1", - "@backstage/test-utils": "^1.1.1", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-catalog": "^1.3.1-next.0", + "@backstage/plugin-search-react": "^0.2.2-next.0", + "@backstage/plugin-techdocs": "^1.2.1-next.0", + "@backstage/plugin-techdocs-react": "^1.0.2-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", @@ -56,8 +56,8 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/dev-utils": "^1.0.3", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 861bf37bef..b8bdde8fca 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-backend +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-techdocs-node@1.1.3-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 1.1.2 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index d7e9326fe5..bf29eeb9af 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.1.2", + "version": "1.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,16 +34,16 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/plugin-catalog-common": "^1.0.3", "@backstage/plugin-permission-common": "^0.6.2", "@backstage/plugin-search-common": "^0.3.5", - "@backstage/plugin-techdocs-node": "^1.1.2", + "@backstage/plugin-techdocs-node": "^1.1.3-next.0", "@types/express": "^4.17.6", "dockerode": "^3.3.1", "express": "^4.17.1", @@ -56,9 +56,9 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/backend-test-utils": "^0.1.25", - "@backstage/cli": "^0.17.2", - "@backstage/plugin-search-backend-node": "0.6.2", + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/plugin-search-backend-node": "0.6.3-next.0", "@types/dockerode": "^3.3.0", "msw": "^0.42.0", "supertest": "^6.1.3" diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 4219157392..1a1d9812bb 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + ## 1.0.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 92c0d8d4af..864262b773 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.1", + "version": "1.0.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,11 +34,11 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", - "@backstage/integration": "^1.2.1", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-techdocs-react": "^1.0.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-techdocs-react": "^1.0.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", @@ -51,11 +51,11 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/plugin-techdocs-addons-test-utils": "^1.0.1", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/plugin-techdocs-addons-test-utils": "^1.0.2-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 1902f80171..8a99e3a036 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-techdocs-node +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + ## 1.1.2 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 9cd737db80..8d9e493d05 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.1.2", + "version": "1.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -42,11 +42,11 @@ "dependencies": { "@azure/identity": "^2.0.1", "@azure/storage-blob": "^12.5.0", - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@backstage/plugin-search-common": "^0.3.5", "@google-cloud/storage": "^6.0.0", "@trendyol-js/openstack-swift-sdk": "^0.0.5", @@ -64,7 +64,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/fs-extra": "^9.0.5", "@types/js-yaml": "^4.0.0", "@types/mime-types": "^2.1.0", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 904eacff26..6feb9062d3 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-techdocs-react +## 1.0.2-next.0 + +### Patch Changes + +- c3cfc83af2: Updated JSDoc to be MDX compatible. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + ## 1.0.1 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index f4a51bfe42..698cff4c84 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.0.1", + "version": "1.0.2-next.0", "private": false, "publishConfig": { "access": "public", @@ -35,8 +35,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/version-bridge": "^1.0.1", "@material-ui/core": "^4.12.2", @@ -56,7 +56,7 @@ "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", - "@backstage/test-utils": "^1.1.1", + "@backstage/test-utils": "^1.1.2-next.0", "@backstage/theme": "^0.2.15" }, "files": [ diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 91babd6fba..b7367c4ee5 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs +## 1.2.1-next.0 + +### Patch Changes + +- 3cbebf710e: Reorder browser tab title in Techdocs pages to have the site name first. +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + ## 1.2.0 ### Minor Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 45c6d98aec..9890173851 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.2.0", + "version": "1.2.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,17 +35,17 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", - "@backstage/integration-react": "^1.1.1", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/integration-react": "^1.1.2-next.0", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/plugin-search-common": "^0.3.5", - "@backstage/plugin-search-react": "^0.2.1", - "@backstage/plugin-techdocs-react": "^1.0.1", + "@backstage/plugin-search-react": "^0.2.2-next.0", + "@backstage/plugin-techdocs-react": "^1.0.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -67,10 +67,10 @@ "react-dom": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.0", diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 8fc6adbfcb..e2cec9e01e 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-todo-backend +## 0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/integration@1.2.2-next.0 + - @backstage/catalog-client@1.0.4-next.0 + ## 0.1.30 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index 235e05a93b..97053da997 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.30", + "version": "0.1.31-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,12 +29,12 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/catalog-client": "^1.0.3", - "@backstage/catalog-model": "^1.0.3", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-client": "^1.0.4-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", - "@backstage/integration": "^1.2.1", + "@backstage/integration": "^1.2.2-next.0", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", @@ -43,7 +43,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/supertest": "^2.0.8", "msw": "^0.42.0", "supertest": "^6.1.3" diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 77eda64a68..a1ef01aea5 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-todo +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.2.8 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 7fbf79cd3a..0e17b6ef10 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.8", + "version": "0.2.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,11 +30,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -45,10 +45,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 81cc4a891f..1fcdc650d1 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-user-settings +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.4.5 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index aa4335856e..e186e2539d 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.4.5", + "version": "0.4.6-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,7 +34,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", @@ -48,10 +48,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 302b27afa8..5c12ada8f5 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-vault-backend +## 0.2.0-next.0 + +### Minor Changes + +- 5ebf2c7023: Throw exceptions instead of swallow them, remove some exported types from the `api-report`, small changes in the API responses & expose the vault `baseUrl` to the frontend as well + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/backend-tasks@0.3.3-next.0 + - @backstage/backend-test-utils@0.1.26-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index d0e3990aee..490a19be6d 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.1.0", + "version": "0.2.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,9 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/backend-common": "^0.14.0", - "@backstage/backend-tasks": "^0.3.2", - "@backstage/backend-test-utils": "^0.1.25", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/backend-tasks": "^0.3.3-next.0", + "@backstage/backend-test-utils": "^0.1.26-next.0", "@backstage/config": "^1.0.1", "@backstage/errors": "^1.0.0", "@types/express": "*", @@ -51,7 +51,7 @@ "yn": "^5.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", + "@backstage/cli": "^0.17.3-next.0", "@types/compression": "^1.7.2", "@types/supertest": "^2.0.8", "msw": "^0.42.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index 205b537dd4..3b371bf5b9 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-vault +## 0.1.1-next.0 + +### Patch Changes + +- 5ebf2c7023: Export missing parameters and added them to the api-report. Also adapted the API to the expected response from the backend +- Updated dependencies + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index c4b447eaca..01b3182641 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.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,11 +34,11 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/catalog-model": "^1.0.3", - "@backstage/core-components": "^0.9.5", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", - "@backstage/plugin-catalog-react": "^1.1.1", + "@backstage/plugin-catalog-react": "^1.1.2-next.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -49,10 +49,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 01d99a138f..3e1e1ad9c2 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-xcmetrics +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.0 + ## 0.2.26 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 1c93a9c8cb..1ab1c9f844 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.26", + "version": "0.2.27-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,7 +24,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@backstage/core-components": "^0.9.5", + "@backstage/core-components": "^0.9.6-next.0", "@backstage/core-plugin-api": "^1.0.3", "@backstage/errors": "^1.0.0", "@backstage/theme": "^0.2.15", @@ -40,10 +40,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.2", - "@backstage/core-app-api": "^1.0.3", - "@backstage/dev-utils": "^1.0.3", - "@backstage/test-utils": "^1.1.1", + "@backstage/cli": "^0.17.3-next.0", + "@backstage/core-app-api": "^1.0.4-next.0", + "@backstage/dev-utils": "^1.0.4-next.0", + "@backstage/test-utils": "^1.1.2-next.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/yarn.lock b/yarn.lock index e5a30f4b9e..4b0ab66cef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1512,6 +1512,169 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@backstage/catalog-client@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@backstage/catalog-client/-/catalog-client-1.0.3.tgz#cb91472ccc31df322f69e7e4e80939b3535660cd" + integrity sha512-35Es9jFB9jOZTEtEeCyZHES0bcQkfX4qbmY1GuC6e6ZtO120w+595kmKxc744d7X2WXUIWvhRubqc9/w5blKbg== + dependencies: + "@backstage/catalog-model" "^1.0.3" + "@backstage/errors" "^1.0.0" + cross-fetch "^3.1.5" + +"@backstage/catalog-model@^1.0.0", "@backstage/catalog-model@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@backstage/catalog-model/-/catalog-model-1.0.3.tgz#0d7bd832add56650871b95894878540fc41a4ef9" + integrity sha512-rbXdA/CI8EzpsthlSI4JonLd4RZoki7IN6tFvivjKDMlW8IVb63BJXWO4VnvHH+LLYzH4/OaL051YeoaicdqYw== + dependencies: + "@backstage/config" "^1.0.1" + "@backstage/errors" "^1.0.0" + "@backstage/types" "^1.0.0" + ajv "^8.10.0" + json-schema "^0.4.0" + lodash "^4.17.21" + uuid "^8.0.0" + +"@backstage/core-components@^0.9.0", "@backstage/core-components@^0.9.5": + version "0.9.5" + resolved "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.9.5.tgz#5a0b34867aaee0549bfa67b39a69c09588fa3c7a" + integrity sha512-kfAdN70idiEqHeH9ZQryn6C0RxJEKiRc/7srYIz0CVV88zJfc0nmZ5C/S10Gkht2xWfm95tTSw2P1vEYIBbfxg== + dependencies: + "@backstage/config" "^1.0.1" + "@backstage/core-plugin-api" "^1.0.3" + "@backstage/errors" "^1.0.0" + "@backstage/theme" "^0.2.15" + "@backstage/version-bridge" "^1.0.1" + "@material-table/core" "^3.1.0" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@material-ui/lab" "4.0.0-alpha.57" + "@react-hookz/web" "^14.0.0" + "@types/react-sparklines" "^1.7.0" + "@types/react-text-truncate" "^0.14.0" + ansi-regex "^6.0.1" + classnames "^2.2.6" + d3-selection "^3.0.0" + d3-shape "^3.0.0" + d3-zoom "^3.0.0" + dagre "^0.8.5" + history "^5.0.0" + immer "^9.0.1" + lodash "^4.17.21" + pluralize "^8.0.0" + prop-types "^15.7.2" + qs "^6.9.4" + rc-progress "3.3.3" + react-helmet "6.1.0" + react-hook-form "^7.12.2" + react-markdown "^8.0.0" + react-router "6.0.0-beta.0" + react-router-dom "6.0.0-beta.0" + react-sparklines "^1.7.0" + react-syntax-highlighter "^15.4.5" + react-text-truncate "^0.19.0" + react-use "^17.3.2" + react-virtualized-auto-sizer "^1.0.6" + react-window "^1.8.6" + remark-gfm "^3.0.1" + zen-observable "^0.8.15" + zod "^3.11.6" + +"@backstage/integration-react@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@backstage/integration-react/-/integration-react-1.1.1.tgz#936fd1441c47709fa8825360ea14ada26046b910" + integrity sha512-vCXErMhj90eW74A9gQwgKrc0Go5RXSEyM1wQV6+S91CZHYc3fdQJAfrxcmmUybGFtX2a2Yrmm67K8owG9WaYnQ== + dependencies: + "@backstage/config" "^1.0.1" + "@backstage/core-components" "^0.9.5" + "@backstage/core-plugin-api" "^1.0.3" + "@backstage/integration" "^1.2.1" + "@backstage/theme" "^0.2.15" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@material-ui/lab" "4.0.0-alpha.57" + react-use "^17.2.4" + +"@backstage/integration@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@backstage/integration/-/integration-1.2.1.tgz#a1931d240c2fbd304f0b87d54272709f4ffe83ed" + integrity sha512-9rXD1iIGhKRCfowxWx9sRKxiv1JvDI6ucvtUeXIj1G27kT/Xy7uUcgB8CkVxsvSeog5Z1VdYkFkDmQbKQ6GPrg== + dependencies: + "@backstage/config" "^1.0.1" + "@backstage/errors" "^1.0.0" + "@octokit/auth-app" "^3.4.0" + "@octokit/rest" "^18.5.3" + cross-fetch "^3.1.5" + git-url-parse "^11.6.0" + lodash "^4.17.21" + luxon "^2.0.2" + +"@backstage/plugin-catalog-react@^1.0.0", "@backstage/plugin-catalog-react@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.1.1.tgz#0441bcf1291349ad355ff51e28245d7ea26a3e01" + integrity sha512-HxowTsFaNmAp+TEb0YgBak/61SkwwRV3tUdF5O2dQugbgI3Ci8dMjN2J18LiOEFS13m6IlrCpNC1Db3QMRjwBA== + dependencies: + "@backstage/catalog-client" "^1.0.3" + "@backstage/catalog-model" "^1.0.3" + "@backstage/core-components" "^0.9.5" + "@backstage/core-plugin-api" "^1.0.3" + "@backstage/errors" "^1.0.0" + "@backstage/integration" "^1.2.1" + "@backstage/plugin-catalog-common" "^1.0.3" + "@backstage/plugin-permission-common" "^0.6.2" + "@backstage/plugin-permission-react" "^0.4.2" + "@backstage/theme" "^0.2.15" + "@backstage/types" "^1.0.0" + "@backstage/version-bridge" "^1.0.1" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@material-ui/lab" "4.0.0-alpha.57" + classnames "^2.2.6" + jwt-decode "^3.1.0" + lodash "^4.17.21" + qs "^6.9.4" + react-router "6.0.0-beta.0" + react-use "^17.2.4" + yaml "^1.10.0" + zen-observable "^0.8.15" + +"@backstage/plugin-home@^0.4.19", "@backstage/plugin-home@^0.4.22": + version "0.4.22" + resolved "https://registry.npmjs.org/@backstage/plugin-home/-/plugin-home-0.4.22.tgz#efc54ebffb83a2a36dcd43e65142c30be5d8559d" + integrity sha512-0LPCyz1/nJraVdq+vkpS8g+8rnVTqY9oz5a+tOEnA6Beldlnd1xGa/qYfaH7s/5jFjd+XQRYoNw7qvioHLC16Q== + dependencies: + "@backstage/catalog-model" "^1.0.3" + "@backstage/config" "^1.0.1" + "@backstage/core-components" "^0.9.5" + "@backstage/core-plugin-api" "^1.0.3" + "@backstage/plugin-catalog-react" "^1.1.1" + "@backstage/plugin-stack-overflow" "^0.1.2" + "@backstage/theme" "^0.2.15" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@material-ui/lab" "4.0.0-alpha.57" + lodash "^4.17.21" + react-router "6.0.0-beta.0" + react-use "^17.2.4" + +"@backstage/plugin-stack-overflow@^0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@backstage/plugin-stack-overflow/-/plugin-stack-overflow-0.1.2.tgz#bc140bb22d239a7106f91ea1d4c637551dc91ca5" + integrity sha512-6phLbR7E/iZjuNFFStsO2zcJYDijPTS8WEyxhM/rX1Q/OeliMgGBs8V4j1hfHgcjjLz4PPI+EDz/+eeDMi1c4w== + dependencies: + "@backstage/config" "^1.0.1" + "@backstage/core-components" "^0.9.5" + "@backstage/core-plugin-api" "^1.0.3" + "@backstage/plugin-home" "^0.4.22" + "@backstage/plugin-search-common" "^0.3.5" + "@backstage/theme" "^0.2.15" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@testing-library/jest-dom" "^5.10.1" + cross-fetch "^3.1.5" + lodash "^4.17.21" + qs "^6.9.4" + react-use "^17.2.4" + "@balena/dockerignore@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" @@ -12284,62 +12447,62 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" "example-app@link:packages/app": - version "0.2.72" + version "0.2.73-next.0" dependencies: - "@backstage/app-defaults" "^1.0.3" - "@backstage/catalog-model" "^1.0.3" - "@backstage/cli" "^0.17.2" + "@backstage/app-defaults" "^1.0.4-next.0" + "@backstage/catalog-model" "^1.1.0-next.0" + "@backstage/cli" "^0.17.3-next.0" "@backstage/config" "^1.0.1" - "@backstage/core-app-api" "^1.0.3" - "@backstage/core-components" "^0.9.5" + "@backstage/core-app-api" "^1.0.4-next.0" + "@backstage/core-components" "^0.9.6-next.0" "@backstage/core-plugin-api" "^1.0.3" - "@backstage/integration-react" "^1.1.1" - "@backstage/plugin-airbrake" "^0.3.6" - "@backstage/plugin-apache-airflow" "^0.1.14" - "@backstage/plugin-api-docs" "^0.8.6" - "@backstage/plugin-azure-devops" "^0.1.22" - "@backstage/plugin-badges" "^0.2.30" - "@backstage/plugin-catalog" "^1.3.0" + "@backstage/integration-react" "^1.1.2-next.0" + "@backstage/plugin-airbrake" "^0.3.7-next.0" + "@backstage/plugin-apache-airflow" "^0.1.15-next.0" + "@backstage/plugin-api-docs" "^0.8.7-next.0" + "@backstage/plugin-azure-devops" "^0.1.23-next.0" + "@backstage/plugin-badges" "^0.2.31-next.0" + "@backstage/plugin-catalog" "^1.3.1-next.0" "@backstage/plugin-catalog-common" "^1.0.3" - "@backstage/plugin-catalog-graph" "^0.2.18" - "@backstage/plugin-catalog-import" "^0.8.9" - "@backstage/plugin-catalog-react" "^1.1.1" - "@backstage/plugin-circleci" "^0.3.6" - "@backstage/plugin-cloudbuild" "^0.3.6" - "@backstage/plugin-code-coverage" "^0.1.33" - "@backstage/plugin-cost-insights" "^0.11.28" - "@backstage/plugin-dynatrace" "^0.1.0" - "@backstage/plugin-explore" "^0.3.37" - "@backstage/plugin-gcalendar" "^0.3.2" - "@backstage/plugin-gcp-projects" "^0.3.25" - "@backstage/plugin-github-actions" "^0.5.6" - "@backstage/plugin-gocd" "^0.1.12" - "@backstage/plugin-graphiql" "^0.2.38" - "@backstage/plugin-home" "^0.4.22" - "@backstage/plugin-jenkins" "^0.7.5" - "@backstage/plugin-kafka" "^0.3.6" - "@backstage/plugin-kubernetes" "^0.6.6" - "@backstage/plugin-lighthouse" "^0.3.6" - "@backstage/plugin-newrelic" "^0.3.24" - "@backstage/plugin-newrelic-dashboard" "^0.1.14" - "@backstage/plugin-org" "^0.5.6" - "@backstage/plugin-pagerduty" "0.4.0" + "@backstage/plugin-catalog-graph" "^0.2.19-next.0" + "@backstage/plugin-catalog-import" "^0.8.10-next.0" + "@backstage/plugin-catalog-react" "^1.1.2-next.0" + "@backstage/plugin-circleci" "^0.3.7-next.0" + "@backstage/plugin-cloudbuild" "^0.3.7-next.0" + "@backstage/plugin-code-coverage" "^0.1.34-next.0" + "@backstage/plugin-cost-insights" "^0.11.29-next.0" + "@backstage/plugin-dynatrace" "^0.1.1-next.0" + "@backstage/plugin-explore" "^0.3.38-next.0" + "@backstage/plugin-gcalendar" "^0.3.3-next.0" + "@backstage/plugin-gcp-projects" "^0.3.26-next.0" + "@backstage/plugin-github-actions" "^0.5.7-next.0" + "@backstage/plugin-gocd" "^0.1.13-next.0" + "@backstage/plugin-graphiql" "^0.2.39-next.0" + "@backstage/plugin-home" "^0.4.23-next.0" + "@backstage/plugin-jenkins" "^0.7.6-next.0" + "@backstage/plugin-kafka" "^0.3.7-next.0" + "@backstage/plugin-kubernetes" "^0.6.7-next.0" + "@backstage/plugin-lighthouse" "^0.3.7-next.0" + "@backstage/plugin-newrelic" "^0.3.25-next.0" + "@backstage/plugin-newrelic-dashboard" "^0.1.15-next.0" + "@backstage/plugin-org" "^0.5.7-next.0" + "@backstage/plugin-pagerduty" "0.5.0-next.0" "@backstage/plugin-permission-react" "^0.4.2" - "@backstage/plugin-rollbar" "^0.4.6" - "@backstage/plugin-scaffolder" "^1.3.0" - "@backstage/plugin-search" "^0.9.0" + "@backstage/plugin-rollbar" "^0.4.7-next.0" + "@backstage/plugin-scaffolder" "^1.4.0-next.0" + "@backstage/plugin-search" "^0.9.1-next.0" "@backstage/plugin-search-common" "^0.3.5" - "@backstage/plugin-search-react" "^0.2.1" - "@backstage/plugin-sentry" "^0.3.44" - "@backstage/plugin-shortcuts" "^0.2.7" - "@backstage/plugin-stack-overflow" "^0.1.2" - "@backstage/plugin-tech-insights" "^0.2.2" - "@backstage/plugin-tech-radar" "^0.5.13" - "@backstage/plugin-techdocs" "^1.2.0" - "@backstage/plugin-techdocs-module-addons-contrib" "^1.0.1" - "@backstage/plugin-techdocs-react" "^1.0.1" - "@backstage/plugin-todo" "^0.2.8" - "@backstage/plugin-user-settings" "^0.4.5" + "@backstage/plugin-search-react" "^0.2.2-next.0" + "@backstage/plugin-sentry" "^0.3.45-next.0" + "@backstage/plugin-shortcuts" "^0.2.8-next.0" + "@backstage/plugin-stack-overflow" "^0.1.3-next.0" + "@backstage/plugin-tech-insights" "^0.2.3-next.0" + "@backstage/plugin-tech-radar" "^0.5.14-next.0" + "@backstage/plugin-techdocs" "^1.2.1-next.0" + "@backstage/plugin-techdocs-module-addons-contrib" "^1.0.2-next.0" + "@backstage/plugin-techdocs-react" "^1.0.2-next.0" + "@backstage/plugin-todo" "^0.2.9-next.0" + "@backstage/plugin-user-settings" "^0.4.6-next.0" "@backstage/theme" "^0.2.15" "@material-ui/core" "^4.12.2" "@material-ui/icons" "^4.9.1" @@ -24193,20 +24356,20 @@ tdigest@^0.1.1: bintrees "1.0.1" "techdocs-cli-embedded-app@link:packages/techdocs-cli-embedded-app": - version "0.2.71" + version "0.2.72-next.0" dependencies: - "@backstage/app-defaults" "^1.0.3" - "@backstage/catalog-model" "^1.0.3" - "@backstage/cli" "^0.17.2" + "@backstage/app-defaults" "^1.0.4-next.0" + "@backstage/catalog-model" "^1.1.0-next.0" + "@backstage/cli" "^0.17.3-next.0" "@backstage/config" "^1.0.1" - "@backstage/core-app-api" "^1.0.3" - "@backstage/core-components" "^0.9.5" + "@backstage/core-app-api" "^1.0.4-next.0" + "@backstage/core-components" "^0.9.6-next.0" "@backstage/core-plugin-api" "^1.0.3" - "@backstage/integration-react" "^1.1.1" - "@backstage/plugin-catalog" "^1.3.0" - "@backstage/plugin-techdocs" "^1.2.0" - "@backstage/plugin-techdocs-react" "^1.0.1" - "@backstage/test-utils" "^1.1.1" + "@backstage/integration-react" "^1.1.2-next.0" + "@backstage/plugin-catalog" "^1.3.1-next.0" + "@backstage/plugin-techdocs" "^1.2.1-next.0" + "@backstage/plugin-techdocs-react" "^1.0.2-next.0" + "@backstage/test-utils" "^1.1.2-next.0" "@backstage/theme" "^0.2.15" "@material-ui/core" "^4.11.0" "@material-ui/icons" "^4.9.1" From 65ab365be22346bb43e9ea3c17d768a7eb6b2b36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 09:09:37 +0000 Subject: [PATCH 225/590] fix(deps): update dependency isomorphic-git to v1.18.3 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5a30f4b9e..f19c47b5b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15516,9 +15516,9 @@ isomorphic-form-data@^2.0.0: form-data "^2.3.2" isomorphic-git@^1.8.0: - version "1.17.3" - resolved "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.17.3.tgz#d4a4e7a2defc7e9c80d4d0bfd43c1e7d2bfb25ee" - integrity sha512-jEQtmg1lJ8ZiJLjJCCJDDIdXaeoHwqHFY7QCLgNw7GzZ6MktXLzKXnQsFRfIcm7sNYGt+w1/6FQTwO9zoHq/Fw== + version "1.18.3" + resolved "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.18.3.tgz#b2ef91688ac8f4315a8f3ce72f24a76c17bf61ad" + integrity sha512-CVTNt0uU5RQ4g626LxqUyShdoeD15uZppKA0tk7iY/PyikCbRG594a7BksU4JZcOC6RsqUkURdIlFyKhAfdbqg== dependencies: async-lock "^1.1.0" clean-git-ref "^2.0.1" From ec4ddcb36bad60120d9efbd46e5af91e3bfbc6af Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 09:10:32 +0000 Subject: [PATCH 226/590] fix(deps): update dependency octokit to v1.8.0 Signed-off-by: Renovate Bot --- yarn.lock | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5a30f4b9e..bbf9cd7eb4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4732,6 +4732,11 @@ resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== +"@octokit/openapi-types@^12.4.0": + version "12.4.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.4.0.tgz#fd8bf5db72bd566c5ba2cb76754512a9ebe66e71" + integrity sha512-Npcb7Pv30b33U04jvcD7l75yLU0mxhuX2Xqrn51YyZ5WTkF04bpbxLaZ6GcaTqu03WZQHoO/Gbfp95NGRueDUA== + "@octokit/openapi-types@^7.3.2": version "7.3.2" resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-7.3.2.tgz#065ce49b338043ec7f741316ce06afd4d459d944" @@ -4749,6 +4754,13 @@ dependencies: "@octokit/types" "^6.34.0" +"@octokit/plugin-paginate-rest@^2.18.0": + version "2.19.0" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.19.0.tgz#b52eae6ecacfa1f5583dc2cc0985cfbed3ca78b0" + integrity sha512-hQ4Qysg2hNmEMuZeJkvyzM4eSZiTifOKqYAMsW8FnxFKowhuwWICSgBQ9Gn9GpUmgKB7qaf1hFvMjYaTAg5jQA== + dependencies: + "@octokit/types" "^6.36.0" + "@octokit/plugin-paginate-rest@^2.6.2": version "2.7.0" resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.7.0.tgz#6bb7b043c246e0654119a6ec4e72a172c9e2c7f3" @@ -4782,6 +4794,14 @@ "@octokit/types" "^6.34.0" deprecation "^2.3.1" +"@octokit/plugin-rest-endpoint-methods@^5.14.0": + version "5.15.0" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.15.0.tgz#6c8251b55c33315a6e53e5b55654f72023ed5049" + integrity sha512-Gsw9+Xm56jVhfbJoy4pt6eOOyf8/3K6CAnx1Sl7U2GhZWcg8MR6YgXWnpfdF69S2ViMXLA7nfvTDAsZpFlkLRw== + dependencies: + "@octokit/types" "^6.36.0" + deprecation "^2.3.1" + "@octokit/plugin-retry@^3.0.9": version "3.0.9" resolved "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz#ae625cca1e42b0253049102acd71c1d5134788fe" @@ -4853,13 +4873,20 @@ dependencies: "@octokit/openapi-types" "^7.3.2" -"@octokit/types@^6.26.0", "@octokit/types@^6.27.1", "@octokit/types@^6.34.0": +"@octokit/types@^6.27.1", "@octokit/types@^6.34.0": version "6.34.0" resolved "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== dependencies: "@octokit/openapi-types" "^11.2.0" +"@octokit/types@^6.35.0", "@octokit/types@^6.36.0": + version "6.37.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.37.0.tgz#32eb78edb34cf5cea4ba5753ab8db75b776d617a" + integrity sha512-BXWQhFKRkjX4dVW5L2oYa0hzWOAqsEsujXsQLSdepPoDZfYdubrD1KDGpyNldGXtR8QM/WezDcxcIN1UKJMGPA== + dependencies: + "@octokit/openapi-types" "^12.4.0" + "@octokit/webhooks-methods@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-2.0.0.tgz#1108b9ea661ca6c81e4a8bfa63a09eb27d5bc2db" @@ -19326,18 +19353,18 @@ octokit-plugin-create-pull-request@^3.10.0: "@octokit/types" "^6.8.2" octokit@^1.7.1: - version "1.7.2" - resolved "https://registry.npmjs.org/octokit/-/octokit-1.7.2.tgz#c5f11699c39ba5526ff170cbfcb7eaa291ddf11a" - integrity sha512-C+iwOeUMWwbvHxGbLX5rAde5WuEVGe/hNQniU1haZAPMHqUz1+ppffvkP4v/2R3dkSLJnzceUG+ir0klNmEoBA== + version "1.8.0" + resolved "https://registry.npmjs.org/octokit/-/octokit-1.8.0.tgz#c2ea6ace083b3be1d594aa7eb2e05fccd14e7ca5" + integrity sha512-HtArk9ttGy5effKNiaqKCirR6VSZoYjqgLgvVm/1mSRR4WYmww5DHjLnZlCbvj8+DwBLLLduJ3XnX/SPCCcp6A== dependencies: "@octokit/app" "^12.0.4" "@octokit/core" "^3.5.1" "@octokit/oauth-app" "^3.5.1" - "@octokit/plugin-paginate-rest" "^2.16.8" - "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + "@octokit/plugin-paginate-rest" "^2.18.0" + "@octokit/plugin-rest-endpoint-methods" "^5.14.0" "@octokit/plugin-retry" "^3.0.9" "@octokit/plugin-throttling" "^3.5.1" - "@octokit/types" "^6.26.0" + "@octokit/types" "^6.35.0" oidc-token-hash@^5.0.1: version "5.0.1" From 667df77fdd2e3a11b79a0d1acd383fe3f84756ab Mon Sep 17 00:00:00 2001 From: "Carteni, Gabriele" Date: Thu, 16 Jun 2022 17:37:57 +0200 Subject: [PATCH 227/590] Add Clarivate.com as adopter Signed-off-by: Carteni, Gabriele --- ADOPTERS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 10b605a8d4..44e9dc9b44 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -181,5 +181,5 @@ _If you're using Backstage in your organization, please try to add your company | [Polarpoint](https://polarpoint.io/) | [Surj Bains](https://github.com/polarpoint-io) | We are using Backstage as our Developer portal as well as for hosting our DevOps portal for software catalog. | | [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. | | [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group. -| [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component. - +| [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component. +| [Clarivate](https://www.clarivate.com) | [Gabriele Carteni](mailto:gabriele.carteni@clarivate.com) | We are building our Developer Portal using Backstage to have a better control over our software ecosystem, integrate SDLC tools and promote best practices | From c7285cac4cac785030de5b6bb58b2b7c924c0364 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 21 Jun 2022 11:25:56 +0200 Subject: [PATCH 228/590] fix(search): search modal context scope Only create a search context for the modal if there is no parent context already defined. Signed-off-by: Camila Belo --- .../SearchModal/SearchModal.test.tsx | 51 ++++++++++++++++++- .../components/SearchModal/SearchModal.tsx | 17 +++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/plugins/search/src/components/SearchModal/SearchModal.test.tsx b/plugins/search/src/components/SearchModal/SearchModal.test.tsx index 842f5fb401..3ef9291585 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.test.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.test.tsx @@ -21,7 +21,10 @@ import userEvent from '@testing-library/user-event'; import { configApiRef } from '@backstage/core-plugin-api'; import { ApiProvider, ConfigReader } from '@backstage/core-app-api'; import { rootRouteRef } from '../../plugin'; -import { searchApiRef } from '@backstage/plugin-search-react'; +import { + searchApiRef, + SearchContextProvider, +} from '@backstage/plugin-search-react'; import { SearchModal } from './SearchModal'; @@ -55,6 +58,52 @@ describe('SearchModal', () => { expect(query).toHaveBeenCalledTimes(1); }); + it('Should use parent search context if defined', async () => { + const initialState = { + term: 'term', + filters: { filter: '' }, + types: ['type'], + pageCursor: 'page cursor', + }; + + await renderInTestApp( + + + + , + { + mountedRoutes: { + '/search': rootRouteRef, + }, + }, + ); + + expect(screen.getByRole('dialog')).toBeInTheDocument(); + expect(query).toHaveBeenCalledWith(initialState); + }); + + it('Should create a local search context if a parent is not defined', async () => { + await renderInTestApp( + + , + { + mountedRoutes: { + '/search': rootRouteRef, + }, + }, + ); + + expect(screen.getByRole('dialog')).toBeInTheDocument(); + expect(query).toHaveBeenCalledWith({ + term: '', + filters: {}, + types: [], + pageCursor: undefined, + }); + }); + it('Should render a custom Modal correctly', async () => { await renderInTestApp( diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index 6c37f20001..aaee7667dd 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React from 'react'; +import React, { PropsWithChildren } from 'react'; import { Dialog, DialogActions, @@ -170,6 +170,17 @@ export const Modal = ({ toggleModal }: SearchModalProps) => { ); }; +const Context = ({ children }: PropsWithChildren<{}>) => { + // Checks if there is a parent context already defined and, if not, creates a new local context. + try { + // Throws an exception if there is no parent context already defined + useSearch(); + return <>{children}; + } catch { + return {children}; + } +}; + /** * @public */ @@ -194,11 +205,11 @@ export const SearchModal = ({ hidden={hidden} > {open && ( - + {(children && children({ toggleModal })) ?? ( )} - + )} ); From 509c4092f0b617de243238ac0975f7910b199e43 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 21 Jun 2022 11:51:41 +0200 Subject: [PATCH 229/590] chore: add changeset file Signed-off-by: Camila Belo --- .changeset/search-turtles-itch.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .changeset/search-turtles-itch.md diff --git a/.changeset/search-turtles-itch.md b/.changeset/search-turtles-itch.md new file mode 100644 index 0000000000..2da26fc64a --- /dev/null +++ b/.changeset/search-turtles-itch.md @@ -0,0 +1,13 @@ +--- +'@backstage/plugin-search': patch +--- + +To allow people to use a global search context in the search modal, the code for the search modal has been changed to only create a local search context if there is no parent context already defined. + +If you want to continue using a local context even if you define a global one, you will have to wrap the modal in a new local context manually: + +```tsx + + + +``` From eb0b3abb641d88e263c100f67e3bf98e9749b915 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 11:09:11 +0000 Subject: [PATCH 230/590] fix(deps): update dependency react-hook-form to v7.32.2 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9c6b94a4d7..e74fe0618f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21610,9 +21610,9 @@ react-helmet@6.1.0: react-side-effect "^2.1.0" react-hook-form@^7.12.2, react-hook-form@^7.13.0: - version "7.31.3" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.31.3.tgz#b61bafb9a7435f91695351a7a9f714d8c4df0121" - integrity sha512-NVZdCWViIWXXXlQ3jxVQH0NuNfwPf8A/0KvuCxrM9qxtP1qYosfR2ZudarziFrVOC7eTUbWbm1T4OyYCwv9oSQ== + version "7.32.2" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.32.2.tgz#58ec2ab0239ce97969baa2faa03ced13fae913ac" + integrity sha512-F1A6n762xaRhvtQH5SkQQhMr19cCkHZYesTcKJJeNmrphiZp/cYFTIzC05FnQry0SspM54oPJ9tXFXlzya8VNQ== react-hot-loader@^4.13.0: version "4.13.0" From e66124284459b74259b544a63ba821c526f2ed31 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 11:22:42 +0000 Subject: [PATCH 231/590] fix(deps): update dependency run-script-webpack-plugin to ^0.1.0 Signed-off-by: Renovate Bot --- .changeset/renovate-4b5ff24.md | 5 +++++ packages/cli/package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/renovate-4b5ff24.md diff --git a/.changeset/renovate-4b5ff24.md b/.changeset/renovate-4b5ff24.md new file mode 100644 index 0000000000..4867c345d8 --- /dev/null +++ b/.changeset/renovate-4b5ff24.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Updated dependency `run-script-webpack-plugin` to `^0.1.0`. diff --git a/packages/cli/package.json b/packages/cli/package.json index 08f67249f5..2cf6f4fe7b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -110,7 +110,7 @@ "rollup-plugin-esbuild": "^4.7.2", "rollup-plugin-postcss": "^4.0.0", "rollup-pluginutils": "^2.8.2", - "run-script-webpack-plugin": "^0.0.14", + "run-script-webpack-plugin": "^0.1.0", "semver": "^7.3.2", "style-loader": "^3.3.1", "sucrase": "^3.20.2", diff --git a/yarn.lock b/yarn.lock index 787ec010d7..9bc97aa36c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22775,10 +22775,10 @@ run-parallel@^1.1.9: resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== -run-script-webpack-plugin@^0.0.14: - version "0.0.14" - resolved "https://registry.npmjs.org/run-script-webpack-plugin/-/run-script-webpack-plugin-0.0.14.tgz#fe2362b32c1dab7a8af7a6f1246fc043690cedd7" - integrity sha512-DXe6lzzEVXjBr/74zd4m4yOfmz5P6GMjzhQxDDsViOmwG7cap8UCE6RgD5rT7zf4wM83a+ToHnpB3v4efUv5IA== +run-script-webpack-plugin@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/run-script-webpack-plugin/-/run-script-webpack-plugin-0.1.0.tgz#6250a4734511836628259666d56641a27526875d" + integrity sha512-PKddVrnTu1BO90ogvN93yP/zg3X8Q4XvSKKyGVZFye9VBVbgVkFllKykNOomi9IfNtnoFFzu6TkLONIuXq5URA== rxjs@7.5.5, rxjs@^7.0.0, rxjs@^7.1.0, rxjs@^7.2.0, rxjs@^7.5.1, rxjs@^7.5.5: version "7.5.5" From a620f777b33e7527ede1cdd6d4fdf687fed81b3c Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 21 Jun 2022 13:46:18 +0200 Subject: [PATCH 232/590] refactor(search): apply review suggestion Use search context checker in search modal and create local context only if needed. Signed-off-by: Camila Belo --- .../search/src/components/SearchModal/SearchModal.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index aaee7667dd..dbb8100ec1 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -35,6 +35,7 @@ import { SearchResult, SearchResultPager, useSearch, + useSearchContextCheck, } from '@backstage/plugin-search-react'; import { useRouteRef } from '@backstage/core-plugin-api'; import { Link, useContent } from '@backstage/core-components'; @@ -172,13 +173,11 @@ export const Modal = ({ toggleModal }: SearchModalProps) => { const Context = ({ children }: PropsWithChildren<{}>) => { // Checks if there is a parent context already defined and, if not, creates a new local context. - try { - // Throws an exception if there is no parent context already defined - useSearch(); + const hasParentContext = useSearchContextCheck(); + if (hasParentContext) { return <>{children}; - } catch { - return {children}; } + return {children}; }; /** From 9fef814cead88c3cd436883a25cf91020ffdf819 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Jun 2022 14:17:27 +0200 Subject: [PATCH 233/590] chore: added vacation notice! Signed-off-by: blam --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5dba1fdf52..7b1923211b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ![headline](docs/assets/headline.png) +> 🏖 From W/C 11/7 due to Summer Vacations of some of the maintainers, expect the project to move a little slower than normal, and support to be limited. Normal service will resume on W/C 8/8! 🏝 + # [Backstage](https://backstage.io) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) From d2cf9d43ccdb13df8516faf900b08d64cf198a65 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Jun 2022 14:25:00 +0200 Subject: [PATCH 234/590] chore: make more human Signed-off-by: blam Signed-off-by: blam --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b1923211b..a6e740a427 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![headline](docs/assets/headline.png) -> 🏖 From W/C 11/7 due to Summer Vacations of some of the maintainers, expect the project to move a little slower than normal, and support to be limited. Normal service will resume on W/C 8/8! 🏝 +> 🏖 From July 7th due to Summer Vacations for some of the maintainers, expect the project to move a little slower than normal, and support to be limited. Normal service will resume on August 8th 🏝 # [Backstage](https://backstage.io) From 4df6d464baa8e4f2ec4a5852983b76f97378488e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 12:35:11 +0000 Subject: [PATCH 235/590] fix(deps): update typescript-eslint monorepo to v5.29.0 Signed-off-by: Renovate Bot --- yarn.lock | 90 +++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/yarn.lock b/yarn.lock index f19ce84ad0..a0041b7ff5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7145,13 +7145,13 @@ integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== "@typescript-eslint/eslint-plugin@^5.9.0": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz#fdf59c905354139046b41b3ed95d1609913d0758" - integrity sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw== + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz#c67794d2b0fd0b4a47f50266088acdc52a08aab6" + integrity sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w== dependencies: - "@typescript-eslint/scope-manager" "5.27.1" - "@typescript-eslint/type-utils" "5.27.1" - "@typescript-eslint/utils" "5.27.1" + "@typescript-eslint/scope-manager" "5.29.0" + "@typescript-eslint/type-utils" "5.29.0" + "@typescript-eslint/utils" "5.29.0" debug "^4.3.4" functional-red-black-tree "^1.0.1" ignore "^5.2.0" @@ -7172,13 +7172,13 @@ eslint-utils "^3.0.0" "@typescript-eslint/parser@^5.9.0": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.1.tgz#3a4dcaa67e45e0427b6ca7bb7165122c8b569639" - integrity sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ== + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz#41314b195b34d44ff38220caa55f3f93cfca43cf" + integrity sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw== dependencies: - "@typescript-eslint/scope-manager" "5.27.1" - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/typescript-estree" "5.27.1" + "@typescript-eslint/scope-manager" "5.29.0" + "@typescript-eslint/types" "5.29.0" + "@typescript-eslint/typescript-estree" "5.29.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.20.0": @@ -7189,13 +7189,13 @@ "@typescript-eslint/types" "5.20.0" "@typescript-eslint/visitor-keys" "5.20.0" -"@typescript-eslint/scope-manager@5.27.1": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz#4d1504392d01fe5f76f4a5825991ec78b7b7894d" - integrity sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg== +"@typescript-eslint/scope-manager@5.29.0": + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz#2a6a32e3416cb133e9af8dcf54bf077a916aeed3" + integrity sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA== dependencies: - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/visitor-keys" "5.27.1" + "@typescript-eslint/types" "5.29.0" + "@typescript-eslint/visitor-keys" "5.29.0" "@typescript-eslint/scope-manager@5.9.0": version "5.9.0" @@ -7205,12 +7205,12 @@ "@typescript-eslint/types" "5.9.0" "@typescript-eslint/visitor-keys" "5.9.0" -"@typescript-eslint/type-utils@5.27.1": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz#369f695199f74c1876e395ebea202582eb1d4166" - integrity sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw== +"@typescript-eslint/type-utils@5.29.0": + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz#241918001d164044020b37d26d5b9f4e37cc3d5d" + integrity sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg== dependencies: - "@typescript-eslint/utils" "5.27.1" + "@typescript-eslint/utils" "5.29.0" debug "^4.3.4" tsutils "^3.21.0" @@ -7219,10 +7219,10 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz#fa39c3c2aa786568302318f1cb51fcf64258c20c" integrity sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg== -"@typescript-eslint/types@5.27.1": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.1.tgz#34e3e629501349d38be6ae97841298c03a6ffbf1" - integrity sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg== +"@typescript-eslint/types@5.29.0": + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz#7861d3d288c031703b2d97bc113696b4d8c19aab" + integrity sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg== "@typescript-eslint/types@5.9.0": version "5.9.0" @@ -7242,13 +7242,13 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.27.1": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz#7621ee78607331821c16fffc21fc7a452d7bc808" - integrity sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw== +"@typescript-eslint/typescript-estree@5.29.0": + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz#e83d19aa7fd2e74616aab2f25dfbe4de4f0b5577" + integrity sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ== dependencies: - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/visitor-keys" "5.27.1" + "@typescript-eslint/types" "5.29.0" + "@typescript-eslint/visitor-keys" "5.29.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -7268,15 +7268,15 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.27.1": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.1.tgz#b4678b68a94bc3b85bf08f243812a6868ac5128f" - integrity sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w== +"@typescript-eslint/utils@5.29.0": + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz#775046effd5019667bd086bcf326acbe32cd0082" + integrity sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.27.1" - "@typescript-eslint/types" "5.27.1" - "@typescript-eslint/typescript-estree" "5.27.1" + "@typescript-eslint/scope-manager" "5.29.0" + "@typescript-eslint/types" "5.29.0" + "@typescript-eslint/typescript-estree" "5.29.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -7300,12 +7300,12 @@ "@typescript-eslint/types" "5.20.0" eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@5.27.1": - version "5.27.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz#05a62666f2a89769dac2e6baa48f74e8472983af" - integrity sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ== +"@typescript-eslint/visitor-keys@5.29.0": + version "5.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz#7a4749fa7ef5160c44a451bf060ac1dc6dfb77ee" + integrity sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ== dependencies: - "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/types" "5.29.0" eslint-visitor-keys "^3.3.0" "@typescript-eslint/visitor-keys@5.9.0": From 87516675416340b2a7e3dc7c1749c1b62599b052 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 13:02:41 +0000 Subject: [PATCH 236/590] fix(deps): update dependency kafkajs to v2 Signed-off-by: Renovate Bot --- .changeset/renovate-149779d.md | 5 +++++ plugins/kafka-backend/package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/renovate-149779d.md diff --git a/.changeset/renovate-149779d.md b/.changeset/renovate-149779d.md new file mode 100644 index 0000000000..58d764485e --- /dev/null +++ b/.changeset/renovate-149779d.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kafka-backend': patch +--- + +Updated dependency `kafkajs` to `^2.0.0`. diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index b78c297586..ab9c515b69 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -42,7 +42,7 @@ "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", - "kafkajs": "^1.16.0-beta.6", + "kafkajs": "^2.0.0", "lodash": "^4.17.21", "winston": "^3.2.1" }, diff --git a/yarn.lock b/yarn.lock index 2b5e08220d..7036ba99a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16844,10 +16844,10 @@ jwt-decode@*, jwt-decode@^3.1.0: resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== -kafkajs@^1.16.0-beta.6: - version "1.16.0" - resolved "https://registry.npmjs.org/kafkajs/-/kafkajs-1.16.0.tgz#bfcc3ae2b69265ca8435b53a01ee9e8787b9fee5" - integrity sha512-+Rcfu2hyQ/jv5skqRY8xA7Ra+mmRkDAzCaLDYbkGtgsNKpzxPWiLbk8ub0dgr4EbWrN1Zb4BCXHUkD6+zYfdWg== +kafkajs@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/kafkajs/-/kafkajs-2.0.2.tgz#cdfc8f57aa4fd69f6d9ca1cce4ee89bbc2a3a1f9" + integrity sha512-g6CM3fAenofOjR1bfOAqeZUEaSGhNtBscNokybSdW1rmIKYNwBPC9xQzwulFJm36u/xcxXUiCl/L/qfslapihA== keyv-memcache@^1.2.5: version "1.2.9" From 679b32172eeddb53886f078efbb3de23eb4d308a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 13:03:17 +0000 Subject: [PATCH 237/590] fix(deps): update dependency knex to v2 Signed-off-by: Renovate Bot --- .changeset/renovate-7438bff.md | 16 ++++++++++++++++ packages/backend-common/package.json | 2 +- packages/backend-tasks/package.json | 2 +- packages/backend-test-utils/package.json | 2 +- plugins/app-backend/package.json | 2 +- plugins/auth-backend/package.json | 2 +- plugins/bazaar-backend/package.json | 2 +- plugins/catalog-backend/package.json | 2 +- plugins/code-coverage-backend/package.json | 2 +- plugins/scaffolder-backend/package.json | 2 +- plugins/search-backend-module-pg/package.json | 2 +- plugins/tech-insights-backend/package.json | 2 +- plugins/techdocs-backend/package.json | 2 +- yarn.lock | 8 ++++---- 14 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 .changeset/renovate-7438bff.md diff --git a/.changeset/renovate-7438bff.md b/.changeset/renovate-7438bff.md new file mode 100644 index 0000000000..43a4ac5016 --- /dev/null +++ b/.changeset/renovate-7438bff.md @@ -0,0 +1,16 @@ +--- +'@backstage/backend-common': patch +'@backstage/backend-tasks': patch +'@backstage/backend-test-utils': patch +'@backstage/plugin-app-backend': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-bazaar-backend': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-code-coverage-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/plugin-tech-insights-backend': patch +'@backstage/plugin-techdocs-backend': patch +--- + +Updated dependency `knex` to `^2.0.0`. diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 9c459373ff..e8ebcb9ea2 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -65,7 +65,7 @@ "keyv": "^4.0.3", "keyv-memcache": "^1.2.5", "@keyv/redis": "^2.2.3", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^2.3.1", diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index f99baea1d5..2cbfd0b290 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -39,7 +39,7 @@ "@backstage/types": "^1.0.0", "@types/luxon": "^2.0.4", "cron": "^2.0.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^2.0.2", "node-abort-controller": "^3.0.1", diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 56aa23bfd8..1dc7ddc821 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -38,7 +38,7 @@ "@backstage/cli": "^0.17.3-next.0", "@backstage/config": "^1.0.1", "better-sqlite3": "^7.5.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "msw": "^0.42.0", "mysql2": "^2.2.5", "pg": "^8.3.0", diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 173b15c80c..7a62720f8b 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -43,7 +43,7 @@ "express-promise-router": "^4.1.0", "fs-extra": "10.1.0", "helmet": "^5.0.2", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^2.0.2", "winston": "^3.2.1", diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index c1fe319e3c..8403979f6f 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -53,7 +53,7 @@ "google-auth-library": "^8.0.0", "jose": "^4.6.0", "jwt-decode": "^3.1.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^2.0.2", "minimatch": "^5.0.0", diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index c0769fe5b8..51b4a7786b 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -29,7 +29,7 @@ "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "winston": "^3.2.1", "yn": "^4.0.0" }, diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 61a8e68412..99037b09f7 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -55,7 +55,7 @@ "fs-extra": "10.1.0", "git-url-parse": "^11.6.0", "glob": "^7.1.6", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^2.0.2", "node-fetch": "^2.6.7", diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 78b57974b9..d63fd88ad8 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -33,7 +33,7 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-xml-bodyparser": "^0.3.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "uuid": "^8.3.2", "winston": "^3.2.1", "yn": "^4.0.0" diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index dba891bfa2..8531523034 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -59,7 +59,7 @@ "isbinaryfile": "^5.0.0", "isomorphic-git": "^1.8.0", "jsonschema": "^1.2.6", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^2.0.2", "morgan": "^1.10.0", diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index cf072f5fe3..86c30f63d3 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -27,7 +27,7 @@ "@backstage/plugin-search-backend-node": "^0.6.3-next.0", "@backstage/plugin-search-common": "^0.3.5", "lodash": "^4.17.21", - "knex": "^1.0.2" + "knex": "^2.0.0" }, "devDependencies": { "@backstage/backend-test-utils": "^0.1.26-next.0", diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 5461f22789..f0f9d0491a 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -45,7 +45,7 @@ "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^2.0.2", "semver": "^7.3.5", diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index bf29eeb9af..d42f34e1a4 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -49,7 +49,7 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "10.1.0", - "knex": "^1.0.2", + "knex": "^2.0.0", "lodash": "^4.17.21", "node-fetch": "^2.6.7", "p-limit": "^3.1.0", diff --git a/yarn.lock b/yarn.lock index 2b5e08220d..8d8b0acbc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16906,10 +16906,10 @@ kleur@^4.0.3, kleur@^4.1.4: resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== -knex@^1.0.2: - version "1.0.7" - resolved "https://registry.npmjs.org/knex/-/knex-1.0.7.tgz#965f4490efc451b140aac4c5c6efa39fd877597b" - integrity sha512-89jxuRATt4qJMb9ZyyaKBy0pQ4d5h7eOFRqiNFnUvsgU+9WZ2eIaZKrAPG1+F3mgu5UloPUnkVE5Yo2sKZUs6Q== +knex@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/knex/-/knex-2.1.0.tgz#9348aace3a08ff5be26eb1c8e838416ddf1aa216" + integrity sha512-vVsnD6UJdSJy55TvCXfFF9syfwyXNxfE9mvr2hJL/4Obciy2EPGoqjDpgRSlMruHuPWDOeYAG25nyrGvU+jJog== dependencies: colorette "2.0.16" commander "^9.1.0" From 50c28bf2fabefd1ddf8833f75e49dc6fcd5b6f77 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Tue, 21 Jun 2022 15:24:53 +0200 Subject: [PATCH 238/590] codeowners: Add techdocs-core as changeset owner Signed-off-by: Johan Haals --- .github/CODEOWNERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3401dc5b2b..7127fb1da2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,8 +8,7 @@ yarn.lock @backstage/reviewers @backstage-service */yarn.lock @backstage/reviewers @backstage-service /.changeset/cost-insights-* @backstage/reviewers @backstage/silver-lining -/.changeset/search-* @backstage/reviewers @backstage/techdocs-core -/.changeset/techdocs-* @backstage/reviewers @backstage/techdocs-core +/.changeset @backstage/reviewers @backstage/techdocs-core /cypress/src/integration/plugins/techdocs.spec.ts @backstage/reviewers @backstage/techdocs-core /docs/assets/search @backstage/reviewers @backstage/techdocs-core /docs/features/search @backstage/reviewers @backstage/techdocs-core From c8a502ce3e0354d87f6b5cb42acde1d744cd66b7 Mon Sep 17 00:00:00 2001 From: Daniele Mazzotta Date: Tue, 21 Jun 2022 17:36:35 +0400 Subject: [PATCH 239/590] fixed formatting Signed-off-by: Daniele Mazzotta --- plugins/apache-airflow/api-report.md | 4 ++-- .../src/components/DagTableComponent/DagTableComponent.tsx | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/apache-airflow/api-report.md b/plugins/apache-airflow/api-report.md index 09123de613..333e4543cf 100644 --- a/plugins/apache-airflow/api-report.md +++ b/plugins/apache-airflow/api-report.md @@ -5,8 +5,8 @@ ```ts /// -import {BackstagePlugin} from '@backstage/core-plugin-api'; -import {RouteRef} from '@backstage/core-plugin-api'; +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { RouteRef } from '@backstage/core-plugin-api'; // @public export const ApacheAirflowDagTable: ({ diff --git a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx index 7619b06497..ff7b961c48 100644 --- a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx +++ b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx @@ -164,14 +164,12 @@ export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { return ( <> - {dagsNotFound ? ( + {dagsNotFound && ( {dagsNotFound.map(dagId => ( {dagId} ))} - ) : ( - '' )} From 4764e30cc8db91835c8a0ba6e446463e42018d8c Mon Sep 17 00:00:00 2001 From: planeiii Date: Mon, 20 Jun 2022 11:54:09 -0500 Subject: [PATCH 240/590] chore: updated getProjects to accept arrays of branches Signed-off-by: planeiii --- .changeset/many-vans-thank.md | 2 -- .../jenkins-backend/src/service/jenkinsApi.test.ts | 14 +++++++------- plugins/jenkins-backend/src/service/jenkinsApi.ts | 8 ++++---- plugins/jenkins-backend/src/service/router.ts | 8 ++++---- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/.changeset/many-vans-thank.md b/.changeset/many-vans-thank.md index 942aa4cc7c..16f8c8a69b 100644 --- a/.changeset/many-vans-thank.md +++ b/.changeset/many-vans-thank.md @@ -3,6 +3,4 @@ '@backstage/plugin-jenkins-backend': patch --- ---- - feature: added support for multiple branches to the `JenkinsApi` diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts index ad1a09a40f..bada5e1c29 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.test.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.test.ts @@ -118,10 +118,9 @@ describe('JenkinsApi', () => { it('standard github layout', async () => { mockedJenkinsClient.job.get.mockResolvedValueOnce(project); - const result = await jenkinsApi.getProjects( - jenkinsInfo, + const result = await jenkinsApi.getProjects(jenkinsInfo, [ 'testBranchName', - ); + ]); expect(mockedJenkins).toHaveBeenCalledWith({ baseUrl: jenkinsInfo.baseUrl, @@ -138,10 +137,11 @@ describe('JenkinsApi', () => { it('supports multiple branches', async () => { mockedJenkinsClient.job.get.mockResolvedValue(project); - const result = await jenkinsApi.getProjects( - jenkinsInfo, - 'foo,bar,catpants', - ); + const result = await jenkinsApi.getProjects(jenkinsInfo, [ + 'foo', + 'bar', + 'catpants', + ]); expect(mockedJenkins).toHaveBeenCalledWith({ baseUrl: jenkinsInfo.baseUrl, diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 07469dc83a..334be5dfa9 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -70,17 +70,17 @@ export class JenkinsApiImpl { * Get a list of projects for the given JenkinsInfo. * @see ../../../jenkins/src/api/JenkinsApi.ts#getProjects */ - async getProjects(jenkinsInfo: JenkinsInfo, branch?: string) { + async getProjects(jenkinsInfo: JenkinsInfo, branches?: string[]) { const client = await JenkinsApiImpl.getClient(jenkinsInfo); const projects: BackstageProject[] = []; - if (branch) { + if (branches) { // Assume jenkinsInfo.jobFullName is a folder which contains one job per branch. // TODO: extract a strategy interface for this const job = await Promise.any( - branch.split(/,/g).map(name => + branches.map(branch => client.job.get({ - name: `${jenkinsInfo.jobFullName}/${name}`, + name: `${jenkinsInfo.jobFullName}/${branch}`, tree: JenkinsApiImpl.jobTreeSpec.replace(/\s/g, ''), }), ), diff --git a/plugins/jenkins-backend/src/service/router.ts b/plugins/jenkins-backend/src/service/router.ts index 2c9e268165..b4c06314e1 100644 --- a/plugins/jenkins-backend/src/service/router.ts +++ b/plugins/jenkins-backend/src/service/router.ts @@ -64,12 +64,12 @@ export async function createRouter( request.header('authorization'), ); const branch = request.query.branch; - let branchStr: string | undefined; + let branches: string[] | undefined; if (branch === undefined) { - branchStr = undefined; + branches = undefined; } else if (typeof branch === 'string') { - branchStr = branch; + branches = branch.split(/,/g); } else { // this was passed in as something weird -> 400 // https://evanhahn.com/gotchas-with-express-query-parsing-and-how-to-avoid-them/ @@ -88,7 +88,7 @@ export async function createRouter( }, backstageToken: token, }); - const projects = await jenkinsApi.getProjects(jenkinsInfo, branchStr); + const projects = await jenkinsApi.getProjects(jenkinsInfo, branches); response.json({ projects: projects, From d03b2c4ceb8328d427f170d4d93dc9b8a4eca554 Mon Sep 17 00:00:00 2001 From: Taras Date: Mon, 20 Jun 2022 16:37:38 -0400 Subject: [PATCH 241/590] Added Humanitec plugin Signed-off-by: Taras Mankovski Signed-off-by: Taras --- microsite/data/plugins/humanitec.yaml | 11 +++++++++++ microsite/static/img/humanitec-logo.png | Bin 0 -> 7088 bytes 2 files changed, 11 insertions(+) create mode 100644 microsite/data/plugins/humanitec.yaml create mode 100644 microsite/static/img/humanitec-logo.png diff --git a/microsite/data/plugins/humanitec.yaml b/microsite/data/plugins/humanitec.yaml new file mode 100644 index 0000000000..88c0cd0a08 --- /dev/null +++ b/microsite/data/plugins/humanitec.yaml @@ -0,0 +1,11 @@ +--- +title: Humanitec Platform Orchestrator +author: Frontside +authorUrl: 'https://frontside.com' +category: Deployment # A single category e.g. CI, Machine Learning, Services, Monitoring +description: | + Show workloads, environments and resources deployed by Humanitec Platform Orchestrator. + Plugin includes an Entity ComponentCard, Backend API route and scaffolder actions. +documentation: https://github.com/thefrontside/backstage/tree/main/plugins/humanitec +iconUrl: ../../static/img/humanitec-logo.png +npmPackageName: '@frontside/backstage-plugin-humanitec' diff --git a/microsite/static/img/humanitec-logo.png b/microsite/static/img/humanitec-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..69ab02e9cd481ad93d6d8539ed9d2de1677b834b GIT binary patch literal 7088 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 a3Q Date: Tue, 21 Jun 2022 16:36:59 +0200 Subject: [PATCH 242/590] Remove unused vale keyword ent Signed-off-by: Himanshu Mishra --- .github/vale/Vocab/Backstage/accept.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index b87f5d3881..7631640199 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -92,7 +92,6 @@ elasticsearch esbuild eslint etag -ent Expedia facto failover From 384dddd0b493aa935eb973970d6a64e88071a206 Mon Sep 17 00:00:00 2001 From: Alex Rybchenko Date: Tue, 21 Jun 2022 17:43:54 +0200 Subject: [PATCH 243/590] moved entity checkers to catalog-model Signed-off-by: Alex Rybchenko --- .../src/entity/conditions.test.ts | 172 ++++++++++++++++++ .../catalog-model/src/entity/conditions.ts | 76 ++++++++ packages/catalog-model/src/entity/index.ts | 1 + .../src/search/DefaultCatalogCollator.ts | 8 +- plugins/catalog-backend/src/search/util.ts | 10 +- .../src/components/EntitySwitch/conditions.ts | 61 +------ 6 files changed, 253 insertions(+), 75 deletions(-) create mode 100644 packages/catalog-model/src/entity/conditions.test.ts create mode 100644 packages/catalog-model/src/entity/conditions.ts diff --git a/packages/catalog-model/src/entity/conditions.test.ts b/packages/catalog-model/src/entity/conditions.test.ts new file mode 100644 index 0000000000..046f1c60e4 --- /dev/null +++ b/packages/catalog-model/src/entity/conditions.test.ts @@ -0,0 +1,172 @@ +/* + * 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 { Entity } from './Entity'; +import { + isApiEntity, + isComponentEntity, + isDomainEntity, + isGroupEntity, + isLocationEntity, + isResourceEntity, + isSystemEntity, + isUserEntity, +} from './conditions'; + +const apiEntity: Entity = { + apiVersion: '', + kind: 'api', + metadata: { name: 'api' }, +}; +const componentEntity: Entity = { + apiVersion: '', + kind: 'component', + metadata: { name: 'Component' }, +}; +const domainEntity: Entity = { + apiVersion: '', + kind: 'domain', + metadata: { name: 'Domain' }, +}; +const groupEntity: Entity = { + apiVersion: '', + kind: 'group', + metadata: { name: 'Group' }, +}; +const locationEntity: Entity = { + apiVersion: '', + kind: 'location', + metadata: { name: 'Location' }, +}; +const resourceEntity: Entity = { + apiVersion: '', + kind: 'resource', + metadata: { name: 'Resource' }, +}; +const systemEntity: Entity = { + apiVersion: '', + kind: 'system', + metadata: { name: 'System' }, +}; +const userEntity: Entity = { + apiVersion: '', + kind: 'user', + metadata: { name: 'User' }, +}; + +describe('isApiEntity', () => { + it('should check for the intended type', () => { + expect(isApiEntity(componentEntity)).not.toBeTruthy(); + expect(isApiEntity(domainEntity)).not.toBeTruthy(); + expect(isApiEntity(groupEntity)).not.toBeTruthy(); + expect(isApiEntity(locationEntity)).not.toBeTruthy(); + expect(isApiEntity(resourceEntity)).not.toBeTruthy(); + expect(isApiEntity(systemEntity)).not.toBeTruthy(); + expect(isApiEntity(userEntity)).not.toBeTruthy(); + expect(isApiEntity(apiEntity)).toBeTruthy(); + }); +}); + +describe('isComponentEntity', () => { + it('should check for the intended type', () => { + expect(isComponentEntity(apiEntity)).not.toBeTruthy(); + expect(isComponentEntity(domainEntity)).not.toBeTruthy(); + expect(isComponentEntity(groupEntity)).not.toBeTruthy(); + expect(isComponentEntity(locationEntity)).not.toBeTruthy(); + expect(isComponentEntity(resourceEntity)).not.toBeTruthy(); + expect(isComponentEntity(systemEntity)).not.toBeTruthy(); + expect(isComponentEntity(userEntity)).not.toBeTruthy(); + expect(isComponentEntity(componentEntity)).toBeTruthy(); + }); +}); + +describe('isDomainEntity', () => { + it('should check for the intended type', () => { + expect(isDomainEntity(apiEntity)).not.toBeTruthy(); + expect(isDomainEntity(componentEntity)).not.toBeTruthy(); + expect(isDomainEntity(groupEntity)).not.toBeTruthy(); + expect(isDomainEntity(locationEntity)).not.toBeTruthy(); + expect(isDomainEntity(resourceEntity)).not.toBeTruthy(); + expect(isDomainEntity(systemEntity)).not.toBeTruthy(); + expect(isDomainEntity(userEntity)).not.toBeTruthy(); + expect(isDomainEntity(domainEntity)).toBeTruthy(); + }); +}); + +describe('isGroupEntity', () => { + it('should check for the intended type', () => { + expect(isGroupEntity(apiEntity)).not.toBeTruthy(); + expect(isGroupEntity(componentEntity)).not.toBeTruthy(); + expect(isGroupEntity(domainEntity)).not.toBeTruthy(); + expect(isGroupEntity(locationEntity)).not.toBeTruthy(); + expect(isGroupEntity(resourceEntity)).not.toBeTruthy(); + expect(isGroupEntity(systemEntity)).not.toBeTruthy(); + expect(isGroupEntity(userEntity)).not.toBeTruthy(); + expect(isGroupEntity(groupEntity)).toBeTruthy(); + }); +}); + +describe('isLocationEntity', () => { + it('should check for the intended type', () => { + expect(isLocationEntity(apiEntity)).not.toBeTruthy(); + expect(isLocationEntity(componentEntity)).not.toBeTruthy(); + expect(isLocationEntity(domainEntity)).not.toBeTruthy(); + expect(isLocationEntity(groupEntity)).not.toBeTruthy(); + expect(isLocationEntity(resourceEntity)).not.toBeTruthy(); + expect(isLocationEntity(systemEntity)).not.toBeTruthy(); + expect(isLocationEntity(userEntity)).not.toBeTruthy(); + expect(isLocationEntity(locationEntity)).toBeTruthy(); + }); +}); + +describe('isResourceEntity', () => { + it('should check for the intended type', () => { + expect(isResourceEntity(apiEntity)).not.toBeTruthy(); + expect(isResourceEntity(componentEntity)).not.toBeTruthy(); + expect(isResourceEntity(domainEntity)).not.toBeTruthy(); + expect(isResourceEntity(groupEntity)).not.toBeTruthy(); + expect(isResourceEntity(locationEntity)).not.toBeTruthy(); + expect(isResourceEntity(systemEntity)).not.toBeTruthy(); + expect(isResourceEntity(userEntity)).not.toBeTruthy(); + expect(isResourceEntity(resourceEntity)).toBeTruthy(); + }); +}); + +describe('isSystemEntity', () => { + it('should check for the intended type', () => { + expect(isSystemEntity(apiEntity)).not.toBeTruthy(); + expect(isSystemEntity(componentEntity)).not.toBeTruthy(); + expect(isSystemEntity(domainEntity)).not.toBeTruthy(); + expect(isSystemEntity(groupEntity)).not.toBeTruthy(); + expect(isSystemEntity(locationEntity)).not.toBeTruthy(); + expect(isSystemEntity(resourceEntity)).not.toBeTruthy(); + expect(isSystemEntity(userEntity)).not.toBeTruthy(); + expect(isSystemEntity(systemEntity)).toBeTruthy(); + }); +}); + +describe('isUserEntity', () => { + it('should check for the intended type', () => { + expect(isUserEntity(apiEntity)).not.toBeTruthy(); + expect(isUserEntity(componentEntity)).not.toBeTruthy(); + expect(isUserEntity(domainEntity)).not.toBeTruthy(); + expect(isUserEntity(groupEntity)).not.toBeTruthy(); + expect(isUserEntity(locationEntity)).not.toBeTruthy(); + expect(isUserEntity(resourceEntity)).not.toBeTruthy(); + expect(isUserEntity(systemEntity)).not.toBeTruthy(); + expect(isUserEntity(userEntity)).toBeTruthy(); + }); +}); diff --git a/packages/catalog-model/src/entity/conditions.ts b/packages/catalog-model/src/entity/conditions.ts new file mode 100644 index 0000000000..d761695b5e --- /dev/null +++ b/packages/catalog-model/src/entity/conditions.ts @@ -0,0 +1,76 @@ +/* + * 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 { + ApiEntity, + ComponentEntity, + DomainEntity, + GroupEntity, + LocationEntity, + ResourceEntity, + SystemEntity, + UserEntity, +} from '../kinds'; +import { Entity } from './Entity'; + +/** + * @public + */ +export function isApiEntity(entity: Entity): entity is ApiEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'API'; +} +/** + * @public + */ +export function isComponentEntity(entity: Entity): entity is ComponentEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'COMPONENT'; +} +/** + * @public + */ +export function isDomainEntity(entity: Entity): entity is DomainEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'DOMAIN'; +} +/** + * @public + */ +export function isGroupEntity(entity: Entity): entity is GroupEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'GROUP'; +} +/** + * @public + */ +export function isLocationEntity(entity: Entity): entity is LocationEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'LOCATION'; +} +/** + * @public + */ +export function isResourceEntity(entity: Entity): entity is ResourceEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'RESOURCE'; +} +/** + * @public + */ +export function isSystemEntity(entity: Entity): entity is SystemEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'SYSTEM'; +} +/** + * @public + */ +export function isUserEntity(entity: Entity): entity is UserEntity { + return entity.kind.toLocaleUpperCase('en-US') === 'USER'; +} diff --git a/packages/catalog-model/src/entity/index.ts b/packages/catalog-model/src/entity/index.ts index 45ee673167..039529bf3e 100644 --- a/packages/catalog-model/src/entity/index.ts +++ b/packages/catalog-model/src/entity/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export * from './conditions'; export { DEFAULT_NAMESPACE, ANNOTATION_EDIT_URL, diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts index f895ded85e..70ec0ee948 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts @@ -20,8 +20,8 @@ import { } from '@backstage/backend-common'; import { Entity, + isUserEntity, stringifyEntityRef, - UserEntity, } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { @@ -93,13 +93,9 @@ export class DefaultCatalogCollator { return formatted.toLowerCase(); } - private isUserEntity(entity: Entity): entity is UserEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'USER'; - } - private getDocumentText(entity: Entity): string { let documentText = entity.metadata.description || ''; - if (this.isUserEntity(entity)) { + if (isUserEntity(entity)) { if (entity.spec?.profile?.displayName && documentText) { // combine displayName and description const displayName = entity.spec?.profile?.displayName; diff --git a/plugins/catalog-backend/src/search/util.ts b/plugins/catalog-backend/src/search/util.ts index b5df2a28a7..fd54d397c9 100644 --- a/plugins/catalog-backend/src/search/util.ts +++ b/plugins/catalog-backend/src/search/util.ts @@ -14,15 +14,7 @@ * limitations under the License. */ -import { Entity, UserEntity, GroupEntity } from '@backstage/catalog-model'; - -function isUserEntity(entity: Entity): entity is UserEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'USER'; -} - -function isGroupEntity(entity: Entity): entity is GroupEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'GROUP'; -} +import { Entity, isUserEntity, isGroupEntity } from '@backstage/catalog-model'; export function getDocumentText(entity: Entity): string { const documentTexts: string[] = []; diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.ts b/plugins/catalog/src/components/EntitySwitch/conditions.ts index b6837627c0..86fd38a900 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.ts @@ -14,17 +14,7 @@ * limitations under the License. */ -import { - ApiEntity, - ComponentEntity, - DomainEntity, - Entity, - GroupEntity, - LocationEntity, - ResourceEntity, - SystemEntity, - UserEntity, -} from '@backstage/catalog-model'; +import { ComponentEntity, Entity } from '@backstage/catalog-model'; function strCmp(a: string | undefined, b: string | undefined): boolean { return Boolean( @@ -67,52 +57,3 @@ export function isComponentType(types: string | string[]) { export function isNamespace(namespaces: string | string[]) { return (entity: Entity) => strCmpAll(entity.metadata?.namespace, namespaces); } - -/** - * @public - */ -export function isApiEntity(entity: Entity): entity is ApiEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'API'; -} -/** - * @public - */ -export function isComponentEntity(entity: Entity): entity is ComponentEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'COMPONENT'; -} -/** - * @public - */ -export function isDomainEntity(entity: Entity): entity is DomainEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'DOMAIN'; -} -/** - * @public - */ -export function isGroupEntity(entity: Entity): entity is GroupEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'GROUP'; -} -/** - * @public - */ -export function isLocationEntity(entity: Entity): entity is LocationEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'LOCATION'; -} -/** - * @public - */ -export function isResourceEntity(entity: Entity): entity is ResourceEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'RESOURCE'; -} -/** - * @public - */ -export function isSystemEntity(entity: Entity): entity is SystemEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'SYSTEM'; -} -/** - * @public - */ -export function isUserEntity(entity: Entity): entity is UserEntity { - return entity.kind.toLocaleUpperCase('en-US') === 'USER'; -} From 919396b27aa75491dd45d372ee64e09256484b5c Mon Sep 17 00:00:00 2001 From: Alex Rybchenko Date: Tue, 21 Jun 2022 17:47:18 +0200 Subject: [PATCH 244/590] revert plugin-catalog export change Signed-off-by: Alex Rybchenko --- plugins/catalog/src/components/EntitySwitch/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog/src/components/EntitySwitch/index.ts b/plugins/catalog/src/components/EntitySwitch/index.ts index 5d0537bfa5..6cccf4be6e 100644 --- a/plugins/catalog/src/components/EntitySwitch/index.ts +++ b/plugins/catalog/src/components/EntitySwitch/index.ts @@ -16,4 +16,4 @@ export { EntitySwitch } from './EntitySwitch'; export type { EntitySwitchProps, EntitySwitchCaseProps } from './EntitySwitch'; -export * from './conditions'; +export { isKind, isNamespace, isComponentType } from './conditions'; From f1dcc6f3c684bb679a4cecb9a3e557c1115103a2 Mon Sep 17 00:00:00 2001 From: Alex Rybchenko Date: Tue, 21 Jun 2022 18:01:21 +0200 Subject: [PATCH 245/590] added changesets Signed-off-by: Alex Rybchenko --- .changeset/pretty-masks-live.md | 5 +++++ .changeset/silent-coats-brake.md | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/pretty-masks-live.md create mode 100644 .changeset/silent-coats-brake.md diff --git a/.changeset/pretty-masks-live.md b/.changeset/pretty-masks-live.md new file mode 100644 index 0000000000..c45ad1e77f --- /dev/null +++ b/.changeset/pretty-masks-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-model': patch +--- + +Added type predicates for all entity types, e.g. isUserEntity diff --git a/.changeset/silent-coats-brake.md b/.changeset/silent-coats-brake.md new file mode 100644 index 0000000000..b1cfbacb6a --- /dev/null +++ b/.changeset/silent-coats-brake.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog': patch +'@backstage/plugin-catalog-backend': patch +--- + +Use entity type predicates from catalog-model From 3db6c21390ea33c9db24f322bec45ea842dbccfd Mon Sep 17 00:00:00 2001 From: Alex Rybchenko Date: Tue, 21 Jun 2022 18:34:52 +0200 Subject: [PATCH 246/590] updated api-report Signed-off-by: Alex Rybchenko --- packages/catalog-model/api-report.md | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/catalog-model/api-report.md b/packages/catalog-model/api-report.md index fca23d6ab9..9ea7636de5 100644 --- a/packages/catalog-model/api-report.md +++ b/packages/catalog-model/api-report.md @@ -254,6 +254,36 @@ export { GroupEntityV1alpha1 }; // @public export const groupEntityV1alpha1Validator: KindValidator; +// @public (undocumented) +export function isApiEntity(entity: Entity): entity is ApiEntityV1alpha1; + +// @public (undocumented) +export function isComponentEntity( + entity: Entity, +): entity is ComponentEntityV1alpha1; + +// @public (undocumented) +export function isDomainEntity(entity: Entity): entity is DomainEntityV1alpha1; + +// @public (undocumented) +export function isGroupEntity(entity: Entity): entity is GroupEntityV1alpha1; + +// @public (undocumented) +export function isLocationEntity( + entity: Entity, +): entity is LocationEntityV1alpha1; + +// @public (undocumented) +export function isResourceEntity( + entity: Entity, +): entity is ResourceEntityV1alpha1; + +// @public (undocumented) +export function isSystemEntity(entity: Entity): entity is SystemEntityV1alpha1; + +// @public (undocumented) +export function isUserEntity(entity: Entity): entity is UserEntityV1alpha1; + // @public export type KindValidator = { check(entity: Entity): Promise; From 7f18a4245043d04511d1d966163b3f6dd5c7bdf3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 16:55:38 +0000 Subject: [PATCH 247/590] fix(deps): update dependency logform to v2.4.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 6841fc4366..2dbf176e9f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17554,9 +17554,9 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" logform@^2.3.2, logform@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz#131651715a17d50f09c2a2c1a524ff1a4164bcfe" - integrity sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw== + version "2.4.1" + resolved "https://registry.npmjs.org/logform/-/logform-2.4.1.tgz#512c9eaef738044d1c619790ba0f806c80d9d3a9" + integrity sha512-7XB/tqc3VRbri9pRjU6E97mQ8vC27ivJ3lct4jhyT+n0JNDd4YKldFl0D75NqDp46hk8RC7Ma1Vjv/UPf67S+A== dependencies: "@colors/colors" "1.5.0" fecha "^4.2.0" From cb37b69827818cd8cc83f3a3e6d31fdedea7ffd2 Mon Sep 17 00:00:00 2001 From: Clare Liguori Date: Tue, 21 Jun 2022 10:26:23 -0700 Subject: [PATCH 248/590] Add AWS Proton to plugin marketplace Signed-off-by: Clare Liguori --- microsite/data/plugins/aws-proton.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 microsite/data/plugins/aws-proton.yaml diff --git a/microsite/data/plugins/aws-proton.yaml b/microsite/data/plugins/aws-proton.yaml new file mode 100644 index 0000000000..022b553b24 --- /dev/null +++ b/microsite/data/plugins/aws-proton.yaml @@ -0,0 +1,9 @@ +--- +title: AWS Proton +author: Amazon Web Services +authorUrl: https://aws.amazon.com/ +category: Infrastructure +description: Create and view AWS Proton services for your components in Backstage. +documentation: https://github.com/awslabs/aws-proton-plugins-for-backstage#readme +iconUrl: https://github.com/awslabs/aws-proton-plugins-for-backstage/blob/main/docs/images/proton-logo.png?raw=true +npmPackageName: '@aws/aws-proton-plugin-for-backstage' From 7e115d42f945e57e2fbcf4d83ef69e89362753f4 Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Tue, 21 Jun 2022 16:34:55 -0400 Subject: [PATCH 249/590] refactor(MyGroupsSidebarItem): render namespaces with subtitles Signed-off-by: Phil Kuang --- .changeset/serious-zebras-joke.md | 5 +++ .changeset/shiny-turkeys-doubt.md | 2 +- packages/core-components/api-report.md | 1 + .../src/layout/Sidebar/SidebarSubmenuItem.tsx | 23 ++++++++++++- .../MyGroupsSidebarItem.tsx | 32 ++++--------------- 5 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 .changeset/serious-zebras-joke.md diff --git a/.changeset/serious-zebras-joke.md b/.changeset/serious-zebras-joke.md new file mode 100644 index 0000000000..78f38ca967 --- /dev/null +++ b/.changeset/serious-zebras-joke.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Support displaying subtitle text in `SidebarSubmenuItem` diff --git a/.changeset/shiny-turkeys-doubt.md b/.changeset/shiny-turkeys-doubt.md index 0f663a4c74..edac39182c 100644 --- a/.changeset/shiny-turkeys-doubt.md +++ b/.changeset/shiny-turkeys-doubt.md @@ -2,4 +2,4 @@ '@backstage/plugin-org': patch --- -Render namespaced teams within dropdown items in `MyGroupsSidebarItem` +Render namespaces for teams with subtitles in `MyGroupsSidebarItem` diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 911ef36867..302ef7ef7d 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -1110,6 +1110,7 @@ export type SidebarSubmenuItemDropdownItem = { // @public export type SidebarSubmenuItemProps = { title: string; + subtitle?: string; to?: string; icon?: IconComponent; dropdownItems?: SidebarSubmenuItemDropdownItem[]; diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx index 41f1a1e287..a1565a348f 100644 --- a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx +++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx @@ -59,6 +59,13 @@ const useStyles = makeStyles( whiteSpace: 'nowrap', overflow: 'hidden', 'text-overflow': 'ellipsis', + lineHeight: 1, + }, + subtitle: { + fontSize: 10, + whiteSpace: 'nowrap', + overflow: 'hidden', + 'text-overflow': 'ellipsis', }, dropdownArrow: { position: 'absolute', @@ -105,6 +112,7 @@ export type SidebarSubmenuItemDropdownItem = { * Holds submenu item content. * * title: Text content of submenu item + * subtitle: A subtitle displayed under the main title * to: Path to navigate to when item is clicked * icon: Icon displayed on the left of text content * dropdownItems: Optional array of dropdown items displayed when submenu item is clicked. @@ -113,6 +121,7 @@ export type SidebarSubmenuItemDropdownItem = { */ export type SidebarSubmenuItemProps = { title: string; + subtitle?: string; to?: string; icon?: IconComponent; dropdownItems?: SidebarSubmenuItemDropdownItem[]; @@ -124,7 +133,7 @@ export type SidebarSubmenuItemProps = { * @public */ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { - const { title, to, icon: Icon, dropdownItems } = props; + const { title, subtitle, to, icon: Icon, dropdownItems } = props; const classes = useStyles(); const { setIsHoveredOn } = useContext(SidebarItemWithSubmenuContext); const closeSubmenu = () => { @@ -158,6 +167,12 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { {Icon && } {title} +
+ {subtitle && ( + + {subtitle} + + )}
{showDropDown ? ( @@ -210,6 +225,12 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { {Icon && } {title} +
+ {subtitle && ( + + {subtitle} + + )}
diff --git a/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx b/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx index 445bf8e6fe..f3e3a6bd9a 100644 --- a/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx +++ b/plugins/org/src/components/MyGroupsSidebarItem/MyGroupsSidebarItem.tsx @@ -17,7 +17,6 @@ import React from 'react'; import { DEFAULT_NAMESPACE, - Entity, stringifyEntityRef, } from '@backstage/catalog-model'; import { @@ -90,42 +89,25 @@ export const MyGroupsSidebarItem = (props: { ); } - const namespacedGroupsMap: { [namespace: string]: Entity[] } = {}; - groups.forEach(group => { - namespacedGroupsMap[group.metadata.namespace!] = - namespacedGroupsMap[group.metadata.namespace!] ?? []; - namespacedGroupsMap[group.metadata.namespace!].push(group); - }); - // Member of more than one group return ( - {namespacedGroupsMap[DEFAULT_NAMESPACE]?.map(group => { + {groups?.map(function groupsMap(group) { return ( ); })} - {Object.entries(namespacedGroupsMap) - .filter(([n]) => n !== DEFAULT_NAMESPACE) - .map(([namespace, namespacedGroups]) => { - return ( - ({ - title: group.metadata.title || group.metadata.name, - to: catalogEntityRoute(getCompoundEntityRef(group)), - }))} - /> - ); - })} ); From 0ae5d7858d364073caa0a37de17cfa1d7ace5913 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:29:35 -0500 Subject: [PATCH 250/590] Fixed Azure Discovery config example Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- docs/integrations/azure/discovery.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md index c607a6550e..6a420462c0 100644 --- a/docs/integrations/azure/discovery.md +++ b/docs/integrations/azure/discovery.md @@ -45,7 +45,7 @@ catalog: anotherProviderId: # another identifier organization: myorg project: myproject - repository: '*' # this will match all repos starting with service-* + repository: '*' # this will match all repos path: /src/*/catalog-info.yaml # this will search for files deep inside the /src folder yetAotherProviderId: # guess, what? Another one :) host: selfhostedazure.yourcompany.com From 2b74a8505985b68b31d90c3bbff614ebe27af157 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:42:31 -0500 Subject: [PATCH 251/590] Added details about installing addons package Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- docs/features/techdocs/addons.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 831729d093..33d97521d3 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -52,6 +52,8 @@ Addons are rendered in the order in which they are registered. ## Installing and using Addons +To start using Addons you need to add the `@backstage/plugin-techdocs-module-addons-contrib` package you your app, you can do that by running this command form the root of your project: `yarn add --cwd packages/app @backstage/plugin-techdocs-module-addons-contrib` + Addons can be installed and configured in much the same way as extensions for other Backstage plugins: by adding them underneath an extension registry component (``) under the route representing the TechDocs Reader From bf0336352b2047409bd8ab6a07832f5ff09bc644 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 00:40:44 +0000 Subject: [PATCH 252/590] chore(deps): update dependency @types/testing-library__jest-dom to v5.14.5 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2c1a244a1f..f0c7f2ba35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7008,9 +7008,9 @@ terser-webpack-plugin "*" "@types/testing-library__jest-dom@^5.9.1": - version "5.14.4" - resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.4.tgz#21567ec845f4efee55923842c79728dc49c1650b" - integrity sha512-EUCs9PTBOEyfRtLKkKd31YrRCx/9Wxjy2Uqb6IH/KAOr7/vP0i8iClOyxQqjm/UxMGU5r5s2vOBM7vSPQVmabg== + version "5.14.5" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== dependencies: "@types/jest" "*" From 81c9d7fb4446e1ced660277d394783f84d1117c0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 00:41:30 +0000 Subject: [PATCH 253/590] fix(deps): update dependency @uiw/react-codemirror to v4.9.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 2c1a244a1f..9e3320b676 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7317,9 +7317,9 @@ eslint-visitor-keys "^3.0.0" "@uiw/react-codemirror@^4.9.3": - version "4.9.3" - resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.9.3.tgz#3d7abc434b140f01119332e25e9f49ace7c381bf" - integrity sha512-iT/daKF852ZsNJGvqmxRFJ4KTOJSikeoCMl7jhUUJTETdozUf0/DqUQhvazAoduMRzqqHYnN/5isdITCyy2P6g== + version "4.9.4" + resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.9.4.tgz#4643201f279fed103f2cf15df9431931fe4e9f15" + integrity sha512-IsC5xDevpIeLMzHQQwT2W40gFFIdKeT1T0DHjzzai+s5SIrMlGe3QSHWeC1wSO7FtfNxFpFlTYMGJm5JwUviMA== dependencies: "@babel/runtime" ">=7.11.0" "@codemirror/theme-one-dark" "^6.0.0" From ed40cd0278f8ae46f488c3645a91016ac1158f3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 01:51:26 +0000 Subject: [PATCH 254/590] fix(deps): update dependency google-auth-library to v8.0.3 Signed-off-by: Renovate Bot --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2793bc7ba7..c4640b76b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13884,9 +13884,9 @@ google-auth-library@^7.14.0: lru-cache "^6.0.0" google-auth-library@^8.0.0, google-auth-library@^8.0.1, google-auth-library@^8.0.2: - version "8.0.2" - resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.0.2.tgz#5fa0f2d3795c3e4019d2bb315ade4454cc9c30b5" - integrity sha512-HoG+nWFAThLovKpvcbYzxgn+nBJPTfAwtq0GxPN821nOO+21+8oP7MoEHfd1sbDulUFFGfcjJr2CnJ4YssHcyg== + version "8.0.3" + resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.0.3.tgz#1e780430632d03df36dc22a3f5c89dbc251f2105" + integrity sha512-1eC6yaCrPfkv3bwtb3e0AOct7E7xR/uikDyXNo/j8Wd6a1ldRgAey5FmaDGNJnHNDPLtDiENQLYsA69eXOF5sA== dependencies: arrify "^2.0.0" base64-js "^1.3.0" @@ -13894,7 +13894,7 @@ google-auth-library@^8.0.0, google-auth-library@^8.0.1, google-auth-library@^8.0 fast-text-encoding "^1.0.0" gaxios "^5.0.0" gcp-metadata "^5.0.0" - gtoken "^5.3.2" + gtoken "^6.0.0" jws "^4.0.0" lru-cache "^6.0.0" @@ -13943,10 +13943,10 @@ google-p12-pem@^3.0.3: dependencies: node-forge "^1.0.0" -google-p12-pem@^3.1.3: - version "3.1.4" - resolved "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b" - integrity sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg== +google-p12-pem@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.0.tgz#f46581add1dc6ea0b96160cda6ce37ee35ab8ca3" + integrity sha512-lRTMn5ElBdDixv4a86bixejPSRk1boRtUowNepeKEVvYiFlkLuAJUVpEz6PfObDHYEKnZWq/9a2zC98xu62A9w== dependencies: node-forge "^1.3.1" @@ -14145,13 +14145,13 @@ gtoken@^5.0.4: jws "^4.0.0" mime "^2.2.0" -gtoken@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz#deb7dc876abe002178e0515e383382ea9446d58f" - integrity sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ== +gtoken@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/gtoken/-/gtoken-6.0.1.tgz#1276371d51e93c4eface76e3f30f9e8f1cad3f1a" + integrity sha512-J0vebk6u6i4rLTM0lQq25SdusCLMvujYNZeAouyPvSbGlcjw7P8L3W9INIFnlXUx+AUD7TDoM1mgdhzH+XX7DQ== dependencies: gaxios "^4.0.0" - google-p12-pem "^3.1.3" + google-p12-pem "^4.0.0" jws "^4.0.0" gzip-size@^6.0.0: From e7ce3f708442eea242e08c08d63a667744137cf3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 01:54:37 +0000 Subject: [PATCH 255/590] fix(deps): update dependency sucrase to v3.21.1 Signed-off-by: Renovate Bot --- storybook/yarn.lock | 17 ++++++----------- yarn.lock | 6 +++--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 39d0e2725f..6bf41324eb 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2610,7 +2610,7 @@ ansi-to-html@^0.6.11: any-promise@^1.0.0: version "1.3.0" resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@^2.0.0: version "2.0.0" @@ -7039,12 +7039,7 @@ pinkie@^2.0.0: resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== -pirates@^4.0.1: - version "4.0.4" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" - integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== - -pirates@^4.0.5: +pirates@^4.0.1, pirates@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== @@ -8392,9 +8387,9 @@ style-to-object@0.3.0, style-to-object@^0.3.0: inline-style-parser "0.1.1" sucrase@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.21.0.tgz#6a5affdbe716b22e4dc99c57d366ad0d216444b9" - integrity sha512-FjAhMJjDcifARI7bZej0Bi1yekjWQHoEvWIXhLPwDhC6O4iZ5PtGb86WV56riW87hzpgB13wwBKO9vKAiWu5VQ== + version "3.21.1" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.21.1.tgz#7e29ddaca012764cf843280b00e74a843bdf790f" + integrity sha512-kxXnC9yZEav5USAu8gooZID9Ph3xqwdJxZoh+WbOWQZHTB7CHj3ANwENVMZ6mAZ9k7UtJtFxvQD9R03q3yU2YQ== dependencies: commander "^4.0.0" glob "7.1.6" @@ -8552,7 +8547,7 @@ test-exclude@^6.0.0: thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" diff --git a/yarn.lock b/yarn.lock index 2793bc7ba7..2a6c060e14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24153,9 +24153,9 @@ stylis@^4.0.6: integrity sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA== sucrase@^3.18.0, sucrase@^3.20.2: - version "3.21.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.21.0.tgz#6a5affdbe716b22e4dc99c57d366ad0d216444b9" - integrity sha512-FjAhMJjDcifARI7bZej0Bi1yekjWQHoEvWIXhLPwDhC6O4iZ5PtGb86WV56riW87hzpgB13wwBKO9vKAiWu5VQ== + version "3.21.1" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.21.1.tgz#7e29ddaca012764cf843280b00e74a843bdf790f" + integrity sha512-kxXnC9yZEav5USAu8gooZID9Ph3xqwdJxZoh+WbOWQZHTB7CHj3ANwENVMZ6mAZ9k7UtJtFxvQD9R03q3yU2YQ== dependencies: commander "^4.0.0" glob "7.1.6" From 403c92438b522938b21f7c1354056b9c538d8c05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 02:44:30 +0000 Subject: [PATCH 256/590] chore(deps): update dependency cypress to v10.2.0 Signed-off-by: Renovate Bot --- cypress/yarn.lock | 6 +++--- yarn.lock | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cypress/yarn.lock b/cypress/yarn.lock index 0fc9da99b6..1ccce4ea24 100644 --- a/cypress/yarn.lock +++ b/cypress/yarn.lock @@ -304,9 +304,9 @@ cross-spawn@^7.0.0: which "^2.0.1" cypress@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/cypress/-/cypress-10.1.0.tgz#6514a26c721822a02bc194e9a7f72c3142aea174" - integrity sha512-aQ4JVZVib4Xd9FZW8IRZfKelUvqF4y5A+oUbNvn8TlsBmEfIg3m5Xd6Mt6PVU/jHiVJ9Psl905B3ZPnrDcmyuQ== + version "10.2.0" + resolved "https://registry.npmjs.org/cypress/-/cypress-10.2.0.tgz#ca078abfceb13be2a33cbba6e0e80ded770f542a" + integrity sha512-+i9lY5ENlfi2mJwsggzR+XASOIgMd7S/Gd3/13NCpv596n3YSplMAueBTIxNLcxDpTcIksp+9pM3UaDrJDpFqA== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" diff --git a/yarn.lock b/yarn.lock index c4640b76b4..436199f240 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10719,9 +10719,9 @@ cypress-plugin-snapshots@^1.4.4: unidiff "1.0.2" cypress@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/cypress/-/cypress-10.1.0.tgz#6514a26c721822a02bc194e9a7f72c3142aea174" - integrity sha512-aQ4JVZVib4Xd9FZW8IRZfKelUvqF4y5A+oUbNvn8TlsBmEfIg3m5Xd6Mt6PVU/jHiVJ9Psl905B3ZPnrDcmyuQ== + version "10.2.0" + resolved "https://registry.npmjs.org/cypress/-/cypress-10.2.0.tgz#ca078abfceb13be2a33cbba6e0e80ded770f542a" + integrity sha512-+i9lY5ENlfi2mJwsggzR+XASOIgMd7S/Gd3/13NCpv596n3YSplMAueBTIxNLcxDpTcIksp+9pM3UaDrJDpFqA== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" From c5270e31a269ba2e51e3a2cf7802a534c38f283b Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 21 Jun 2022 22:49:29 -0400 Subject: [PATCH 257/590] Improve plural handling in log output Signed-off-by: Adam Harvey --- packages/backend-common/src/config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/config.ts b/packages/backend-common/src/config.ts index 94b362d99d..608869ea93 100644 --- a/packages/backend-common/src/config.ts +++ b/packages/backend-common/src/config.ts @@ -53,7 +53,9 @@ const updateRedactionList = ( ); logger.info( - `${values.size} secrets found in the config which will be redacted`, + `${values.size} secret${ + values.size > 1 ? 's' : '' + } found in the config which will be redacted`, ); setRootLoggerRedactionList(Array.from(values)); From 0fc57887e86d4ccbd3764d27a63a7a1c4286a2b7 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 21 Jun 2022 22:50:34 -0400 Subject: [PATCH 258/590] Add changeset Signed-off-by: Adam Harvey --- .changeset/quiet-pens-notice.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-pens-notice.md diff --git a/.changeset/quiet-pens-notice.md b/.changeset/quiet-pens-notice.md new file mode 100644 index 0000000000..aa6aeb049d --- /dev/null +++ b/.changeset/quiet-pens-notice.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Improve plural handling in logging output for secrets From d821a2eec3269be542b27e28da5f8d1c61cb8eea Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 21 Jun 2022 23:08:41 -0400 Subject: [PATCH 259/590] Fix minor possessive typo Signed-off-by: Adam Harvey --- docs/getting-started/project-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/project-structure.md b/docs/getting-started/project-structure.md index cbe84db2e0..8dca898ae7 100644 --- a/docs/getting-started/project-structure.md +++ b/docs/getting-started/project-structure.md @@ -28,7 +28,7 @@ the code. sub-folder which is used for a markdown spellchecker. - [`.yarn/`](https://github.com/backstage/backstage/tree/master/.yarn) - - Backstage ships with it's own `yarn` implementation. This allows us to have + Backstage ships with its own `yarn` implementation. This allows us to have better control over our `yarn.lock` file and hopefully avoid problems due to yarn versioning differences. From d8e116964f70da1e2480ad93157b2b630cb94e01 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 21 Jun 2022 23:17:42 -0400 Subject: [PATCH 260/590] Fix broken deployment link Signed-off-by: Adam Harvey --- docs/FAQ.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 96d49ff060..f695a59410 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -223,8 +223,7 @@ For more information, see our No, this is not a service offering. We build the piece of software, and someone in your infrastructure team is responsible for -[deploying](https://backstage.io/docs/getting-started/deployment-k8s) and -maintaining it. +[deploying](https://backstage.io/docs/deployment) and maintaining it. ### How secure is Backstage? From 80542ee49cd308da40d7eb335a8884aa4b9d57cf Mon Sep 17 00:00:00 2001 From: nguyentranbao-ct Date: Wed, 22 Jun 2022 11:01:26 +0700 Subject: [PATCH 261/590] docs(adopters): add Cho Tot company Signed-off-by: nguyentranbao-ct --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 44e9dc9b44..8eacb45f83 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -183,3 +183,4 @@ _If you're using Backstage in your organization, please try to add your company | [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group. | [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component. | [Clarivate](https://www.clarivate.com) | [Gabriele Carteni](mailto:gabriele.carteni@clarivate.com) | We are building our Developer Portal using Backstage to have a better control over our software ecosystem, integrate SDLC tools and promote best practices | +| [Cho Tot](https://www.chotot.com) | [Chotot Team](mailto:sre@chotot.vn) | Internal developer portal, service catalog with CI/CD tools. From bf44af8b41e37139f1661fa98f20760eb6212a8a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 07:43:55 +0000 Subject: [PATCH 262/590] fix(deps): update dependency aws-sdk to v2.1159.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 436199f240..c232257cd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8232,9 +8232,9 @@ aws-sdk-mock@^5.2.1: traverse "^0.6.6" aws-sdk@^2.1122.0, aws-sdk@^2.840.0, aws-sdk@^2.948.0: - version "2.1158.0" - resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1158.0.tgz#924fb6dda1acecb1dc1c8901095cf64d6acdade4" - integrity sha512-uHYzZMGE+b50sWXaLhga4aD1SpB3+DEZclAkg9aYz2pDZlSDTOMh3uJ/ufsMBs7VcDKGS7mQRibCmCbwRGTIlg== + version "2.1159.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1159.0.tgz#64d585ac608d58e6ff62678be71a4c4ca61ca5dc" + integrity sha512-zm3k/ufwZnkWc6M+HDz00CWuILot4L9kJ5VJsuDS9fwsT9To6k91Y1njCtIV4tcgcXvUru0Sbm4D0w5bc2847A== dependencies: buffer "4.9.2" events "1.1.1" From 1d7fe55f6fbf263a17ae6ebeb5aa8adfc39877c8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 08:06:52 +0000 Subject: [PATCH 263/590] fix(deps): update dependency graphql-modules to v2.1.0 Signed-off-by: Renovate Bot --- yarn.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 42c2af7d55..670073ba31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2597,7 +2597,7 @@ "@graphql-tools/utils" "8.6.13" tslib "^2.4.0" -"@graphql-tools/schema@8.3.10", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.1.1", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.3.1": +"@graphql-tools/schema@8.3.10", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.3.1": version "8.3.10" resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.10.tgz#c3e373e6ad854f533fc7e55859dd8f9e81de30dd" integrity sha512-tfhjSTi3OzheDrVzG7rkPZg2BbQjmZRLM2vvQoM2b1TnUwgUIbpAgcnf+AWDLRsoCOWlezeLgij1BLeAR0Q0jg== @@ -14070,14 +14070,14 @@ graphql-language-service@^5.0.6: vscode-languageserver-types "^3.15.1" graphql-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/graphql-modules/-/graphql-modules-2.0.0.tgz#5f710d86eb7295da83769c8cd6d61a049d999800" - integrity sha512-CM5CIJp428+ripgcLyrioBmAKB3ucvIEOgJG4WMjnOgScHY/eCZh/8I51cF8oc+pqebOgBCR3HH//IH5v7kv+w== + version "2.1.0" + resolved "https://registry.npmjs.org/graphql-modules/-/graphql-modules-2.1.0.tgz#d99692034b4b053fba3d0ebe49e4e66772ed2785" + integrity sha512-fOUc4i5xNLkRxqx234MIr+kolrxk1tZ2onTeRIcB73mCY4NeKxej7FMLb5St+UcNLzhqM4L6Mf47rN9MPVDmgA== dependencies: - "@graphql-tools/schema" "^8.1.1" + "@graphql-tools/schema" "^8.3.1" "@graphql-tools/wrap" "^8.3.1" "@graphql-typed-document-node/core" "^3.1.0" - ramda "^0.27.1" + ramda "^0.28.0" graphql-request@^4.0.0: version "4.2.0" @@ -21412,10 +21412,10 @@ raf@^3.4.0: dependencies: performance-now "^2.1.0" -ramda@^0.27.1: - version "0.27.2" - resolved "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" - integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== +ramda@^0.28.0: + version "0.28.0" + resolved "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97" + integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA== randexp@^0.5.3: version "0.5.3" From 6cf1fe4bc4b35b0cc02ed71c09082101bce76d1c Mon Sep 17 00:00:00 2001 From: Andrea Giannantonio Date: Wed, 22 Jun 2022 11:36:16 +0200 Subject: [PATCH 264/590] fix: adopters table border Signed-off-by: Andrea Giannantonio --- ADOPTERS.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 8eacb45f83..e8d2aeed8b 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -3,7 +3,7 @@ _If you're using Backstage in your organization, please try to add your company name to this list. This really helps the project to gain momentum and credibility. It's a small contribution back to the project with a big impact._ | Organization | Contact | Description of Use | -| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [Spotify](https://www.spotify.com) | [@leemills83](https://github.com/leemills83) | Main interface towards all of Spotify's infrastructure and technical documentation. | | [bol.com](https://www.bol.com) | [@sagacity](https://github.com/sagacity) | Initial work being done to unify platform tooling. | | [DFDS](https://www.dfds.com) | [@carlsendk](https://github.com/carlsendk) | V2 self-service platform. | @@ -34,9 +34,9 @@ _If you're using Backstage in your organization, please try to add your company | [Netflix](https://www.netflix.com/) | [bleathem](https://github.com/bleathem) | Our Backstage implementation will be the front door to a unified experience connecting our internal platform products across important workflows with integrated knowledge and support. | | [b.well](https://www.icanbwell.com/) | [Jacob Rosales](https://github.com/jrosales) | Foundation for our engineering portal and cloud insights. | | [PagerDuty](https://www.pagerduty.com/) | [Mark Shaw](https://github.com/markshawtoronto) | Developer portal, initially focused on software templates and tech-docs. | -| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 | +| [MoonShiner](https://moonshiner.at) | [Fabian Hippmann](https://github.com/FabianHippmann) | Developer portal - helps us keep track of our customer projects, onboard new developers & improve our development process 🌕🚀🧑‍🚀 | | [FundApps](https://www.fundapps.co/) | [Elliot Greenwood](https://github.com/egnwd) | Developer Portal - A place for us to keep track of our projects and documentation for all services and processes | -| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com), [Kamil Wolny](https://github.com/mrwolny) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). | +| [DAZN](https://dazn.com/) | [Lou Bichard](https://twitter.com/loujaybee), [Marco Crivellaro](https://github.com/crivetechie), [Alex Hollerith](mailto:alex.hollerith@dazn.com), [Kamil Wolny](https://github.com/mrwolny) | Ingesting all of DAZN's repos for the catalog, migrating our internal platform apps (pull request boards, release information, inner source marketplace etc) to Backstage plugins (where applicable). | | [HelloFresh](https://www.hellofresh.de/) | [@iammuho](https://github.com/iammuho), [@ElenaForester](https://github.com/ElenaForester), [@diegomarangoni](https://github.com/diegomarangoni) | Our developer portal at HelloFresh - Spread across an organisation of 500+ engineers globally. | | [FactSet](https://www.factset.com/) | [@kuangp](https://github.com/kuangp) | Developer portal to provide discoverability to all internal components, APIs, documentation, and scaffold templates with integrations to our internal infrastructure tools. | | [Workrise](https://www.workrise.com/) | [Michael Rode](https://github.com/michaelrode) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. | @@ -161,7 +161,7 @@ _If you're using Backstage in your organization, please try to add your company | [OVHcloud](https://www.ovhcloud.com/fr/) | [Jean-Philippe Blary](https://github.com/blaryjp), [Arnaud Bauer](mailto:arnaud.bauer@ovhcloud.com), [Flavien Chantelot](https://github.com/Dorn-) | We're providing Backstage to our collaborators to ease their daily jobs, and let them extends it using plugins. | | [Procter & Gamble](https://us.pg.com/) | [Binita Nayak](https://github.com/binitan), [Josh Rose](https://github.com/joshuarose), [RJ Winkler](https://github.com/rjwink) | P&G leverages Backstage to build internal developer portal to ensure developers' happiness. This developer portal shall act as single source of information needed by development teams to seamlessly create, find and maintain their software components/resources/documentation. | | [SANS Institute](https://www.sans.org) | [Christopher Klewin](mailto:cklewin@sans.org) | Developer portal for centralized visibility, reporting, and tooling across multiple organizations. | -| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) | Service catalog, developer portal, and technical documentation | +| [Okay](https://www.okayhq.com/) | [Tomas Barreto](mailto:tomas@okayhq.com) | Service catalog, developer portal, and technical documentation | | [Kaluza](https://www.kaluza.com) | [James Condren](mailto:james.condron@kaluza.com) | To provide an automated golden path to developers, with a focus on discovery and documentation | | [LinkedIn](https://linkedin.com) | [Joshua Lawrence](mailto:jlawrence@linkedin.com) | We are building a platform for internal web tools | | [Forto](https://forto.com) | [Rodolfo Matos](mailto:rodolfo.matos@forto.com) | Still in a experimental phase/assessing the organisational fit. We will be using it mostly a developer portal -- pretty standard use case. | @@ -171,16 +171,16 @@ _If you're using Backstage in your organization, please try to add your company | [AEB](https://www.aeb.com/) | [David Fankhänel](mailto:dfl@aeb.com) | Central developer platform for creating new apps via templates, getting an overview via software catalog, etc | | [SALTO Systems](https://saltosystems.com) | [Ian Cowley](mailto:i.cowley@saltosystems.com) | Currently using Backstage as an internal documentation portal. | | [Lummo](https://lummo.com) | [Anjul Sahu](mailto:anjul@lummo.com) | We are building the internal developer portal using Backstage and bringing up all integrations and service information at one place. | -| [Frontside](https://frontside.com) | [Taras Mankovski](mailto:taras@frontside.com) | +| [Frontside](https://frontside.com) | [Taras Mankovski](mailto:taras@frontside.com) | | | [Stepstone](https://www.stepstone.com/en/) | [Neil Kennedy](mailto:neil.kennedy@stepstone.com) | StepStone is using Backstage to solve problems around ownership and visibility of our applications. We have thousands of repos, multiple legacy systems and a growing platform that is hard to maintain. Backstage is forming the centre of our push to embrace the chaos. | | [idwall](https://idwall.co) | [Rodrigo Catão Araujo](mailto:rodrigo@idwall.co) | Developer Portal for internal engineers to access service catalog, documentation, observability, infrastructure and internal tooling. | | [Jaguar Land Rover](https://www.jaguarlandrover.com) | [Josh Walker](mailto:jwalke18@jaguarlandrover.com) | Users can request a Gitlab user, which creates a commit with the Terraform code. | -| [Glovo](http://glovoapp.com/) | [Yaser Toutah](mailto:yaser.toutah@glovoapp.com) | Developer Portal to improve our Developer Experience, identify ownership and track metadata for our services and tools. It's our Service Catalog. In addition to that, we use it for Service Creation, and much more. | +| [Glovo](http://glovoapp.com/) | [Yaser Toutah](mailto:yaser.toutah@glovoapp.com) | Developer Portal to improve our Developer Experience, identify ownership and track metadata for our services and tools. It's our Service Catalog. In addition to that, we use it for Service Creation, and much more. | | [Dixa](https://dixa.com) | [Jens Møller](mailto:jsc@dixa.com) | We are in early stages, but using it to get overview of our repositories and ownership of these. We want among many things to use it for compliance and easier access to key metrics for our repos. | | [Notino](https://notino.com) | [Jan Remunda](mailto:jan.remunda@notino.com) | Backstage is our developer portal. We use it as service catalog and for technical documentation. | | [Polarpoint](https://polarpoint.io/) | [Surj Bains](https://github.com/polarpoint-io) | We are using Backstage as our Developer portal as well as for hosting our DevOps portal for software catalog. | | [Niche](https://niche.com) | [Zach Romitz](mailto:zach.romitz@niche.com) | We are using the Software Catalog, Software Templates, API documentation, and Techdocs to try and centralize service information. | -| [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group. -| [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component. -| [Clarivate](https://www.clarivate.com) | [Gabriele Carteni](mailto:gabriele.carteni@clarivate.com) | We are building our Developer Portal using Backstage to have a better control over our software ecosystem, integrate SDLC tools and promote best practices | -| [Cho Tot](https://www.chotot.com) | [Chotot Team](mailto:sre@chotot.vn) | Internal developer portal, service catalog with CI/CD tools. +| [Mercedes-Benz.io](https://www.mercedes-benz.io/) | [Manuel Santos](https://github.com/manusant) | At Mercedes-Benz we use it as a developer portal with software catalog, TechDocs, Scaffolding and custom plugins. It provides an overview of our tech ecosystem to our product development teams. The portal also serves as a way to foster collaboration among the numerous companies of the Mercedes-Benz Group. | +| [Funding Circle](https://www.fundingcircle.com/) | [Ariel Pacciaroni](https://github.com/arielpacciaroni) | We are building the internal developer portal using Backstage project and centralizing all services information at one place. The portal helps us track down repositories ownership as well as direct access to key information on every component. | +| [Clarivate](https://www.clarivate.com) | [Gabriele Carteni](mailto:gabriele.carteni@clarivate.com) | We are building our Developer Portal using Backstage to have a better control over our software ecosystem, integrate SDLC tools and promote best practices | +| [Cho Tot](https://www.chotot.com) | [Chotot Team](mailto:sre@chotot.vn) | Internal developer portal, service catalog with CI/CD tools. | From 40de38154f267faa4f7f7a5c2eeee22166249de4 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Wed, 22 Jun 2022 11:45:45 +0200 Subject: [PATCH 265/590] chore: convert to patch Signed-off-by: Johan Haals --- .changeset/two-crews-accept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/two-crews-accept.md b/.changeset/two-crews-accept.md index deacf1559d..9540f97cb5 100644 --- a/.changeset/two-crews-accept.md +++ b/.changeset/two-crews-accept.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-catalog-backend-module-gitlab': minor +'@backstage/plugin-catalog-backend-module-gitlab': patch --- Add the possibility in the `GitlabDiscoveryEntityProvider` to scan the whole project instead of concrete groups. For that, use a configuration like this one, where the group parameter is omitted (not mandatory anymore): From 32c03c6a69f0d0157af1b80508ded0a8280b85c8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 22 Jun 2022 12:38:37 +0200 Subject: [PATCH 266/590] docs: add node release section to versioning policy Signed-off-by: Patrik Oldsberg --- docs/overview/versioning-policy.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/overview/versioning-policy.md b/docs/overview/versioning-policy.md index 7430f3c200..282906c580 100644 --- a/docs/overview/versioning-policy.md +++ b/docs/overview/versioning-policy.md @@ -135,3 +135,21 @@ package export. accessed via `/beta` or `/alpha` imports. - `@alpha` - here be dragons. Not visible in the main package entry point, alpha exports must be accessed via `/alpha` imports. + +## Node.js Releases + +The Backstage project uses [Node.js](https://nodejs.org/) for both its development +tooling and backend runtime. In order for expectations to be clear we use the +following schedule for determining the [Node.js releases](https://nodejs.org/en/about/releases/) that we support: + +- At any given point in time we support exactly two adjacent even-numbered + releases of Node.js, for example v12 and v14. +- Three months before a Node.js release becomes _Active LTS_ we switch support + to that release and the previous one. This is halfway through the _Current LTS_ + cycle for that release and occurs at the end of July every year. + +When we say _Supporting_ a Node.js release, that means the following: + +- The CI pipeline in the main Backstage repo tests towards the supported releases, and we encourage any other Backstage related projects to do the same. +- New Backstage projects created with `@backstage/create-app` will have their `engines.node` version set accordingly. +- Dropping compatibility with unsupported releases is not considered a breaking change. This includes using new syntax or APIs, as well as bumping dependencies that drop support for these versions. From dabbb286f7e345f4c1d522a2cd40c1353a8a0952 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Wed, 22 Jun 2022 06:58:23 -0500 Subject: [PATCH 267/590] Corrected typos Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- docs/features/techdocs/addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 33d97521d3..a4e1de7d4f 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -52,7 +52,7 @@ Addons are rendered in the order in which they are registered. ## Installing and using Addons -To start using Addons you need to add the `@backstage/plugin-techdocs-module-addons-contrib` package you your app, you can do that by running this command form the root of your project: `yarn add --cwd packages/app @backstage/plugin-techdocs-module-addons-contrib` +To start using Addons you need to add the `@backstage/plugin-techdocs-module-addons-contrib` package to your app. You can do that by running this command from the root of your project: `yarn add --cwd packages/app @backstage/plugin-techdocs-module-addons-contrib` Addons can be installed and configured in much the same way as extensions for other Backstage plugins: by adding them underneath an extension registry From 34c97eb35ba76c2790f33b3c8616146781c42822 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Wed, 22 Jun 2022 13:39:39 +0200 Subject: [PATCH 268/590] switch to use .json instead of .send Signed-off-by: Emma Indal --- .../src/engines/ElasticSearchSearchEngine.ts | 11 +++++++---- plugins/search-backend-node/api-report.md | 6 ++++-- plugins/search-backend-node/src/errors.ts | 18 ++++++++++++++++-- plugins/search-backend/src/service/router.ts | 8 +------- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index 8f321a266c..1eb32c882d 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -362,13 +362,16 @@ export class ElasticSearchSearchEngine implements SearchEngine { nextPageCursor, previousPageCursor, }; - } catch (e) { - if (e.meta.body.error.type === 'index_not_found_exception') { - throw new MissingIndexError(`Missing index for ${queryIndices}`, e); + } catch (error) { + if (error.meta.body.error.type === 'index_not_found_exception') { + throw new MissingIndexError( + `Missing index for ${queryIndices}. This means there are no documents to search through.`, + error, + ); } this.logger.error( `Failed to query documents for indices ${queryIndices}`, - e, + error, ); return Promise.reject({ results: [] }); } diff --git a/plugins/search-backend-node/api-report.md b/plugins/search-backend-node/api-report.md index 63273d7514..ff9480c19d 100644 --- a/plugins/search-backend-node/api-report.md +++ b/plugins/search-backend-node/api-report.md @@ -6,7 +6,6 @@ /// import { Config } from '@backstage/config'; -import { CustomErrorBase } from '@backstage/errors'; import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { DocumentDecoratorFactory } from '@backstage/plugin-search-common'; import { DocumentTypeInfo } from '@backstage/plugin-search-common'; @@ -115,7 +114,10 @@ export class LunrSearchEngineIndexer extends BatchSearchEngineIndexer { } // @public -export class MissingIndexError extends CustomErrorBase {} +export class MissingIndexError extends Error { + constructor(message?: string, cause?: Error | unknown); + readonly cause?: Error | undefined; +} // @public export class NewlineDelimitedJsonCollatorFactory diff --git a/plugins/search-backend-node/src/errors.ts b/plugins/search-backend-node/src/errors.ts index c6128f3f2e..00b168d460 100644 --- a/plugins/search-backend-node/src/errors.ts +++ b/plugins/search-backend-node/src/errors.ts @@ -14,10 +14,24 @@ * limitations under the License. */ -import { CustomErrorBase } from '@backstage/errors'; +import { isError } from '@backstage/errors'; /** * Failed to query documents for index that does not exist. * @public */ -export class MissingIndexError extends CustomErrorBase {} +export class MissingIndexError extends Error { + /** + * An inner error that caused this error to be thrown, if any. + */ + readonly cause?: Error | undefined; + + constructor(message?: string, cause?: Error | unknown) { + super(message); + + Error.captureStackTrace?.(this, this.constructor); + + this.name = this.constructor.name; + this.cause = isError(cause) ? cause : undefined; + } +} diff --git a/plugins/search-backend/src/service/router.ts b/plugins/search-backend/src/service/router.ts index c85b3ed797..0fbacb018e 100644 --- a/plugins/search-backend/src/service/router.ts +++ b/plugins/search-backend/src/service/router.ts @@ -162,13 +162,7 @@ export async function createRouter( res.send(filterResultSet(toSearchResults(resultSet))); } catch (error) { if (error instanceof MissingIndexError) { - res - .status(400) - .send( - `\nNo index found for types: ${ - query.types ? query.types.join(',') : '' - }. This means there are no documents to search through.`, - ); + res.status(400).json(error.message); } throw new Error( From e150231eb962bbe8616580ff3c6e1ab76c2cdfb6 Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Tue, 21 Jun 2022 14:23:08 +0100 Subject: [PATCH 269/590] refactor: DRY on input and output properties Signed-off-by: Marco Crivellaro --- .../builtin/github/githubRepoCreate.ts | 131 ++----------- .../actions/builtin/github/githubRepoPush.ts | 85 ++------- .../actions/builtin/github/inputProperties.ts | 161 ++++++++++++++++ .../builtin/github/outputProperties.ts | 27 +++ .../actions/builtin/publish/github.ts | 175 +++--------------- 5 files changed, 248 insertions(+), 331 deletions(-) create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/outputProperties.ts diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts index 494a47516c..a725602e07 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts @@ -22,6 +22,8 @@ import { Octokit } from 'octokit'; import { createTemplateAction } from '../../createTemplateAction'; import { parseRepoUrl } from '../publish/util'; import { getOctokitOptions } from './helpers'; +import * as inputProps from './inputProperties'; +import * as outputProps from './outputProperties'; /** * Creates a new action that initializes a git repository @@ -67,123 +69,26 @@ export function createGithubRepoCreateAction(options: { type: 'object', required: ['repoUrl'], properties: { - repoUrl: { - title: 'Repository Location', - description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, - type: 'string', - }, - description: { - title: 'Repository Description', - type: 'string', - }, - access: { - title: 'Repository Access', - description: `Sets an admin collaborator on the repository. Can either be a user reference different from 'owner' in 'repoUrl' or team reference, eg. 'org/team-name'`, - type: 'string', - }, - requireCodeOwnerReviews: { - title: 'Require CODEOWNER Reviews?', - description: - 'Require an approved review in PR including files with a designated Code Owner', - type: 'boolean', - }, - requiredStatusCheckContexts: { - title: 'Required Status Check Contexts', - description: - 'The list of status checks to require in order to merge into this branch', - type: 'array', - items: { - type: 'string', - }, - }, - repoVisibility: { - title: 'Repository Visibility', - type: 'string', - enum: ['private', 'public', 'internal'], - }, - deleteBranchOnMerge: { - title: 'Delete Branch On Merge', - type: 'boolean', - description: `Delete the branch after merging the PR. The default value is 'false'`, - }, - gitAuthorName: { - title: 'Default Author Name', - type: 'string', - description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, - }, - gitAuthorEmail: { - title: 'Default Author Email', - type: 'string', - description: `Sets the default author email for the commit.`, - }, - allowMergeCommit: { - title: 'Allow Merge Commits', - type: 'boolean', - description: `Allow merge commits. The default value is 'true'`, - }, - allowSquashMerge: { - title: 'Allow Squash Merges', - type: 'boolean', - description: `Allow squash merges. The default value is 'true'`, - }, - allowRebaseMerge: { - title: 'Allow Rebase Merges', - type: 'boolean', - description: `Allow rebase merges. The default value is 'true'`, - }, - collaborators: { - title: 'Collaborators', - description: 'Provide additional users or teams with permissions', - type: 'array', - items: { - type: 'object', - additionalProperties: false, - required: ['access'], - properties: { - access: { - type: 'string', - description: 'The type of access for the user', - enum: ['push', 'pull', 'admin', 'maintain', 'triage'], - }, - user: { - type: 'string', - description: - 'The name of the user that will be added as a collaborator', - }, - team: { - type: 'string', - description: - 'The name of the team that will be added as a collaborator', - }, - }, - oneOf: [{ required: ['user'] }, { required: ['team'] }], - }, - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - topics: { - title: 'Topics', - type: 'array', - items: { - type: 'string', - }, - }, + repoUrl: inputProps.repoUrl, + description: inputProps.description, + access: inputProps.access, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + repoVisibility: inputProps.repoVisibility, + deleteBranchOnMerge: inputProps.deleteBranchOnMerge, + allowMergeCommit: inputProps.allowMergeCommit, + allowSquashMerge: inputProps.allowSquashMerge, + allowRebaseMerge: inputProps.allowRebaseMerge, + collaborators: inputProps.collaborators, + token: inputProps.token, + topics: inputProps.topics, }, }, output: { type: 'object', properties: { - remoteUrl: { - title: 'A URL to the repository with the provider', - type: 'string', - }, - repoContentsUrl: { - title: 'A URL to the root of the repository', - type: 'string', - }, + remoteUrl: outputProps.remoteUrl, + repoContentsUrl: outputProps.repoContentsUrl, }, }, }, @@ -212,7 +117,7 @@ export function createGithubRepoCreateAction(options: { integrations, credentialsProvider: githubCredentialsProvider, token: providedToken, - repoUrl, + repoUrl: repoUrl, }); const client = new Octokit(octokitOptions); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts index cdf9a9b4e6..df9f5463fe 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts @@ -27,6 +27,8 @@ import { } from '../helpers'; import { getRepoSourceDirectory, parseRepoUrl } from '../publish/util'; import { getOctokitOptions } from './helpers'; +import * as inputProps from './inputProperties'; +import * as outputProps from './outputProperties'; /** * Creates a new action that initializes a git repository of the content in the workspace @@ -62,82 +64,23 @@ export function createGithubRepoPushAction(options: { type: 'object', required: ['repoUrl'], properties: { - repoUrl: { - title: 'Repository Location', - description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, - type: 'string', - }, - requireCodeOwnerReviews: { - title: 'Require CODEOWNER Reviews?', - description: - 'Require an approved review in PR including files with a designated Code Owner', - type: 'boolean', - }, - requiredStatusCheckContexts: { - title: 'Required Status Check Contexts', - description: - 'The list of status checks to require in order to merge into this branch', - type: 'array', - items: { - type: 'string', - }, - }, - defaultBranch: { - title: 'Default Branch', - type: 'string', - description: `Sets the default branch on the repository. The default value is 'master'`, - }, - protectDefaultBranch: { - title: 'Protect Default Branch', - type: 'boolean', - description: `Protect the default branch after creating the repository. The default value is 'true'`, - }, - gitCommitMessage: { - title: 'Git Commit Message', - type: 'string', - description: `Sets the commit message on the repository. The default value is 'initial commit'`, - }, - gitAuthorName: { - title: 'Default Author Name', - type: 'string', - description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, - }, - gitAuthorEmail: { - title: 'Default Author Email', - type: 'string', - description: `Sets the default author email for the commit.`, - }, - sourcePath: { - title: 'Source Path', - description: - 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', - type: 'string', - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - topics: { - title: 'Topics', - type: 'array', - items: { - type: 'string', - }, - }, + repoUrl: inputProps.repoUrl, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + defaultBranch: inputProps.defaultBranch, + protectDefaultBranch: inputProps.protectDefaultBranch, + gitCommitMessage: inputProps.gitCommitMessage, + gitAuthorName: inputProps.gitAuthorName, + gitAuthorEmail: inputProps.gitAuthorEmail, + sourcePath: inputProps.sourcePath, + token: inputProps.token, }, }, output: { type: 'object', properties: { - remoteUrl: { - title: 'A URL to the repository with the provider', - type: 'string', - }, - repoContentsUrl: { - title: 'A URL to the root of the repository', - type: 'string', - }, + remoteUrl: outputProps.remoteUrl, + repoContentsUrl: outputProps.repoContentsUrl, }, }, }, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts new file mode 100644 index 0000000000..0aad402f1f --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/inputProperties.ts @@ -0,0 +1,161 @@ +/* + * Copyright 2021 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. + */ + +const repoUrl = { + title: 'Repository Location', + description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, + type: 'string', +}; +const description = { + title: 'Repository Description', + type: 'string', +}; +const access = { + title: 'Repository Access', + description: `Sets an admin collaborator on the repository. Can either be a user reference different from 'owner' in 'repoUrl' or team reference, eg. 'org/team-name'`, + type: 'string', +}; +const requireCodeOwnerReviews = { + title: 'Require CODEOWNER Reviews?', + description: + 'Require an approved review in PR including files with a designated Code Owner', + type: 'boolean', +}; +const requiredStatusCheckContexts = { + title: 'Required Status Check Contexts', + description: + 'The list of status checks to require in order to merge into this branch', + type: 'array', + items: { + type: 'string', + }, +}; +const repoVisibility = { + title: 'Repository Visibility', + type: 'string', + enum: ['private', 'public', 'internal'], +}; +const deleteBranchOnMerge = { + title: 'Delete Branch On Merge', + type: 'boolean', + description: `Delete the branch after merging the PR. The default value is 'false'`, +}; +const gitAuthorName = { + title: 'Default Author Name', + type: 'string', + description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, +}; +const gitAuthorEmail = { + title: 'Default Author Email', + type: 'string', + description: `Sets the default author email for the commit.`, +}; +const allowMergeCommit = { + title: 'Allow Merge Commits', + type: 'boolean', + description: `Allow merge commits. The default value is 'true'`, +}; +const allowSquashMerge = { + title: 'Allow Squash Merges', + type: 'boolean', + description: `Allow squash merges. The default value is 'true'`, +}; +const allowRebaseMerge = { + title: 'Allow Rebase Merges', + type: 'boolean', + description: `Allow rebase merges. The default value is 'true'`, +}; +const collaborators = { + title: 'Collaborators', + description: 'Provide additional users or teams with permissions', + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['access'], + properties: { + access: { + type: 'string', + description: 'The type of access for the user', + enum: ['push', 'pull', 'admin', 'maintain', 'triage'], + }, + user: { + type: 'string', + description: + 'The name of the user that will be added as a collaborator', + }, + team: { + type: 'string', + description: + 'The name of the team that will be added as a collaborator', + }, + }, + oneOf: [{ required: ['user'] }, { required: ['team'] }], + }, +}; +const token = { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitHub', +}; +const topics = { + title: 'Topics', + type: 'array', + items: { + type: 'string', + }, +}; +const defaultBranch = { + title: 'Default Branch', + type: 'string', + description: `Sets the default branch on the repository. The default value is 'master'`, +}; +const protectDefaultBranch = { + title: 'Protect Default Branch', + type: 'boolean', + description: `Protect the default branch after creating the repository. The default value is 'true'`, +}; +const gitCommitMessage = { + title: 'Git Commit Message', + type: 'string', + description: `Sets the commit message on the repository. The default value is 'initial commit'`, +}; +const sourcePath = { + title: 'Source Path', + description: + 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', + type: 'string', +}; + +export { access }; +export { allowMergeCommit }; +export { allowRebaseMerge }; +export { allowSquashMerge }; +export { collaborators }; +export { defaultBranch }; +export { deleteBranchOnMerge }; +export { description }; +export { gitAuthorEmail }; +export { gitAuthorName }; +export { gitCommitMessage }; +export { protectDefaultBranch }; +export { repoUrl }; +export { repoVisibility }; +export { requireCodeOwnerReviews }; +export { requiredStatusCheckContexts }; +export { sourcePath }; +export { token }; +export { topics }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/outputProperties.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/outputProperties.ts new file mode 100644 index 0000000000..d5d6eb108f --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/outputProperties.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2021 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. + */ + +const remoteUrl = { + title: 'A URL to the repository with the provider', + type: 'string', +}; +const repoContentsUrl = { + title: 'A URL to the root of the repository', + type: 'string', +}; + +export { remoteUrl }; +export { repoContentsUrl }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts index d9a7112fc9..145827702d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts @@ -13,20 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { Config } from '@backstage/config'; +import { assertError, InputError } from '@backstage/errors'; import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; +import { Octokit } from 'octokit'; +import { createTemplateAction } from '../../createTemplateAction'; +import { getOctokitOptions } from '../github/helpers'; +import * as inputProps from '../github/inputProperties'; +import * as outputProps from '../github/outputProperties'; import { enableBranchProtectionOnDefaultRepoBranch, initRepoAndPush, } from '../helpers'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; -import { createTemplateAction } from '../../createTemplateAction'; -import { Config } from '@backstage/config'; -import { assertError, InputError } from '@backstage/errors'; -import { getOctokitOptions } from '../github/helpers'; -import { Octokit } from 'octokit'; /** * Creates a new action that initializes a git repository of the content in the workspace @@ -84,153 +86,32 @@ export function createPublishGithubAction(options: { type: 'object', required: ['repoUrl'], properties: { - repoUrl: { - title: 'Repository Location', - description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, - type: 'string', - }, - description: { - title: 'Repository Description', - type: 'string', - }, - access: { - title: 'Repository Access', - description: `Sets an admin collaborator on the repository. Can either be a user reference different from 'owner' in 'repoUrl' or team reference, eg. 'org/team-name'`, - type: 'string', - }, - requireCodeOwnerReviews: { - title: 'Require CODEOWNER Reviews?', - description: - 'Require an approved review in PR including files with a designated Code Owner', - type: 'boolean', - }, - requiredStatusCheckContexts: { - title: 'Required Status Check Contexts', - description: - 'The list of status checks to require in order to merge into this branch', - type: 'array', - items: { - type: 'string', - }, - }, - repoVisibility: { - title: 'Repository Visibility', - type: 'string', - enum: ['private', 'public', 'internal'], - }, - defaultBranch: { - title: 'Default Branch', - type: 'string', - description: `Sets the default branch on the repository. The default value is 'master'`, - }, - protectDefaultBranch: { - title: 'Protect Default Branch', - type: 'boolean', - description: `Protect the default branch after creating the repository. The default value is 'true'`, - }, - deleteBranchOnMerge: { - title: 'Delete Branch On Merge', - type: 'boolean', - description: `Delete the branch after merging the PR. The default value is 'false'`, - }, - gitCommitMessage: { - title: 'Git Commit Message', - type: 'string', - description: `Sets the commit message on the repository. The default value is 'initial commit'`, - }, - gitAuthorName: { - title: 'Default Author Name', - type: 'string', - description: `Sets the default author name for the commit. The default value is 'Scaffolder'`, - }, - gitAuthorEmail: { - title: 'Default Author Email', - type: 'string', - description: `Sets the default author email for the commit.`, - }, - allowMergeCommit: { - title: 'Allow Merge Commits', - type: 'boolean', - description: `Allow merge commits. The default value is 'true'`, - }, - allowSquashMerge: { - title: 'Allow Squash Merges', - type: 'boolean', - description: `Allow squash merges. The default value is 'true'`, - }, - allowRebaseMerge: { - title: 'Allow Rebase Merges', - type: 'boolean', - description: `Allow rebase merges. The default value is 'true'`, - }, - sourcePath: { - title: 'Source Path', - description: - 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', - type: 'string', - }, - collaborators: { - title: 'Collaborators', - description: 'Provide additional users or teams with permissions', - type: 'array', - items: { - type: 'object', - additionalProperties: false, - required: ['access'], - properties: { - access: { - type: 'string', - description: 'The type of access for the user', - enum: ['push', 'pull', 'admin', 'maintain', 'triage'], - }, - user: { - type: 'string', - description: - 'The name of the user that will be added as a collaborator', - }, - username: { - type: 'string', - description: - 'Deprecated. Use the `team` or `user` field instead.', - }, - team: { - type: 'string', - description: - 'The name of the team that will be added as a collaborator', - }, - }, - oneOf: [ - { required: ['user'] }, - { required: ['username'] }, - { required: ['team'] }, - ], - }, - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - topics: { - title: 'Topics', - type: 'array', - items: { - type: 'string', - }, - }, + repoUrl: inputProps.repoUrl, + description: inputProps.description, + access: inputProps.access, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + repoVisibility: inputProps.repoVisibility, + defaultBranch: inputProps.defaultBranch, + protectDefaultBranch: inputProps.protectDefaultBranch, + deleteBranchOnMerge: inputProps.deleteBranchOnMerge, + gitCommitMessage: inputProps.gitCommitMessage, + gitAuthorName: inputProps.gitAuthorName, + gitAuthorEmail: inputProps.gitAuthorEmail, + allowMergeCommit: inputProps.allowMergeCommit, + allowSquashMerge: inputProps.allowSquashMerge, + allowRebaseMerge: inputProps.allowRebaseMerge, + sourcePath: inputProps.sourcePath, + collaborators: inputProps.collaborators, + token: inputProps.token, + topics: inputProps.topics, }, }, output: { type: 'object', properties: { - remoteUrl: { - title: 'A URL to the repository with the provider', - type: 'string', - }, - repoContentsUrl: { - title: 'A URL to the root of the repository', - type: 'string', - }, + remoteUrl: outputProps.remoteUrl, + repoContentsUrl: outputProps.repoContentsUrl, }, }, }, From 4271cc7ecced991ce8e5498330e414325a239b64 Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Wed, 22 Jun 2022 11:02:42 +0100 Subject: [PATCH 270/590] refactor repo create, repo push Signed-off-by: Marco Crivellaro --- .../builtin/github/githubRepoCreate.ts | 149 ++-------- .../actions/builtin/github/githubRepoPush.ts | 66 ++--- .../actions/builtin/github/helpers.ts | 221 ++++++++++++++- .../src/scaffolder/actions/builtin/helpers.ts | 18 +- .../actions/builtin/publish/github.ts | 266 ++++++------------ 5 files changed, 369 insertions(+), 351 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts index a725602e07..1e92d91a64 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoCreate.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { assertError, InputError } from '@backstage/errors'; +import { InputError } from '@backstage/errors'; import { GithubCredentialsProvider, ScmIntegrationRegistry, @@ -21,7 +21,10 @@ import { import { Octokit } from 'octokit'; import { createTemplateAction } from '../../createTemplateAction'; import { parseRepoUrl } from '../publish/util'; -import { getOctokitOptions } from './helpers'; +import { + createGithubRepoWithCollaboratorsAndTopics, + getOctokitOptions, +} from './helpers'; import * as inputProps from './inputProperties'; import * as outputProps from './outputProperties'; @@ -58,6 +61,11 @@ export function createGithubRepoCreateAction(options: { team: string; access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; } + | { + /** @deprecated This field is deprecated in favor of team */ + username: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } >; token?: string; topics?: string[]; @@ -107,136 +115,37 @@ export function createGithubRepoCreateAction(options: { token: providedToken, } = ctx.input; - const { owner, repo } = parseRepoUrl(repoUrl, integrations); - - if (!owner) { - throw new InputError('Invalid repository owner provided in repoUrl'); - } - const octokitOptions = await getOctokitOptions({ integrations, credentialsProvider: githubCredentialsProvider, token: providedToken, repoUrl: repoUrl, }); - const client = new Octokit(octokitOptions); - const user = await client.rest.users.getByUsername({ - username: owner, - }); + const { owner, repo } = parseRepoUrl(repoUrl, integrations); - const repoCreationPromise = - user.data.type === 'Organization' - ? client.rest.repos.createInOrg({ - name: repo, - org: owner, - private: repoVisibility === 'private', - visibility: repoVisibility, - description: description, - delete_branch_on_merge: deleteBranchOnMerge, - allow_merge_commit: allowMergeCommit, - allow_squash_merge: allowSquashMerge, - allow_rebase_merge: allowRebaseMerge, - }) - : client.rest.repos.createForAuthenticatedUser({ - name: repo, - private: repoVisibility === 'private', - description: description, - delete_branch_on_merge: deleteBranchOnMerge, - allow_merge_commit: allowMergeCommit, - allow_squash_merge: allowSquashMerge, - allow_rebase_merge: allowRebaseMerge, - }); - - let newRepo; - - try { - newRepo = (await repoCreationPromise).data; - } catch (e) { - assertError(e); - if (e.message === 'Resource not accessible by integration') { - ctx.logger.warn( - `The GitHub app or token provided may not have the required permissions to create the ${user.data.type} repository ${owner}/${repo}.`, - ); - } - throw new Error( - `Failed to create the ${user.data.type} repository ${owner}/${repo}, ${e.message}`, - ); + if (!owner) { + throw new InputError('Invalid repository owner provided in repoUrl'); } - if (access?.startsWith(`${owner}/`)) { - const [, team] = access.split('/'); - await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ - org: owner, - team_slug: team, - owner, - repo, - permission: 'admin', - }); - // No need to add access if it's the person who owns the personal account - } else if (access && access !== owner) { - await client.rest.repos.addCollaborator({ - owner, - repo, - username: access, - permission: 'admin', - }); - } + const newRepo = await createGithubRepoWithCollaboratorsAndTopics( + client, + repo, + owner, + repoVisibility, + description, + deleteBranchOnMerge, + allowMergeCommit, + allowSquashMerge, + allowRebaseMerge, + access, + collaborators, + topics, + ctx.logger, + ); - if (collaborators) { - for (const collaborator of collaborators) { - try { - if ('user' in collaborator) { - await client.rest.repos.addCollaborator({ - owner, - repo, - username: collaborator.user, - permission: collaborator.access, - }); - } else if ('team' in collaborator) { - await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ - org: owner, - team_slug: collaborator.team, - owner, - repo, - permission: collaborator.access, - }); - } - } catch (e) { - assertError(e); - const name = extractCollaboratorName(collaborator); - ctx.logger.warn( - `Skipping ${collaborator.access} access for ${name}, ${e.message}`, - ); - } - } - } - - if (topics) { - try { - await client.rest.repos.replaceAllTopics({ - owner, - repo, - names: topics.map(t => t.toLowerCase()), - }); - } catch (e) { - assertError(e); - ctx.logger.warn(`Skipping topics ${topics.join(' ')}, ${e.message}`); - } - } - - const remoteUrl = newRepo.clone_url; - - ctx.output('remoteUrl', remoteUrl); + ctx.output('remoteUrl', newRepo.clone_url); }, }); } - -function extractCollaboratorName( - collaborator: { user: string } | { team: string } | { username: string }, -) { - if ('username' in collaborator) return collaborator.username; - if ('user' in collaborator) return collaborator.user; - return collaborator.team; -} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts index df9f5463fe..942ebe578d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubRepoPush.ts @@ -14,19 +14,15 @@ * limitations under the License. */ import { Config } from '@backstage/config'; -import { assertError, InputError } from '@backstage/errors'; +import { InputError } from '@backstage/errors'; import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; import { Octokit } from 'octokit'; import { createTemplateAction } from '../../createTemplateAction'; -import { - enableBranchProtectionOnDefaultRepoBranch, - initRepoAndPush, -} from '../helpers'; -import { getRepoSourceDirectory, parseRepoUrl } from '../publish/util'; -import { getOctokitOptions } from './helpers'; +import { parseRepoUrl } from '../publish/util'; +import { getOctokitOptions, initRepoPushAndProtect } from './helpers'; import * as inputProps from './inputProperties'; import * as outputProps from './outputProperties'; @@ -117,48 +113,24 @@ export function createGithubRepoPushAction(options: { const remoteUrl = targetRepo.data.clone_url; const repoContentsUrl = `${targetRepo.data.html_url}/blob/${defaultBranch}`; - const gitAuthorInfo = { - name: gitAuthorName - ? gitAuthorName - : config.getOptionalString('scaffolder.defaultAuthor.name'), - email: gitAuthorEmail - ? gitAuthorEmail - : config.getOptionalString('scaffolder.defaultAuthor.email'), - }; - - await initRepoAndPush({ - dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath), + await initRepoPushAndProtect( remoteUrl, + octokitOptions.auth, + ctx.workspacePath, + ctx.input.sourcePath, defaultBranch, - auth: { - username: 'x-access-token', - password: octokitOptions.auth, - }, - logger: ctx.logger, - commitMessage: gitCommitMessage - ? gitCommitMessage - : config.getOptionalString('scaffolder.defaultCommitMessage'), - gitAuthorInfo, - }); - - if (protectDefaultBranch) { - try { - await enableBranchProtectionOnDefaultRepoBranch({ - owner, - client, - repoName: repo, - logger: ctx.logger, - defaultBranch, - requireCodeOwnerReviews, - requiredStatusCheckContexts, - }); - } catch (e) { - assertError(e); - ctx.logger.warn( - `Skipping: default branch protection on '${repo}', ${e.message}`, - ); - } - } + protectDefaultBranch, + owner, + client, + repo, + requireCodeOwnerReviews, + requiredStatusCheckContexts, + config, + ctx.logger, + gitCommitMessage, + gitAuthorName, + gitAuthorEmail, + ); ctx.output('remoteUrl', remoteUrl); ctx.output('repoContentsUrl', repoContentsUrl); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts index 29997e5843..c8f508e4c0 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts @@ -13,14 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { InputError } from '@backstage/errors'; +import { Config } from '@backstage/config'; +import { assertError, InputError } from '@backstage/errors'; import { DefaultGithubCredentialsProvider, GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; import { OctokitOptions } from '@octokit/core/dist-types/types'; -import { parseRepoUrl } from '../publish/util'; +import { Octokit } from 'octokit'; +import { Logger } from 'winston'; +import { + enableBranchProtectionOnDefaultRepoBranch, + initRepoAndPush, +} from '../helpers'; +import { getRepoSourceDirectory, parseRepoUrl } from '../publish/util'; const DEFAULT_TIMEOUT_MS = 60_000; @@ -83,3 +90,213 @@ export async function getOctokitOptions(options: { previews: ['nebula-preview'], }; } + +export async function createGithubRepoWithCollaboratorsAndTopics( + client: Octokit, + repo: string, + owner: string, + repoVisibility: 'private' | 'internal' | 'public', + description: string | undefined, + deleteBranchOnMerge: boolean, + allowMergeCommit: boolean, + allowSquashMerge: boolean, + allowRebaseMerge: boolean, + access: string | undefined, + collaborators: + | ( + | { + user: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + | { + team: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + | { + /** @deprecated This field is deprecated in favor of team */ + username: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } + )[] + | undefined, + topics: string[] | undefined, + logger: Logger, +) { + const user = await client.rest.users.getByUsername({ + username: owner, + }); + + const repoCreationPromise = + user.data.type === 'Organization' + ? client.rest.repos.createInOrg({ + name: repo, + org: owner, + private: repoVisibility === 'private', + visibility: repoVisibility, + description: description, + delete_branch_on_merge: deleteBranchOnMerge, + allow_merge_commit: allowMergeCommit, + allow_squash_merge: allowSquashMerge, + allow_rebase_merge: allowRebaseMerge, + }) + : client.rest.repos.createForAuthenticatedUser({ + name: repo, + private: repoVisibility === 'private', + description: description, + delete_branch_on_merge: deleteBranchOnMerge, + allow_merge_commit: allowMergeCommit, + allow_squash_merge: allowSquashMerge, + allow_rebase_merge: allowRebaseMerge, + }); + + let newRepo; + + try { + newRepo = (await repoCreationPromise).data; + } catch (e) { + assertError(e); + if (e.message === 'Resource not accessible by integration') { + logger.warn( + `The GitHub app or token provided may not have the required permissions to create the ${user.data.type} repository ${owner}/${repo}.`, + ); + } + throw new Error( + `Failed to create the ${user.data.type} repository ${owner}/${repo}, ${e.message}`, + ); + } + + if (access?.startsWith(`${owner}/`)) { + const [, team] = access.split('/'); + await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ + org: owner, + team_slug: team, + owner, + repo, + permission: 'admin', + }); + // No need to add access if it's the person who owns the personal account + } else if (access && access !== owner) { + await client.rest.repos.addCollaborator({ + owner, + repo, + username: access, + permission: 'admin', + }); + } + + if (collaborators) { + for (const collaborator of collaborators) { + try { + if ('user' in collaborator) { + await client.rest.repos.addCollaborator({ + owner, + repo, + username: collaborator.user, + permission: collaborator.access, + }); + } else if ('team' in collaborator) { + await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ + org: owner, + team_slug: collaborator.team, + owner, + repo, + permission: collaborator.access, + }); + } + } catch (e) { + assertError(e); + const name = extractCollaboratorName(collaborator); + logger.warn( + `Skipping ${collaborator.access} access for ${name}, ${e.message}`, + ); + } + } + } + + if (topics) { + try { + await client.rest.repos.replaceAllTopics({ + owner, + repo, + names: topics.map(t => t.toLowerCase()), + }); + } catch (e) { + assertError(e); + logger.warn(`Skipping topics ${topics.join(' ')}, ${e.message}`); + } + } + + return newRepo; +} + +export async function initRepoPushAndProtect( + remoteUrl: string, + password: string, + workspacePath: string, + sourcePath: string | undefined, + defaultBranch: string, + protectDefaultBranch: boolean, + owner: string, + client: Octokit, + repo: string, + requireCodeOwnerReviews: boolean, + requiredStatusCheckContexts: string[], + config: Config, + logger: any, + gitCommitMessage?: string, + gitAuthorName?: string, + gitAuthorEmail?: string, +) { + const gitAuthorInfo = { + name: gitAuthorName + ? gitAuthorName + : config.getOptionalString('scaffolder.defaultAuthor.name'), + email: gitAuthorEmail + ? gitAuthorEmail + : config.getOptionalString('scaffolder.defaultAuthor.email'), + }; + + const commitMessage = gitCommitMessage + ? gitCommitMessage + : config.getOptionalString('scaffolder.defaultCommitMessage'); + + await initRepoAndPush({ + dir: getRepoSourceDirectory(workspacePath, sourcePath), + remoteUrl, + defaultBranch, + auth: { + username: 'x-access-token', + password, + }, + logger, + commitMessage, + gitAuthorInfo, + }); + + if (protectDefaultBranch) { + try { + await enableBranchProtectionOnDefaultRepoBranch({ + owner, + client, + repoName: repo, + logger, + defaultBranch, + requireCodeOwnerReviews, + requiredStatusCheckContexts, + }); + } catch (e) { + assertError(e); + logger.warn( + `Skipping: default branch protection on '${repo}', ${e.message}`, + ); + } + } +} + +function extractCollaboratorName( + collaborator: { user: string } | { team: string } | { username: string }, +) { + if ('username' in collaborator) return collaborator.username; + if ('user' in collaborator) return collaborator.user; + return collaborator.team; +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts index 529a504cba..8753d44041 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { SpawnOptionsWithoutStdio, spawn } from 'child_process'; +import { Git } from '@backstage/backend-common'; +import { Config } from '@backstage/config'; +import { assertError } from '@backstage/errors'; +import { spawn, SpawnOptionsWithoutStdio } from 'child_process'; +import { Octokit } from 'octokit'; import { PassThrough, Writable } from 'stream'; import { Logger } from 'winston'; -import { Git } from '@backstage/backend-common'; -import { Octokit } from 'octokit'; -import { assertError } from '@backstage/errors'; /** @public */ export type RunCommandOptions = { @@ -200,3 +201,12 @@ export const enableBranchProtectionOnDefaultRepoBranch = async ({ await tryOnce(); } }; + +export function getGitCommitMessage( + gitCommitMessage: string | undefined, + config: Config, +): string | undefined { + return gitCommitMessage + ? gitCommitMessage + : config.getOptionalString('scaffolder.defaultCommitMessage'); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts index 145827702d..87219ac1e6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts @@ -14,22 +14,21 @@ * limitations under the License. */ import { Config } from '@backstage/config'; -import { assertError, InputError } from '@backstage/errors'; +import { InputError } from '@backstage/errors'; import { GithubCredentialsProvider, ScmIntegrationRegistry, } from '@backstage/integration'; import { Octokit } from 'octokit'; import { createTemplateAction } from '../../createTemplateAction'; -import { getOctokitOptions } from '../github/helpers'; +import { + createGithubRepoWithCollaboratorsAndTopics, + getOctokitOptions, + initRepoPushAndProtect, +} from '../github/helpers'; import * as inputProps from '../github/inputProperties'; import * as outputProps from '../github/outputProperties'; -import { - enableBranchProtectionOnDefaultRepoBranch, - initRepoAndPush, -} from '../helpers'; -import { getRepoSourceDirectory, parseRepoUrl } from './util'; - +import { parseRepoUrl } from './util'; /** * Creates a new action that initializes a git repository of the content in the workspace * and publishes it to GitHub. @@ -137,192 +136,103 @@ export function createPublishGithubAction(options: { token: providedToken, } = ctx.input; + const octokitOptions = await getOctokitOptions({ + integrations, + credentialsProvider: githubCredentialsProvider, + token: providedToken, + repoUrl: repoUrl, + }); + const client = new Octokit(octokitOptions); + const { owner, repo } = parseRepoUrl(repoUrl, integrations); if (!owner) { throw new InputError('Invalid repository owner provided in repoUrl'); } - const octokitOptions = await getOctokitOptions({ - integrations, - credentialsProvider: githubCredentialsProvider, - token: providedToken, - repoUrl, - }); - - const client = new Octokit(octokitOptions); - - const user = await client.rest.users.getByUsername({ - username: owner, - }); - - const repoCreationPromise = - user.data.type === 'Organization' - ? client.rest.repos.createInOrg({ - name: repo, - org: owner, - private: repoVisibility === 'private', - visibility: repoVisibility, - description: description, - delete_branch_on_merge: deleteBranchOnMerge, - allow_merge_commit: allowMergeCommit, - allow_squash_merge: allowSquashMerge, - allow_rebase_merge: allowRebaseMerge, - }) - : client.rest.repos.createForAuthenticatedUser({ - name: repo, - private: repoVisibility === 'private', - description: description, - delete_branch_on_merge: deleteBranchOnMerge, - allow_merge_commit: allowMergeCommit, - allow_squash_merge: allowSquashMerge, - allow_rebase_merge: allowRebaseMerge, - }); - - let newRepo; - - try { - newRepo = (await repoCreationPromise).data; - } catch (e) { - assertError(e); - if (e.message === 'Resource not accessible by integration') { - ctx.logger.warn( - `The GitHub app or token provided may not have the required permissions to create the ${user.data.type} repository ${owner}/${repo}.`, - ); - } - throw new Error( - `Failed to create the ${user.data.type} repository ${owner}/${repo}, ${e.message}`, - ); - } - - if (access?.startsWith(`${owner}/`)) { - const [, team] = access.split('/'); - await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ - org: owner, - team_slug: team, - owner, - repo, - permission: 'admin', - }); - // No need to add access if it's the person who owns the personal account - } else if (access && access !== owner) { - await client.rest.repos.addCollaborator({ - owner, - repo, - username: access, - permission: 'admin', - }); - } - - if (collaborators) { - for (const collaborator of collaborators) { - try { - if ('user' in collaborator) { - await client.rest.repos.addCollaborator({ - owner, - repo, - username: collaborator.user, - permission: collaborator.access, - }); - } else if ('username' in collaborator) { - ctx.logger.warn( - 'The field `username` is deprecated in favor of `team` and will be removed in the future.', - ); - await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ - org: owner, - team_slug: collaborator.username, - owner, - repo, - permission: collaborator.access, - }); - } else if ('team' in collaborator) { - await client.rest.teams.addOrUpdateRepoPermissionsInOrg({ - org: owner, - team_slug: collaborator.team, - owner, - repo, - permission: collaborator.access, - }); - } - } catch (e) { - assertError(e); - const name = extractCollaboratorName(collaborator); - ctx.logger.warn( - `Skipping ${collaborator.access} access for ${name}, ${e.message}`, - ); - } - } - } - - if (topics) { - try { - await client.rest.repos.replaceAllTopics({ - owner, - repo, - names: topics.map(t => t.toLowerCase()), - }); - } catch (e) { - assertError(e); - ctx.logger.warn(`Skipping topics ${topics.join(' ')}, ${e.message}`); - } - } + const newRepo = await createGithubRepoWithCollaboratorsAndTopics( + client, + repo, + owner, + repoVisibility, + description, + deleteBranchOnMerge, + allowMergeCommit, + allowSquashMerge, + allowRebaseMerge, + access, + collaborators, + topics, + ctx.logger, + ); const remoteUrl = newRepo.clone_url; const repoContentsUrl = `${newRepo.html_url}/blob/${defaultBranch}`; - const gitAuthorInfo = { - name: gitAuthorName - ? gitAuthorName - : config.getOptionalString('scaffolder.defaultAuthor.name'), - email: gitAuthorEmail - ? gitAuthorEmail - : config.getOptionalString('scaffolder.defaultAuthor.email'), - }; + // const gitAuthorInfo = { + // name: gitAuthorName + // ? gitAuthorName + // : config.getOptionalString('scaffolder.defaultAuthor.name'), + // email: gitAuthorEmail + // ? gitAuthorEmail + // : config.getOptionalString('scaffolder.defaultAuthor.email'), + // }; - await initRepoAndPush({ - dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath), + // await initRepoAndPush({ + // dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath), + // remoteUrl, + // defaultBranch, + // auth: { + // username: 'x-access-token', + // password: octokitOptions.auth, + // }, + // logger: ctx.logger, + // commitMessage: gitCommitMessage + // ? gitCommitMessage + // : config.getOptionalString('scaffolder.defaultCommitMessage'), + // gitAuthorInfo, + // }); + + // if (protectDefaultBranch) { + // try { + // await enableBranchProtectionOnDefaultRepoBranch({ + // owner, + // client, + // repoName: newRepo.name, + // logger: ctx.logger, + // defaultBranch, + // requireCodeOwnerReviews, + // requiredStatusCheckContexts, + // }); + // } catch (e) { + // assertError(e); + // ctx.logger.warn( + // `Skipping: default branch protection on '${newRepo.name}', ${e.message}`, + // ); + // } + // } + + await initRepoPushAndProtect( remoteUrl, + octokitOptions.auth, + ctx.workspacePath, + ctx.input.sourcePath, defaultBranch, - auth: { - username: 'x-access-token', - password: octokitOptions.auth, - }, - logger: ctx.logger, - commitMessage: gitCommitMessage - ? gitCommitMessage - : config.getOptionalString('scaffolder.defaultCommitMessage'), - gitAuthorInfo, - }); - - if (protectDefaultBranch) { - try { - await enableBranchProtectionOnDefaultRepoBranch({ - owner, - client, - repoName: newRepo.name, - logger: ctx.logger, - defaultBranch, - requireCodeOwnerReviews, - requiredStatusCheckContexts, - }); - } catch (e) { - assertError(e); - ctx.logger.warn( - `Skipping: default branch protection on '${newRepo.name}', ${e.message}`, - ); - } - } + protectDefaultBranch, + owner, + client, + repo, + requireCodeOwnerReviews, + requiredStatusCheckContexts, + config, + ctx.logger, + gitCommitMessage, + gitAuthorName, + gitAuthorEmail, + ); ctx.output('remoteUrl', remoteUrl); ctx.output('repoContentsUrl', repoContentsUrl); }, }); } - -function extractCollaboratorName( - collaborator: { user: string } | { team: string } | { username: string }, -) { - if ('username' in collaborator) return collaborator.username; - if ('user' in collaborator) return collaborator.user; - return collaborator.team; -} From 4345479092e7609c32787f30d6c6530ed30c0e1b Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Wed, 22 Jun 2022 13:43:44 +0100 Subject: [PATCH 271/590] chore: fix tests Signed-off-by: Marco Crivellaro --- .../actions/builtin/publish/github.test.ts | 28 ++++++------ .../actions/builtin/publish/github.ts | 43 ------------------- 2 files changed, 14 insertions(+), 57 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts index ff20d1014b..036c5d66ee 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.test.ts @@ -18,20 +18,20 @@ import { TemplateAction } from '../../types'; jest.mock('../helpers'); -import { createPublishGithubAction } from './github'; +import { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; import { - ScmIntegrations, DefaultGithubCredentialsProvider, GithubCredentialsProvider, + ScmIntegrations, } from '@backstage/integration'; -import { ConfigReader } from '@backstage/config'; -import { getVoidLogger } from '@backstage/backend-common'; +import { when } from 'jest-when'; import { PassThrough } from 'stream'; import { enableBranchProtectionOnDefaultRepoBranch, initRepoAndPush, } from '../helpers'; -import { when } from 'jest-when'; +import { createPublishGithubAction } from './github'; const mockOctokit = { rest: { @@ -609,7 +609,7 @@ describe('publish:github', () => { mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ data: { - name: 'repository', + name: 'repo', }, }); @@ -618,7 +618,7 @@ describe('publish:github', () => { expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ owner: 'owner', client: mockOctokit, - repoName: 'repository', + repoName: 'repo', logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, @@ -636,7 +636,7 @@ describe('publish:github', () => { expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ owner: 'owner', client: mockOctokit, - repoName: 'repository', + repoName: 'repo', logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: true, @@ -654,7 +654,7 @@ describe('publish:github', () => { expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ owner: 'owner', client: mockOctokit, - repoName: 'repository', + repoName: 'repo', logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, @@ -669,7 +669,7 @@ describe('publish:github', () => { mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ data: { - name: 'repository', + name: 'repo', }, }); @@ -678,7 +678,7 @@ describe('publish:github', () => { expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ owner: 'owner', client: mockOctokit, - repoName: 'repository', + repoName: 'repo', logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, @@ -696,7 +696,7 @@ describe('publish:github', () => { expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ owner: 'owner', client: mockOctokit, - repoName: 'repository', + repoName: 'repo', logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, @@ -714,7 +714,7 @@ describe('publish:github', () => { expect(enableBranchProtectionOnDefaultRepoBranch).toHaveBeenCalledWith({ owner: 'owner', client: mockOctokit, - repoName: 'repository', + repoName: 'repo', logger: mockContext.logger, defaultBranch: 'master', requireCodeOwnerReviews: false, @@ -729,7 +729,7 @@ describe('publish:github', () => { mockOctokit.rest.repos.createForAuthenticatedUser.mockResolvedValue({ data: { - name: 'repository', + name: 'repo', }, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts index 87219ac1e6..0815a2cd00 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/github.ts @@ -169,49 +169,6 @@ export function createPublishGithubAction(options: { const remoteUrl = newRepo.clone_url; const repoContentsUrl = `${newRepo.html_url}/blob/${defaultBranch}`; - // const gitAuthorInfo = { - // name: gitAuthorName - // ? gitAuthorName - // : config.getOptionalString('scaffolder.defaultAuthor.name'), - // email: gitAuthorEmail - // ? gitAuthorEmail - // : config.getOptionalString('scaffolder.defaultAuthor.email'), - // }; - - // await initRepoAndPush({ - // dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath), - // remoteUrl, - // defaultBranch, - // auth: { - // username: 'x-access-token', - // password: octokitOptions.auth, - // }, - // logger: ctx.logger, - // commitMessage: gitCommitMessage - // ? gitCommitMessage - // : config.getOptionalString('scaffolder.defaultCommitMessage'), - // gitAuthorInfo, - // }); - - // if (protectDefaultBranch) { - // try { - // await enableBranchProtectionOnDefaultRepoBranch({ - // owner, - // client, - // repoName: newRepo.name, - // logger: ctx.logger, - // defaultBranch, - // requireCodeOwnerReviews, - // requiredStatusCheckContexts, - // }); - // } catch (e) { - // assertError(e); - // ctx.logger.warn( - // `Skipping: default branch protection on '${newRepo.name}', ${e.message}`, - // ); - // } - // } - await initRepoPushAndProtect( remoteUrl, octokitOptions.auth, From f74361a5850c3d20923553221172ad947dc68352 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Wed, 22 Jun 2022 17:29:58 +0400 Subject: [PATCH 272/590] removed dagsNotFound state Signed-off-by: Daniele.Mazzotta --- .../DagTableComponent/DagTableComponent.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx index ff7b961c48..46127e0b5e 100644 --- a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx +++ b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx @@ -31,7 +31,7 @@ import Tooltip from '@material-ui/core/Tooltip'; import Typography from '@material-ui/core/Typography'; import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; import Alert from '@material-ui/lab/Alert'; -import React, { useState } from 'react'; +import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { apacheAirflowApiRef } from '../../api'; import { Dag } from '../../api/types'; @@ -136,15 +136,10 @@ type DagTableComponentProps = { export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { const apiClient = useApi(apacheAirflowApiRef); - const [dagsNotFound, setDagsNotFound] = useState(); const { value, loading, error } = useAsync(async (): Promise => { if (dagIds) { - // eslint-disable-next-line @typescript-eslint/no-shadow - const { dags, dagsNotFound } = await apiClient.getDags(dagIds); - if (dagsNotFound.length) { - setDagsNotFound(dagsNotFound); - } + const { dags } = await apiClient.getDags(dagIds); return dags; } return await apiClient.listDags(); @@ -161,13 +156,16 @@ export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { id: el.dag_id, // table records require `id` attribute dagUrl: `${apiClient.baseUrl}dag_details?dag_id=${el.dag_id}`, // construct path to DAG using `baseUrl` })); - + const dagsNotFound = + dagIds && value + ? dagIds.filter(id => !value.find(d => d.dag_id === id)) + : []; return ( <> - {dagsNotFound && ( + {dagsNotFound.length && ( {dagsNotFound.map(dagId => ( - {dagId} + {dagId} ))} )} From b15904a3675ff1726a504a76e6f585eb0fe9becf Mon Sep 17 00:00:00 2001 From: Marco Crivellaro Date: Wed, 22 Jun 2022 14:44:03 +0100 Subject: [PATCH 273/590] chore: api-report update Signed-off-by: Marco Crivellaro --- plugins/scaffolder-backend/api-report.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 029000399b..a4693125d9 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -195,6 +195,10 @@ export function createGithubRepoCreateAction(options: { team: string; access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; } + | { + username: string; + access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + } )[] | undefined; token?: string | undefined; From fbfbff6bf7ce0bf169c7a03e2f9b8d8bedcc40b3 Mon Sep 17 00:00:00 2001 From: Tomasz Szuba Date: Wed, 22 Jun 2022 16:25:49 +0200 Subject: [PATCH 274/590] Add possibility to resolve relations by RDN, in addition to UUID and DN in LDAP plugin This is required to support memberUid attribute https://ldapwiki.com/wiki/MemberUid Signed-off-by: Tomasz Szuba --- .changeset/twelve-candles-jump.md | 5 + .../src/ldap/read.test.ts | 302 +++++++----------- .../src/ldap/read.ts | 2 + 3 files changed, 119 insertions(+), 190 deletions(-) create mode 100644 .changeset/twelve-candles-jump.md diff --git a/.changeset/twelve-candles-jump.md b/.changeset/twelve-candles-jump.md new file mode 100644 index 0000000000..9d0cccd0ba --- /dev/null +++ b/.changeset/twelve-candles-jump.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-ldap': patch +--- + +Add possibility to resolve relations by RDN, in addition to UUID and DN diff --git a/plugins/catalog-backend-module-ldap/src/ldap/read.test.ts b/plugins/catalog-backend-module-ldap/src/ldap/read.test.ts index 410ac847b3..49803b9c39 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/read.test.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/read.test.ts @@ -345,206 +345,128 @@ describe('readLdapGroups', () => { describe('resolveRelations', () => { describe('lookup', () => { - it('matches by DN', () => { - const parent = group({ - metadata: { - name: 'parent', - annotations: { [LDAP_DN_ANNOTATION]: 'pa' }, - }, - }); - const child = group({ - metadata: { - name: 'child', - annotations: { [LDAP_DN_ANNOTATION]: 'ca' }, - }, - }); - const groupMember = new Map>([ - ['pa', new Set(['ca'])], - ]); - resolveRelations([parent, child], [], new Map(), new Map(), groupMember); - expect(parent.spec.children).toEqual(['group:default/child']); - expect(child.spec.parent).toEqual('group:default/parent'); - }); - - it('matches by UUID', () => { - const parent = group({ - metadata: { - name: 'parent', - annotations: { [LDAP_UUID_ANNOTATION]: 'pa' }, - }, - }); - const child = group({ - metadata: { - name: 'child', - annotations: { [LDAP_UUID_ANNOTATION]: 'ca' }, - }, - }); - const groupMember = new Map>([ - ['pa', new Set(['ca'])], - ]); - resolveRelations([parent, child], [], new Map(), new Map(), groupMember); - expect(parent.spec.children).toEqual(['group:default/child']); - expect(child.spec.parent).toEqual('group:default/parent'); - }); + it.each([LDAP_DN_ANNOTATION, LDAP_RDN_ANNOTATION, LDAP_UUID_ANNOTATION])( + 'matches by %s', + annotation => { + const parent = group({ + metadata: { + name: 'parent', + annotations: { [annotation]: 'pa' }, + }, + }); + const child = group({ + metadata: { + name: 'child', + annotations: { [annotation]: 'ca' }, + }, + }); + const groupMember = new Map>([ + ['pa', new Set(['ca'])], + ]); + resolveRelations( + [parent, child], + [], + new Map(), + new Map(), + groupMember, + ); + expect(parent.spec.children).toEqual(['group:default/child']); + expect(child.spec.parent).toEqual('group:default/parent'); + }, + ); }); describe('userMemberOf', () => { - it('populates relations by dn', () => { - const host = group({ - metadata: { name: 'host', annotations: { [LDAP_DN_ANNOTATION]: 'ha' } }, - }); - const member = user({ - metadata: { - name: 'member', - annotations: { [LDAP_DN_ANNOTATION]: 'ma' }, - }, - }); - const userMemberOf = new Map>([ - ['ma', new Set(['ha'])], - ]); - resolveRelations([host], [member], userMemberOf, new Map(), new Map()); - expect(member.spec.memberOf).toEqual(['group:default/host']); - }); - - it('populates relations by uuid', () => { - const host = group({ - metadata: { - name: 'host', - annotations: { [LDAP_UUID_ANNOTATION]: 'ha' }, - }, - }); - const member = user({ - metadata: { - name: 'member', - annotations: { [LDAP_DN_ANNOTATION]: 'ma' }, - }, - }); - const userMemberOf = new Map>([ - ['ma', new Set(['ha'])], - ]); - resolveRelations([host], [member], userMemberOf, new Map(), new Map()); - expect(member.spec.memberOf).toEqual(['group:default/host']); - }); + it.each([LDAP_DN_ANNOTATION, LDAP_RDN_ANNOTATION, LDAP_UUID_ANNOTATION])( + 'populates relations by %s', + annotation => { + const host = group({ + metadata: { name: 'host', annotations: { [annotation]: 'ha' } }, + }); + const member = user({ + metadata: { + name: 'member', + annotations: { [annotation]: 'ma' }, + }, + }); + const userMemberOf = new Map>([ + ['ma', new Set(['ha'])], + ]); + resolveRelations([host], [member], userMemberOf, new Map(), new Map()); + expect(member.spec.memberOf).toEqual(['group:default/host']); + }, + ); }); describe('groupMemberOf', () => { - it('populates relations by dn', () => { - const parent = group({ - metadata: { - name: 'parent', - annotations: { [LDAP_DN_ANNOTATION]: 'pa' }, - }, - }); - const child = group({ - metadata: { - name: 'child', - annotations: { [LDAP_DN_ANNOTATION]: 'ca' }, - }, - }); - const groupMemberOf = new Map>([ - ['ca', new Set(['pa'])], - ]); - resolveRelations( - [parent, child], - [], - new Map(), - groupMemberOf, - new Map(), - ); - expect(parent.spec.children).toEqual(['group:default/child']); - expect(child.spec.parent).toEqual('group:default/parent'); - }); - }); - - it('populates relations by uuid', () => { - const parent = group({ - metadata: { - name: 'parent', - annotations: { [LDAP_UUID_ANNOTATION]: 'pa' }, + it.each([LDAP_DN_ANNOTATION, LDAP_RDN_ANNOTATION, LDAP_UUID_ANNOTATION])( + 'populates relations by %s', + annotation => { + const parent = group({ + metadata: { + name: 'parent', + annotations: { [annotation]: 'pa' }, + }, + }); + const child = group({ + metadata: { + name: 'child', + annotations: { [annotation]: 'ca' }, + }, + }); + const groupMemberOf = new Map>([ + ['ca', new Set(['pa'])], + ]); + resolveRelations( + [parent, child], + [], + new Map(), + groupMemberOf, + new Map(), + ); + expect(parent.spec.children).toEqual(['group:default/child']); + expect(child.spec.parent).toEqual('group:default/parent'); }, - }); - const child = group({ - metadata: { - name: 'child', - annotations: { [LDAP_UUID_ANNOTATION]: 'ca' }, - }, - }); - const groupMemberOf = new Map>([ - ['ca', new Set(['pa'])], - ]); - resolveRelations([parent, child], [], new Map(), groupMemberOf, new Map()); - expect(parent.spec.children).toEqual(['group:default/child']); - expect(child.spec.parent).toEqual('group:default/parent'); + ); }); describe('groupMember', () => { - it('populates relations by dn', () => { - const parent = group({ - metadata: { - name: 'parent', - annotations: { [LDAP_DN_ANNOTATION]: 'pa' }, - }, - }); - const child = group({ - metadata: { - name: 'child', - annotations: { [LDAP_DN_ANNOTATION]: 'ca' }, - }, - }); - const member = user({ - metadata: { - name: 'member', - annotations: { [LDAP_DN_ANNOTATION]: 'ma' }, - }, - }); - const groupMember = new Map>([ - ['pa', new Set(['ca', 'ma'])], - ]); - resolveRelations( - [parent, child], - [member], - new Map(), - new Map(), - groupMember, - ); - expect(parent.spec.children).toEqual(['group:default/child']); - expect(child.spec.parent).toEqual('group:default/parent'); - expect(member.spec.memberOf).toEqual(['group:default/parent']); - }); - - it('populates relations by uuid', () => { - const parent = group({ - metadata: { - name: 'parent', - annotations: { [LDAP_UUID_ANNOTATION]: 'pa' }, - }, - }); - const child = group({ - metadata: { - name: 'child', - annotations: { [LDAP_UUID_ANNOTATION]: 'ca' }, - }, - }); - const member = user({ - metadata: { - name: 'member', - annotations: { [LDAP_UUID_ANNOTATION]: 'ma' }, - }, - }); - const groupMember = new Map>([ - ['pa', new Set(['ca', 'ma'])], - ]); - resolveRelations( - [parent, child], - [member], - new Map(), - new Map(), - groupMember, - ); - expect(parent.spec.children).toEqual(['group:default/child']); - expect(child.spec.parent).toEqual('group:default/parent'); - expect(member.spec.memberOf).toEqual(['group:default/parent']); - }); + it.each([LDAP_DN_ANNOTATION, LDAP_RDN_ANNOTATION, LDAP_UUID_ANNOTATION])( + 'populates relations by %s', + annotation => { + const parent = group({ + metadata: { + name: 'parent', + annotations: { [annotation]: 'pa' }, + }, + }); + const child = group({ + metadata: { + name: 'child', + annotations: { [annotation]: 'ca' }, + }, + }); + const member = user({ + metadata: { + name: 'member', + annotations: { [annotation]: 'ma' }, + }, + }); + const groupMember = new Map>([ + ['pa', new Set(['ca', 'ma'])], + ]); + resolveRelations( + [parent, child], + [member], + new Map(), + new Map(), + groupMember, + ); + expect(parent.spec.children).toEqual(['group:default/child']); + expect(child.spec.parent).toEqual('group:default/parent'); + expect(member.spec.memberOf).toEqual(['group:default/parent']); + }, + ); }); }); diff --git a/plugins/catalog-backend-module-ldap/src/ldap/read.ts b/plugins/catalog-backend-module-ldap/src/ldap/read.ts index d0fe30e0e6..420ba141fc 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/read.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/read.ts @@ -365,11 +365,13 @@ export function resolveRelations( for (const user of users) { userMap.set(stringifyEntityRef(user), user); userMap.set(user.metadata.annotations![LDAP_DN_ANNOTATION], user); + userMap.set(user.metadata.annotations![LDAP_RDN_ANNOTATION], user); userMap.set(user.metadata.annotations![LDAP_UUID_ANNOTATION], user); } for (const group of groups) { groupMap.set(stringifyEntityRef(group), group); groupMap.set(group.metadata.annotations![LDAP_DN_ANNOTATION], group); + groupMap.set(group.metadata.annotations![LDAP_RDN_ANNOTATION], group); groupMap.set(group.metadata.annotations![LDAP_UUID_ANNOTATION], group); } From 166d3a6932aeee3a7b0412349c1bec1a7571c430 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 14:39:32 +0000 Subject: [PATCH 275/590] fix(deps): update dependency @maxim_mazurok/gapi.client.calendar to v3.0.20220617 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 82f4239fee..6b447fa257 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4286,9 +4286,9 @@ react-is "^16.8.0 || ^17.0.0" "@maxim_mazurok/gapi.client.calendar@^3.0.20220408": - version "3.0.20220610" - resolved "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar/-/gapi.client.calendar-3.0.20220610.tgz#46e0092da54fc8eb1342a3d1af04a071a761faac" - integrity sha512-pZwIaTw+PizFSXrF5WqP4dj+b1Vlj/hNwBY4ocWpJ2uhBDoBPAVIc8lEUNwNZVDbAgtbWHD2Kl84UsP1wmBS+w== + version "3.0.20220617" + resolved "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar/-/gapi.client.calendar-3.0.20220617.tgz#140bbfd2caa1770fedbdaec4182eb43684f2d876" + integrity sha512-Vek5Y655GUi4RmUs3cNLfo/KQeReEuvcViJ0KYHl28KmC2Pqmxb4V2YIUhsH7BGVyq84cTIT59qHSirB919Prw== dependencies: "@types/gapi.client" "*" From 119f075cd8bbedae665fb9d8bfe224c4d7974f0f Mon Sep 17 00:00:00 2001 From: planeiii Date: Wed, 22 Jun 2022 10:12:28 -0500 Subject: [PATCH 276/590] chore: added Promise.any polyfill for Node v14 Signed-off-by: planeiii --- .../jenkins-backend/src/service/jenkinsApi.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/plugins/jenkins-backend/src/service/jenkinsApi.ts b/plugins/jenkins-backend/src/service/jenkinsApi.ts index 334be5dfa9..8de2609037 100644 --- a/plugins/jenkins-backend/src/service/jenkinsApi.ts +++ b/plugins/jenkins-backend/src/service/jenkinsApi.ts @@ -30,6 +30,23 @@ import { import { jenkinsExecutePermission } from '@backstage/plugin-jenkins-common'; import { NotAllowedError } from '@backstage/errors'; +// polyfill Promise.any for Node v14 +const anyPromise = (any => { + if (any) { + // bind is required by tsc + return any.bind(Promise); + } + + // reverse promise resolution (rejects become resolves and visa versa) + const reverse = (promise: Promise) => + new Promise((resolve, reject) => + Promise.resolve(promise).then(reject, resolve), + ); + + return (iterable: Promise[]) => + reverse(Promise.all([...iterable].map(reverse))); +})(Promise.any); + export class JenkinsApiImpl { private static readonly lastBuildTreeSpec = `lastBuild[ number, @@ -77,7 +94,7 @@ export class JenkinsApiImpl { if (branches) { // Assume jenkinsInfo.jobFullName is a folder which contains one job per branch. // TODO: extract a strategy interface for this - const job = await Promise.any( + const job = await anyPromise( branches.map(branch => client.job.get({ name: `${jenkinsInfo.jobFullName}/${branch}`, From 86640214f03e7ec48ab124a35f6d25ab3b6ee7cb Mon Sep 17 00:00:00 2001 From: Julio Zynger Date: Wed, 22 Jun 2022 15:35:46 +0200 Subject: [PATCH 277/590] Upgrade @rollup/plugin-node-resolve to 13.0.6 Signed-off-by: Julio Zynger --- .changeset/metal-singers-matter.md | 5 +++++ packages/cli/package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/metal-singers-matter.md diff --git a/.changeset/metal-singers-matter.md b/.changeset/metal-singers-matter.md new file mode 100644 index 0000000000..2c8d370790 --- /dev/null +++ b/.changeset/metal-singers-matter.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Upgrade `@rollup/plugin-node-resolve` to `^13.0.6` diff --git a/packages/cli/package.json b/packages/cli/package.json index 2cf6f4fe7b..42e8953d1e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -43,7 +43,7 @@ "@octokit/request": "^5.4.12", "@rollup/plugin-commonjs": "^22.0.0", "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.0.0", + "@rollup/plugin-node-resolve": "^13.0.6", "@rollup/plugin-yaml": "^3.1.0", "@spotify/eslint-config-base": "^13.0.0", "@spotify/eslint-config-react": "^13.0.0", From afb57872914b293758b545715739a8a86f58a33a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 15:47:22 +0000 Subject: [PATCH 278/590] fix(deps): update dependency keyv to v4.3.2 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6b447fa257..94120932df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16865,9 +16865,9 @@ keyv@^3.0.0: json-buffer "3.0.0" keyv@^4.0.0, keyv@^4.0.3: - version "4.3.1" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.3.1.tgz#7970672f137d987945821b1a07b524ce5a4edd27" - integrity sha512-nwP7AQOxFzELXsNq3zCx/oh81zu4DHWwCE6W9RaeHb7OHO0JpmKS8n801ovVQC7PTsZDWtPA5j1QY+/WWtARYg== + version "4.3.2" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz#e839df676a0c7ee594c8835e7c1c83742558e5c2" + integrity sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw== dependencies: compress-brotli "^1.3.8" json-buffer "3.0.1" From 606424388245ac0bec4bf7fbbf69b6662328381d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Frinnstr=C3=B6m?= Date: Wed, 22 Jun 2022 18:19:37 +0200 Subject: [PATCH 279/590] Add catalog-backend-module-openapi plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Frinnström --- .../.eslintrc.js | 1 + .../catalog-backend-module-openapi/README.md | 27 ++++ .../api-report.md | 36 ++++++ .../package.json | 53 ++++++++ .../src/OpenApiRefProcessor.test.ts | 101 +++++++++++++++ .../src/OpenApiRefProcessor.ts | 94 ++++++++++++++ .../src/index.ts | 16 +++ .../src/lib/bundle.test.ts | 117 ++++++++++++++++++ .../src/lib/bundle.ts | 69 +++++++++++ .../src/lib/index.ts | 16 +++ .../src/setupTests.ts | 17 +++ yarn.lock | 37 +++++- 12 files changed, 582 insertions(+), 2 deletions(-) create mode 100644 plugins/catalog-backend-module-openapi/.eslintrc.js create mode 100644 plugins/catalog-backend-module-openapi/README.md create mode 100644 plugins/catalog-backend-module-openapi/api-report.md create mode 100644 plugins/catalog-backend-module-openapi/package.json create mode 100644 plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts create mode 100644 plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts create mode 100644 plugins/catalog-backend-module-openapi/src/index.ts create mode 100644 plugins/catalog-backend-module-openapi/src/lib/bundle.test.ts create mode 100644 plugins/catalog-backend-module-openapi/src/lib/bundle.ts create mode 100644 plugins/catalog-backend-module-openapi/src/lib/index.ts create mode 100644 plugins/catalog-backend-module-openapi/src/setupTests.ts diff --git a/plugins/catalog-backend-module-openapi/.eslintrc.js b/plugins/catalog-backend-module-openapi/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/catalog-backend-module-openapi/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-backend-module-openapi/README.md b/plugins/catalog-backend-module-openapi/README.md new file mode 100644 index 0000000000..1a133521c6 --- /dev/null +++ b/plugins/catalog-backend-module-openapi/README.md @@ -0,0 +1,27 @@ +# Catalog Backend Module for OpenAPI specifications + +This is an extension module to the plugin-catalog-backend plugin, providing extensions targeted at OpenAPI specifications. + +With this you can split your OpenAPI definition into multiple files and reference them. They will be bundled, using an UrlReader, during processing and stored as a single specification. + +## Installation + +### Install the package + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-openapi +``` + +### Adding the plugin to your `packages/backend` + +The processor can be added by importing `OpenApiRefProcessor` in `src/plugins/catalog.ts` in your `backend` package and adding the following. + +```ts +builder.addProcessor( + OpenApiRefProcessor.fromConfig(env.config, { + logger: env.logger, + reader: env.reader, + }), +); +``` diff --git a/plugins/catalog-backend-module-openapi/api-report.md b/plugins/catalog-backend-module-openapi/api-report.md new file mode 100644 index 0000000000..92ddd1e3cd --- /dev/null +++ b/plugins/catalog-backend-module-openapi/api-report.md @@ -0,0 +1,36 @@ +## API Report File for "@backstage/plugin-catalog-backend-module-openapi" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; +import { Config } from '@backstage/config'; +import { Entity } from '@backstage/catalog-model'; +import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { Logger } from 'winston'; +import { ScmIntegrations } from '@backstage/integration'; +import { UrlReader } from '@backstage/backend-common'; + +// @public (undocumented) +export class OpenApiRefProcessor implements CatalogProcessor { + constructor(options: { + integrations: ScmIntegrations; + logger: Logger; + reader: UrlReader; + }); + // (undocumented) + static fromConfig( + config: Config, + options: { + logger: Logger; + reader: UrlReader; + }, + ): OpenApiRefProcessor; + // (undocumented) + getProcessorName(): string; + // (undocumented) + preProcessEntity(entity: Entity, location: LocationSpec): Promise; +} + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json new file mode 100644 index 0000000000..228147809e --- /dev/null +++ b/plugins/catalog-backend-module-openapi/package.json @@ -0,0 +1,53 @@ +{ + "name": "@backstage/plugin-catalog-backend-module-openapi", + "description": "A Backstage catalog backend module that helps with OpenAPI specifications", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": false, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin-module" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/catalog-backend-module-openapi" + }, + "keywords": [ + "backstage" + ], + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean", + "start": "backstage-cli package start" + }, + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "@backstage/backend-common": "^0.14.1-next.0", + "@backstage/catalog-model": "^1.1.0-next.0", + "@backstage/config": "^1.0.1", + "@backstage/integration": "^1.2.2-next.0", + "@backstage/plugin-catalog-backend": "^1.2.1-next.0", + "winston": "^3.2.1", + "yaml": "^2.1.1" + }, + "devDependencies": { + "@backstage/backend-test-utils": "^0.1.26-next.0", + "@backstage/cli": "^0.17.3-next.0", + "openapi-types": "^11.0.1" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts new file mode 100644 index 0000000000..8f2cc571c2 --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.test.ts @@ -0,0 +1,101 @@ +/* + * 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 { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { OpenApiRefProcessor } from './OpenApiRefProcessor'; +import { bundleOpenApiSpecification } from './lib'; + +jest.mock('./lib', () => ({ + bundleOpenApiSpecification: jest.fn(), +})); + +const bundledSpecification = ''; + +describe('OpenApiRefProcessor', () => { + const mockLocation = (): LocationSpec => ({ + type: 'url', + target: `https://github.com/owner/repo/blob/main/catalog-info.yaml`, + }); + + beforeEach(() => { + (bundleOpenApiSpecification as any).mockResolvedValue(bundledSpecification); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('preProcessEntity', () => { + const setupTest = ({ kind = 'API', spec = {} } = {}) => { + const entity = { + kind, + spec: { definition: '', ...spec }, + }; + const config = new ConfigReader({}); + const reader = { + read: jest.fn(), + readTree: jest.fn(), + search: jest.fn(), + }; + const processor = OpenApiRefProcessor.fromConfig(config, { + logger: getVoidLogger(), + reader, + }); + + return { entity, processor }; + }; + + it('should bundle OpenAPI specifications', async () => { + const { entity, processor } = setupTest({ + kind: 'API', + spec: { type: 'openapi' }, + }); + + const result = await processor.preProcessEntity( + entity as any, + mockLocation(), + ); + + expect(result.spec?.definition).toEqual(bundledSpecification); + }); + + it('should ignore other kinds', async () => { + const { entity, processor } = setupTest({ kind: 'Group' }); + + const result = await processor.preProcessEntity( + entity as any, + mockLocation(), + ); + + expect(result).toEqual(entity); + }); + + it('should ignore other specification types', async () => { + const { entity, processor } = setupTest({ + kind: 'Group', + spec: { type: 'asyncapi' }, + }); + + const result = await processor.preProcessEntity( + entity as any, + mockLocation(), + ); + + expect(result).toEqual(entity); + }); + }); +}); diff --git a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts new file mode 100644 index 0000000000..01875e0779 --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts @@ -0,0 +1,94 @@ +/* + * 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 { UrlReader } from '@backstage/backend-common'; +import { Entity } from '@backstage/catalog-model'; +import { Config } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { + CatalogProcessor, + LocationSpec, +} from '@backstage/plugin-catalog-backend'; +import { bundleOpenApiSpecification } from './lib'; +import { Logger } from 'winston'; + +/** @public */ +export class OpenApiRefProcessor implements CatalogProcessor { + private readonly integrations: ScmIntegrations; + private readonly logger: Logger; + private readonly reader: UrlReader; + + static fromConfig( + config: Config, + options: { logger: Logger; reader: UrlReader }, + ) { + const integrations = ScmIntegrations.fromConfig(config); + + return new OpenApiRefProcessor({ + ...options, + integrations, + }); + } + + constructor(options: { + integrations: ScmIntegrations; + logger: Logger; + reader: UrlReader; + }) { + this.integrations = options.integrations; + this.logger = options.logger; + this.reader = options.reader; + } + + getProcessorName(): string { + return 'OpenApiRefProcessor'; + } + + async preProcessEntity( + entity: Entity, + location: LocationSpec, + ): Promise { + if ( + !entity || + entity.kind !== 'API' || + (entity.spec && entity.spec.type !== 'openapi') + ) { + return entity; + } + + const scmIntegration = this.integrations.byUrl(location.target); + if (!scmIntegration) { + return entity; + } + + this.logger.debug(`Bundling OpenAPI specification from ${location.target}`); + try { + const bundledSpec = await bundleOpenApiSpecification( + entity.spec!.definition?.toString(), + location.target, + this.reader, + scmIntegration, + ); + + return { + ...entity, + spec: { ...entity.spec, definition: bundledSpec }, + }; + } catch (error) { + this.logger.error(`Unable to bundle OpenAPI specification`, error); + return entity; + } + } +} diff --git a/plugins/catalog-backend-module-openapi/src/index.ts b/plugins/catalog-backend-module-openapi/src/index.ts new file mode 100644 index 0000000000..f98bee6bac --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/index.ts @@ -0,0 +1,16 @@ +/* + * 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 { OpenApiRefProcessor } from './OpenApiRefProcessor'; diff --git a/plugins/catalog-backend-module-openapi/src/lib/bundle.test.ts b/plugins/catalog-backend-module-openapi/src/lib/bundle.test.ts new file mode 100644 index 0000000000..4505f158b5 --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/lib/bundle.test.ts @@ -0,0 +1,117 @@ +/* + * 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 { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { bundleOpenApiSpecification } from './bundle'; + +const specification = ` +openapi: "3.0.0" +info: + version: 1.0.0 + title: Swagger Petstore + license: + name: MIT +servers: + - url: http://petstore.swagger.io/v1 +paths: + /pets: + get: + $ref: "./paths/pets/list.yaml" +`; + +const list = ` +--- +summary: List all pets +operationId: listPets +tags: + - pets +responses: + '200': + description: A paged array of pets + content: + application/json: + schema: + type: string +`; + +const expectedResult = ` +openapi: 3.0.0 +info: + version: 1.0.0 + title: Swagger Petstore + license: + name: MIT +servers: + - url: http://petstore.swagger.io/v1 +paths: + /pets: + get: + summary: List all pets + operationId: listPets + tags: + - pets + responses: + "200": + description: A paged array of pets + content: + application/json: + schema: + type: string +`; + +describe('bundleOpenApiSpecification', () => { + const readUrl = jest.fn(); + const reader = { + readUrl, + read: jest.fn(), + readTree: jest.fn(), + search: jest.fn(), + }; + + const scmIntegration = ScmIntegrations.fromConfig(new ConfigReader({})).byUrl( + 'https://github.com/owner/repo/blob/main/openapi.yaml', + ); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return undefined if no specification is supplied', async () => { + expect( + await bundleOpenApiSpecification( + undefined, + 'https://github.com/owner/repo/blob/main/openapi.yaml', + reader, + scmIntegration as any, + ), + ).toBeUndefined(); + }); + + it('should return the bundled specification', async () => { + readUrl.mockResolvedValue({ + buffer: jest.fn().mockResolvedValue(list), + }); + + const result = await bundleOpenApiSpecification( + specification, + 'https://github.com/owner/repo/blob/main/openapi.yaml', + reader, + scmIntegration as any, + ); + + expect(result).toEqual(expectedResult.trimStart()); + }); +}); diff --git a/plugins/catalog-backend-module-openapi/src/lib/bundle.ts b/plugins/catalog-backend-module-openapi/src/lib/bundle.ts new file mode 100644 index 0000000000..3d35429d8b --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/lib/bundle.ts @@ -0,0 +1,69 @@ +/* + * 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 { UrlReader } from '@backstage/backend-common'; +import { ScmIntegration } from '@backstage/integration'; +import SwaggerParser from '@apidevtools/swagger-parser'; +import { parse, stringify } from 'yaml'; +import * as path from 'path'; + +const protocolPattern = /^(\w{2,}):\/\//i; +const getProtocol = (refPath: string) => { + const match = protocolPattern.exec(refPath); + if (match) { + return match[1].toLowerCase(); + } + return undefined; +}; + +export async function bundleOpenApiSpecification( + specification: string | undefined, + targetUrl: string, + reader: UrlReader, + scmIntegration: ScmIntegration, +): Promise { + const fileUrlReaderResolver: SwaggerParser.ResolverOptions = { + canRead: file => { + const protocol = getProtocol(file.url); + return protocol === undefined || protocol === 'file'; + }, + read: async file => { + const relativePath = path.relative('.', file.url); + const url = scmIntegration.resolveUrl({ + base: targetUrl, + url: relativePath, + }); + if (reader.readUrl) { + const data = await reader.readUrl(url); + return data.buffer(); + } + throw new Error('UrlReader has no readUrl method defined'); + }, + }; + + if (!specification) { + return undefined; + } + + const options: SwaggerParser.Options = { + resolve: { + file: fileUrlReaderResolver, + http: true, + }, + }; + const specObject = parse(specification); + const bundledSpec = await SwaggerParser.bundle(specObject, options); + return stringify(bundledSpec); +} diff --git a/plugins/catalog-backend-module-openapi/src/lib/index.ts b/plugins/catalog-backend-module-openapi/src/lib/index.ts new file mode 100644 index 0000000000..805569181a --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/lib/index.ts @@ -0,0 +1,16 @@ +/* + * 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 * from './bundle'; diff --git a/plugins/catalog-backend-module-openapi/src/setupTests.ts b/plugins/catalog-backend-module-openapi/src/setupTests.ts new file mode 100644 index 0000000000..d3232290a7 --- /dev/null +++ b/plugins/catalog-backend-module-openapi/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * 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 {}; diff --git a/yarn.lock b/yarn.lock index 6b447fa257..8b6112a39a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,7 +16,7 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" -"@apidevtools/json-schema-ref-parser@^9.0.6": +"@apidevtools/json-schema-ref-parser@9.0.6", "@apidevtools/json-schema-ref-parser@^9.0.6": version "9.0.6" resolved "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c" integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg== @@ -25,6 +25,29 @@ call-me-maybe "^1.0.1" js-yaml "^3.13.1" +"@apidevtools/openapi-schemas@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" + integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== + +"@apidevtools/swagger-methods@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" + integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== + +"@apidevtools/swagger-parser@^10.1.0": + version "10.1.0" + resolved "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6" + integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw== + dependencies: + "@apidevtools/json-schema-ref-parser" "9.0.6" + "@apidevtools/openapi-schemas" "^2.1.0" + "@apidevtools/swagger-methods" "^3.0.2" + "@jsdevtools/ono" "^7.1.3" + ajv "^8.6.3" + ajv-draft-04 "^1.0.0" + call-me-maybe "^1.0.1" + "@apollo/protobufjs@1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" @@ -7613,6 +7636,11 @@ aggregate-error@^3.0.0, aggregate-error@^3.1.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv-draft-04@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -7642,7 +7670,7 @@ ajv@^6.10.0, ajv@^6.10.1, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.10.0, ajv@^8.8.0: +ajv@^8.0.0, ajv@^8.10.0, ajv@^8.6.3, ajv@^8.8.0: version "8.11.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -19627,6 +19655,11 @@ openapi-sampler@^1.2.1: "@types/json-schema" "^7.0.7" json-pointer "0.6.2" +openapi-types@^11.0.1: + version "11.1.0" + resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-11.1.0.tgz#037969f3dfa5999423ee33bf889fb0d12984277e" + integrity sha512-ZW+Jf12flFF6DXSij8DGL3svDA4RtSyHXjC/xB/JAh18gg3uVfVIFLvCfScUMowrpvlkxsMMbErakbth2g3/iQ== + openid-client@^4.1.1: version "4.9.0" resolved "https://registry.npmjs.org/openid-client/-/openid-client-4.9.0.tgz#bdfc9194435316df419f759ce177635146b43074" From 67503d159ea09572bf89a119e280f5b32d226691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Frinnstr=C3=B6m?= Date: Wed, 22 Jun 2022 18:31:20 +0200 Subject: [PATCH 280/590] Add changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Frinnström --- .changeset/shy-cameras-develop.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/shy-cameras-develop.md diff --git a/.changeset/shy-cameras-develop.md b/.changeset/shy-cameras-develop.md new file mode 100644 index 0000000000..c62a9a56e3 --- /dev/null +++ b/.changeset/shy-cameras-develop.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-catalog-backend-module-openapi': minor +--- + +Add basic OpenAPI \$ref support. + +For more information see [here](https://github.com/backstage/backstage/tree/master/plugins/catalog-backend-module-openapi). From 3524900dfd8a301c1240c0cf69be694b556d8568 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 16:57:48 +0000 Subject: [PATCH 281/590] fix(deps): update dependency run-script-webpack-plugin to v0.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 94120932df..9b93d7945b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22776,9 +22776,9 @@ run-parallel@^1.1.9: integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== run-script-webpack-plugin@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/run-script-webpack-plugin/-/run-script-webpack-plugin-0.1.0.tgz#6250a4734511836628259666d56641a27526875d" - integrity sha512-PKddVrnTu1BO90ogvN93yP/zg3X8Q4XvSKKyGVZFye9VBVbgVkFllKykNOomi9IfNtnoFFzu6TkLONIuXq5URA== + version "0.1.1" + resolved "https://registry.npmjs.org/run-script-webpack-plugin/-/run-script-webpack-plugin-0.1.1.tgz#dad3114be32eb864d2160306e4d9c52a2c1cfd59" + integrity sha512-PrxBRLv1K9itDKMlootSCyGhdTU+KbKGJ2wF6/k0eyo6M0YGPC58HYbS/J/QsDiwM0t7G99WcuCqto0J7omOXA== rxjs@7.5.5, rxjs@^7.0.0, rxjs@^7.1.0, rxjs@^7.2.0, rxjs@^7.5.1, rxjs@^7.5.5: version "7.5.5" From 64c7abbb160b2e7497ad5aa98ce31e7070207328 Mon Sep 17 00:00:00 2001 From: Taras Date: Wed, 22 Jun 2022 14:03:13 -0400 Subject: [PATCH 282/590] Added missing logos Signed-off-by: Taras Mankovski --- microsite/data/plugins/gke-usage.yaml | 2 +- microsite/data/plugins/harbor.yaml | 2 +- microsite/data/plugins/humanitec.yaml | 2 +- microsite/static/img/gke-logo.png | Bin 0 -> 10452 bytes microsite/static/img/harbor-logo.png | Bin 0 -> 18741 bytes 5 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 microsite/static/img/gke-logo.png create mode 100644 microsite/static/img/harbor-logo.png diff --git a/microsite/data/plugins/gke-usage.yaml b/microsite/data/plugins/gke-usage.yaml index e092f84973..9668b18fdf 100644 --- a/microsite/data/plugins/gke-usage.yaml +++ b/microsite/data/plugins/gke-usage.yaml @@ -5,7 +5,7 @@ authorUrl: https://bestsellerit.com category: Discovery description: This plugin will show you the cost and resource usage of your application within Google Kubernetes Engine (GKE). documentation: https://github.com/BESTSELLER/backstage-plugin-gkeusage/blob/master/README.md -iconUrl: https://bestsellerit.com/img/google-container-engine_avatar.svg +iconUrl: img/gke-logo.png npmPackageName: '@bestsellerit/backstage-plugin-gkeusage' tags: - gke diff --git a/microsite/data/plugins/harbor.yaml b/microsite/data/plugins/harbor.yaml index 9023e0c434..64b2033021 100644 --- a/microsite/data/plugins/harbor.yaml +++ b/microsite/data/plugins/harbor.yaml @@ -5,7 +5,7 @@ authorUrl: https://bestsellerit.com category: Discovery description: This plugin will show you information about Docker images within the Harbor cloud native registry. documentation: https://github.com/BESTSELLER/backstage-plugin-harbor/blob/master/README.md -iconUrl: https://bestsellerit.com/img/terraform-harbor/goharbor.jpeg +iconUrl: img/harbor-logo.png npmPackageName: '@bestsellerit/backstage-plugin-harbor' tags: - goharbor diff --git a/microsite/data/plugins/humanitec.yaml b/microsite/data/plugins/humanitec.yaml index 88c0cd0a08..bd5dec9dc6 100644 --- a/microsite/data/plugins/humanitec.yaml +++ b/microsite/data/plugins/humanitec.yaml @@ -7,5 +7,5 @@ description: | Show workloads, environments and resources deployed by Humanitec Platform Orchestrator. Plugin includes an Entity ComponentCard, Backend API route and scaffolder actions. documentation: https://github.com/thefrontside/backstage/tree/main/plugins/humanitec -iconUrl: ../../static/img/humanitec-logo.png +iconUrl: img/humanitec-logo.png npmPackageName: '@frontside/backstage-plugin-humanitec' diff --git a/microsite/static/img/gke-logo.png b/microsite/static/img/gke-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5af1abbf9a831ebe8b9a9ff87d17e78d2789236c GIT binary patch literal 10452 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 literal 0 HcmV?d00001 From fea3933d976081fd3adad8bf7a684e3dce83438a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jun 2022 02:34:54 +0000 Subject: [PATCH 283/590] chore(deps): update dependency msw to v0.42.3 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9b93d7945b..cf4f33b1d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18805,9 +18805,9 @@ msw@^0.39.2: yargs "^17.3.1" msw@^0.42.0: - version "0.42.1" - resolved "https://registry.npmjs.org/msw/-/msw-0.42.1.tgz#2496d3e191754b68686e2530de459a2e102f85c4" - integrity sha512-LZZuz7VddL45gCBgfBWHyXj6a4W7OTJY0mZPoipJ3P/xwbuJwrtwB3IJrWlqBM8aink/eTKlRxwzmtIAwCj5yQ== + version "0.42.3" + resolved "https://registry.npmjs.org/msw/-/msw-0.42.3.tgz#150c475e2cb6d53c67503bd0e3f6251bfd075328" + integrity sha512-zrKBIGCDsNUCZLd3DLSeUtRruZ0riwJgORg9/bSDw3D0PTI8XUGAK3nC0LJA9g0rChGuKaWK/SwObA8wpFrz4g== dependencies: "@mswjs/cookies" "^0.2.0" "@mswjs/interceptors" "^0.16.3" From 007cba9eb12304057f3663ec48de6754c7ab7414 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Thu, 23 Jun 2022 10:07:08 +0400 Subject: [PATCH 284/590] fixed issue where error message would be 0 instead of empty element Signed-off-by: Daniele.Mazzotta --- .../src/components/DagTableComponent/DagTableComponent.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx index 46127e0b5e..2514d70d45 100644 --- a/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx +++ b/plugins/apache-airflow/src/components/DagTableComponent/DagTableComponent.tsx @@ -162,12 +162,14 @@ export const DagTableComponent = ({ dagIds }: DagTableComponentProps) => { : []; return ( <> - {dagsNotFound.length && ( + {dagsNotFound.length ? ( {dagsNotFound.map(dagId => ( {dagId} ))} + ) : ( + '' )} From aed6b691cb8c8f2b85b3edf999f6b57b39e66b58 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Thu, 23 Jun 2022 10:29:10 +0400 Subject: [PATCH 285/590] fixed failing test while fetching getDags Signed-off-by: Daniele.Mazzotta --- .../apache-airflow/src/api/ApacheAirflowClient.test.ts | 9 +++++++++ plugins/apache-airflow/src/api/ApacheAirflowClient.ts | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts b/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts index 329f89ee52..b9bdb02283 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowClient.test.ts @@ -107,6 +107,15 @@ describe('ApacheAirflowClient', () => { ); }), + rest.get(`${mockBaseUrl}/airflow/dags/:dag_id`, (req, res, ctx) => { + const { dag_id } = req.params; + const dag = dags.find(d => d.dag_id === dag_id); + if (dag) { + return res(ctx.json(dag)); + } + return res(ctx.status(404)); + }), + rest.patch(`${mockBaseUrl}/airflow/dags/:dag_id`, (req, res, ctx) => { const { dag_id } = req.params; const body = JSON.parse(req.body as string); diff --git a/plugins/apache-airflow/src/api/ApacheAirflowClient.ts b/plugins/apache-airflow/src/api/ApacheAirflowClient.ts index bf095a96ba..b6c0a09c3a 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowClient.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowClient.ts @@ -82,7 +82,7 @@ export class ApacheAirflowClient implements ApacheAirflowApi { const response = await Promise.all( dagIds.map(id => { return this.fetch(`/dags/${id}`).catch(e => { - if (e.message === 'NOT FOUND') { + if (e.message === 'Not Found') { dagsNotFound.push(id); } else { throw e; From 7bc7b1d37617b5de113547979c224f27a10f3ad8 Mon Sep 17 00:00:00 2001 From: "Daniele.Mazzotta" Date: Thu, 23 Jun 2022 10:35:50 +0400 Subject: [PATCH 286/590] case-insensitive NOT FOUND error catching in getDags Signed-off-by: Daniele.Mazzotta --- plugins/apache-airflow/src/api/ApacheAirflowClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/apache-airflow/src/api/ApacheAirflowClient.ts b/plugins/apache-airflow/src/api/ApacheAirflowClient.ts index b6c0a09c3a..c722f5977d 100644 --- a/plugins/apache-airflow/src/api/ApacheAirflowClient.ts +++ b/plugins/apache-airflow/src/api/ApacheAirflowClient.ts @@ -82,7 +82,7 @@ export class ApacheAirflowClient implements ApacheAirflowApi { const response = await Promise.all( dagIds.map(id => { return this.fetch(`/dags/${id}`).catch(e => { - if (e.message === 'Not Found') { + if (e.message.toUpperCase('en-US') === 'NOT FOUND') { dagsNotFound.push(id); } else { throw e; From 9592a6cefd7acd7e7917fa2e4c2fb16c617981b8 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Thu, 23 Jun 2022 10:54:40 +0200 Subject: [PATCH 287/590] fix(search): race condition on search bar test Signed-off-by: Camila Belo --- .../components/SearchBar/SearchBar.test.tsx | 337 ++++++++++-------- 1 file changed, 183 insertions(+), 154 deletions(-) diff --git a/plugins/search/src/components/SearchBar/SearchBar.test.tsx b/plugins/search/src/components/SearchBar/SearchBar.test.tsx index c48c3d3ed2..4d8a46024c 100644 --- a/plugins/search/src/components/SearchBar/SearchBar.test.tsx +++ b/plugins/search/src/components/SearchBar/SearchBar.test.tsx @@ -18,59 +18,60 @@ import React from 'react'; import { screen, render, waitFor, act } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { configApiRef, analyticsApiRef } from '@backstage/core-plugin-api'; -import { ApiProvider, ConfigReader } from '@backstage/core-app-api'; -import { MockAnalyticsApi, TestApiRegistry } from '@backstage/test-utils'; +import { ConfigReader } from '@backstage/core-app-api'; +import { + MockAnalyticsApi, + TestApiProvider, + renderWithEffects, +} from '@backstage/test-utils'; import { SearchContextProvider, searchApiRef, + SearchBar, } from '@backstage/plugin-search-react'; -import { SearchBar } from './SearchBar'; - -jest.mock('@backstage/core-plugin-api', () => ({ - ...jest.requireActual('@backstage/core-plugin-api'), -})); +const createInitialState = ({ + term = '', + filters = {}, + types = ['*'], + pageCursor = '', +} = {}) => ({ + term, + filters, + types, + pageCursor, +}); describe('SearchBar', () => { - const initialState = { - term: '', - filters: {}, - types: ['*'], - pageCursor: '', - }; + const query = jest.fn().mockResolvedValue({ results: [] }); - const query = jest.fn().mockResolvedValue({}); - const analyticsApiSpy = new MockAnalyticsApi(); - let apiRegistry: TestApiRegistry; + const analyticsApiMock = new MockAnalyticsApi(); - apiRegistry = TestApiRegistry.from( - [ - configApiRef, - new ConfigReader({ - app: { title: 'Mock title' }, - }), - ], - [searchApiRef, { query }], - ); + const configApiMock = new ConfigReader({ + app: { title: 'Mock title' }, + }); - const name = 'Search'; - const term = 'term'; + const searchApiMock = { query }; - afterAll(() => { - jest.resetAllMocks(); + beforeEach(() => { + jest.clearAllMocks(); }); it('Renders without exploding', async () => { - render( - - + await renderWithEffects( + + - , + , ); await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toBeInTheDocument(); expect( screen.getByPlaceholderText('Search in Mock title'), ).toBeInTheDocument(); @@ -78,59 +79,72 @@ describe('SearchBar', () => { }); it('Renders with custom placeholder', async () => { - render( - - - + const placeholder = 'placeholder'; + + await renderWithEffects( + + + - , - , + , ); await waitFor(() => { - expect( - screen.getByPlaceholderText('This is a custom placeholder'), - ).toBeInTheDocument(); + expect(screen.getByPlaceholderText(placeholder)).toBeInTheDocument(); }); }); it('Renders based on initial search', async () => { + const term = 'term'; + render( - - + + - , - , + , ); await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toHaveValue(term); + expect(screen.getByRole('textbox', { name: 'Search' })).toHaveValue(term); }); }); it('Updates term state when text is entered', async () => { - const user = userEvent.setup({ delay: null }); jest.useFakeTimers(); - const defaultDebounceTime = 200; + const user = userEvent.setup({ delay: null }); - render( - - + await renderWithEffects( + + - , - , + , ); - const textbox = screen.getByRole('textbox', { name }); + const textbox = screen.getByRole('textbox', { name: 'Search' }); const value = 'value'; await user.type(textbox, value); act(() => { - jest.advanceTimersByTime(defaultDebounceTime); + jest.advanceTimersByTime(200); }); await waitFor(() => { @@ -140,26 +154,36 @@ describe('SearchBar', () => { expect(query).toHaveBeenLastCalledWith( expect.objectContaining({ term: value }), ); + jest.useRealTimers(); }); it('Clear button clears term state', async () => { - render( - - + const term = 'term'; + + await renderWithEffects( + + - , + , ); + const textbox = screen.getByRole('textbox', { name: 'Search' }); + await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toHaveValue(term); + expect(textbox).toHaveValue(term); }); await userEvent.click(screen.getByRole('button', { name: 'Clear' })); await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toHaveValue(''); + expect(textbox).toHaveValue(''); }); expect(query).toHaveBeenLastCalledWith( @@ -168,12 +192,19 @@ describe('SearchBar', () => { }); it('Should not show clear button', async () => { - render( - - + const term = 'term'; + + await renderWithEffects( + + - , + , ); await waitFor(() => { @@ -184,170 +215,168 @@ describe('SearchBar', () => { }); it('Adheres to provided debounceTime', async () => { - const user = userEvent.setup({ delay: null }); jest.useFakeTimers(); - + const user = userEvent.setup({ delay: null }); const debounceTime = 600; - render( - - + await renderWithEffects( + + - , - , + , ); - await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toBeInTheDocument(); - }); - - const textbox = screen.getByRole('textbox', { name }); + const textbox = await screen.findByRole('textbox', { name: 'Search' }); const value = 'value'; await user.type(textbox, value); - expect(query).not.toHaveBeenLastCalledWith( - expect.objectContaining({ term: value }), - ); + await waitFor(() => { + expect(query).not.toHaveBeenLastCalledWith( + expect.objectContaining({ term: value }), + ); + }); act(() => { jest.advanceTimersByTime(debounceTime); }); - expect(textbox).toHaveValue(value); + + await waitFor(() => { + expect(textbox).toHaveValue(value); + }); expect(query).toHaveBeenLastCalledWith( expect.objectContaining({ term: value }), ); + jest.useRealTimers(); }); it('does not capture analytics event if not enabled in app', async () => { - const user = userEvent.setup({ delay: null }); jest.useFakeTimers(); + const user = userEvent.setup({ delay: null }); - const debounceTime = 600; - - render( - - - + await renderWithEffects( + + + - , - , + , ); - await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toBeInTheDocument(); - }); - - const textbox = screen.getByRole('textbox', { name }); + const textbox = await screen.findByRole('textbox', { name: 'Search' }); const value = 'value'; await user.type(textbox, value); act(() => { - jest.advanceTimersByTime(debounceTime); + jest.advanceTimersByTime(200); }); - await waitFor(() => expect(textbox).toHaveValue(value)); + await waitFor(() => { + expect(textbox).toHaveValue(value); + }); + + expect(analyticsApiMock.getEvents()).toHaveLength(0); - expect(analyticsApiSpy.getEvents()).toHaveLength(0); jest.useRealTimers(); }); it('captures analytics events if enabled in app', async () => { - const user = userEvent.setup({ delay: null }); jest.useFakeTimers(); + const user = userEvent.setup({ delay: null }); + const types = ['techdocs', 'software-catalog']; - const debounceTime = 600; - - apiRegistry = TestApiRegistry.from( - [analyticsApiRef, analyticsApiSpy], - [ - configApiRef, - new ConfigReader({ - app: { - title: 'Mock title', - analytics: { - ga: { - trackingId: 'xyz123', + await renderWithEffects( + - - + }), + ], + ]} + > + + -
, + , ); - await waitFor(() => { - expect(screen.getByRole('textbox', { name })).toBeInTheDocument(); - }); + const textbox = await screen.findByRole('textbox', { name: 'Search' }); - const textbox = screen.getByRole('textbox', { name }); - - const value = 'value'; + let value = 'value'; await user.type(textbox, value); - expect(analyticsApiSpy.getEvents()).toHaveLength(0); + expect(analyticsApiMock.getEvents()).toHaveLength(0); act(() => { - jest.advanceTimersByTime(debounceTime); + jest.advanceTimersByTime(200); }); await waitFor(() => expect(textbox).toHaveValue(value)); - expect(analyticsApiSpy.getEvents()).toHaveLength(1); - expect(analyticsApiSpy.getEvents()[0]).toEqual({ + expect(analyticsApiMock.getEvents()).toHaveLength(1); + expect(analyticsApiMock.getEvents()[0]).toEqual({ action: 'search', context: { - extension: 'App', - pluginId: 'root', + extension: 'SearchBar', + pluginId: 'search', routeRef: 'unknown', - searchTypes: 'software-catalog,techdocs', + searchTypes: types.toString(), }, - subject: 'value', + subject: value, }); await user.clear(textbox); + value = 'new value'; + // make sure new term is captured - await user.type(textbox, 'new value'); + await user.type(textbox, value); act(() => { - jest.advanceTimersByTime(debounceTime); + jest.advanceTimersByTime(200); }); - await waitFor(() => expect(textbox).toHaveValue('new value')); + await waitFor(() => expect(textbox).toHaveValue(value)); - expect(analyticsApiSpy.getEvents()).toHaveLength(2); - expect(analyticsApiSpy.getEvents()[1]).toEqual({ + expect(analyticsApiMock.getEvents()).toHaveLength(2); + expect(analyticsApiMock.getEvents()[1]).toEqual({ action: 'search', context: { - extension: 'App', - pluginId: 'root', + extension: 'SearchBar', + pluginId: 'search', routeRef: 'unknown', - searchTypes: 'software-catalog,techdocs', + searchTypes: types.toString(), }, - subject: 'new value', + subject: value, }); + jest.useRealTimers(); }); }); From 7d9dc8f271c26c964034a3bcbfcf58eef58b3454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Frinnstr=C3=B6m?= Date: Thu, 23 Jun 2022 11:00:50 +0200 Subject: [PATCH 288/590] Change version to 0.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Frinnström --- plugins/catalog-backend-module-openapi/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 228147809e..1c99618ff8 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.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", From 5d7a1cca09a1a198dd1eb01a1568bb25f9f7d4ad Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Thu, 23 Jun 2022 11:03:12 +0200 Subject: [PATCH 289/590] point to config schema from package.json Signed-off-by: Emma Indal --- plugins/stack-overflow/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 922277c74a..0fe8ae476f 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -55,5 +55,6 @@ "files": [ "dist", "config" - ] + ], + "configSchema": "config.d.ts" } From 52b4f796e3432b373026877fd3dfaca01beaee0a Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Thu, 23 Jun 2022 11:06:52 +0200 Subject: [PATCH 290/590] changeset Signed-off-by: Emma Indal --- .changeset/strange-tables-flash.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strange-tables-flash.md diff --git a/.changeset/strange-tables-flash.md b/.changeset/strange-tables-flash.md new file mode 100644 index 0000000000..fd13289752 --- /dev/null +++ b/.changeset/strange-tables-flash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-stack-overflow': patch +--- + +app-config is now picked up properly. From 6e948bc6ac3518c6b64e29827ee2bfb655c3412e Mon Sep 17 00:00:00 2001 From: Jorge Lainfiesta Date: Tue, 21 Jun 2022 17:16:04 +0200 Subject: [PATCH 291/590] Adds Community page update proposal Signed-off-by: Jorge Lainfiesta --- microsite/pages/en/community.js | 215 ++++++++++++------ .../static/img/partner-logo-frontside.png | Bin 0 -> 5860 bytes microsite/static/img/partner-logo-roadie.png | Bin 0 -> 6008 bytes .../static/img/partner-logo-thoughtworks.png | Bin 0 -> 7492 bytes microsite/static/img/partner-logo-vmware.png | Bin 0 -> 6573 bytes 5 files changed, 147 insertions(+), 68 deletions(-) create mode 100644 microsite/static/img/partner-logo-frontside.png create mode 100644 microsite/static/img/partner-logo-roadie.png create mode 100644 microsite/static/img/partner-logo-thoughtworks.png create mode 100644 microsite/static/img/partner-logo-vmware.png diff --git a/microsite/pages/en/community.js b/microsite/pages/en/community.js index 26366b25df..3d32226c60 100644 --- a/microsite/pages/en/community.js +++ b/microsite/pages/en/community.js @@ -8,6 +8,27 @@ const React = require('react'); const Components = require(`${process.cwd()}/core/Components.js`); const Block = Components.Block; +const Breakpoint = Components.Breakpoint; +const ActionBlock = Components.ActionBlock; +const BulletLine = Components.BulletLine; + +const PARTNERS = [{ + name: "Frontside Software", + url: "https://frontside.com/backstage/", + logo: "img/partner-logo-frontside.png" +}, { + name: "Roadie", + url: "https://roadie.io/", + logo: "img/partner-logo-roadie.png" +}, { + name: "ThoughtWorks", + url: "https://www.thoughtworks.com", + logo: "img/partner-logo-thoughtworks.png" +}, { + name: "VMWare", + url: "https://www.vmware.com", + logo: "img/partner-logo-vmware.png" +}]; const Background = props => { const { config: siteConfig } = props; @@ -17,14 +38,10 @@ const Background = props => { - Backstage Community - - + Backstage Community - What's the use of having fun if you can't share it? Exactly. Join - the vibrant community around the Backstage project. Be it on - GitHub, social media, Discord... You'll find a welcoming - environment. To ensure this, we follow the{' '} + Join + the vibrant community around the Backstage project through social media and different meetups. To ensure you have a welcoming environment, we follow {' '}
{' '} CNCF Code of Conduct @@ -32,84 +49,146 @@ const Background = props => { in everything we do. - + - Main community channels -
- Chat and get support on our{' '} -
Discord -
- Get into contributing with the{' '} - - Good First Issues - -
- Subscribe to the{' '} - - Community newsletter - -
- Join the{' '} - - Twitter community - -
+ + Get started in our community! + +