From 9d455f69a8de1fca3ad1cee8e218d24f56686528 Mon Sep 17 00:00:00 2001 From: Oliver Sand Date: Mon, 22 Feb 2021 16:36:57 +0100 Subject: [PATCH 01/27] Introduce parameters for namespace, kind, and name to `entityRouteRef` Signed-off-by: Oliver Sand --- .changeset/soft-months-invite.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/soft-months-invite.md diff --git a/.changeset/soft-months-invite.md b/.changeset/soft-months-invite.md new file mode 100644 index 0000000000..a6a20973e9 --- /dev/null +++ b/.changeset/soft-months-invite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Introduce parameters for namespace, kind, and name to `entityRouteRef`. From cfc83cac16099cd53f9156df4d8fc85e6b278c13 Mon Sep 17 00:00:00 2001 From: Oliver Sand Date: Mon, 22 Feb 2021 16:40:29 +0100 Subject: [PATCH 02/27] Introduce external route for linking to the entity page from the explore plugin Signed-off-by: Oliver Sand --- .changeset/large-eggs-help.md | 19 +++++++++++++++++++ packages/app/src/App.tsx | 5 ++++- .../components/DomainCard/DomainCard.test.tsx | 17 +++++++++++------ .../src/components/DomainCard/DomainCard.tsx | 12 ++++-------- .../DomainCard/DomainCardGrid.test.tsx | 17 +++++++++++------ .../DomainExplorerContent.test.tsx | 16 ++++++++++++++++ plugins/explore/src/plugin.ts | 5 ++++- plugins/explore/src/routes.ts | 7 ++++++- 8 files changed, 75 insertions(+), 23 deletions(-) create mode 100644 .changeset/large-eggs-help.md diff --git a/.changeset/large-eggs-help.md b/.changeset/large-eggs-help.md new file mode 100644 index 0000000000..e310ad7645 --- /dev/null +++ b/.changeset/large-eggs-help.md @@ -0,0 +1,19 @@ +--- +'@backstage/plugin-explore': minor +--- + +Introduce external route for linking to the entity page from the explore plugin. + +To use the explore plugin you have to bind the external route in your app: + +```typescript +const app = createApp({ + ... + bindRoutes({ bind }) { + ... + bind(explorePlugin.externalRoutes, { + catalogEntity: catalogPlugin.routes.catalogEntity, + }); + }, +}); +``` diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 5b6f7b95fe..7acde03953 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -33,7 +33,7 @@ import { CostInsightsPage, CostInsightsProjectGrowthInstructionsPage, } from '@backstage/plugin-cost-insights'; -import { ExplorePage } from '@backstage/plugin-explore'; +import { ExplorePage, explorePlugin } from '@backstage/plugin-explore'; import { GcpProjectsPage } from '@backstage/plugin-gcp-projects'; import { GraphiQLPage } from '@backstage/plugin-graphiql'; import { LighthousePage } from '@backstage/plugin-lighthouse'; @@ -79,6 +79,9 @@ const app = createApp({ bind(apiDocsPlugin.externalRoutes, { createComponent: scaffolderPlugin.routes.root, }); + bind(explorePlugin.externalRoutes, { + catalogEntity: catalogPlugin.routes.catalogEntity, + }); }, }); diff --git a/plugins/explore/src/components/DomainCard/DomainCard.test.tsx b/plugins/explore/src/components/DomainCard/DomainCard.test.tsx index 9d409051f6..56a02a3642 100644 --- a/plugins/explore/src/components/DomainCard/DomainCard.test.tsx +++ b/plugins/explore/src/components/DomainCard/DomainCard.test.tsx @@ -15,13 +15,13 @@ */ import { DomainEntity } from '@backstage/catalog-model'; -import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import React from 'react'; -import { MemoryRouter } from 'react-router-dom'; +import { catalogEntityRouteRef } from '../../routes'; import { DomainCard } from './DomainCard'; describe('', () => { - it('renders a domain card', () => { + it('renders a domain card', async () => { const entity: DomainEntity = { apiVersion: 'backstage.io/v1alpha1', kind: 'Domain', @@ -34,9 +34,14 @@ describe('', () => { owner: 'guest', }, }; - const { getByText } = render(, { - wrapper: MemoryRouter, - }); + const { getByText } = await renderInTestApp( + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': catalogEntityRouteRef, + }, + }, + ); expect(getByText('artists')).toBeInTheDocument(); expect(getByText('Everything about artists')).toBeInTheDocument(); diff --git a/plugins/explore/src/components/DomainCard/DomainCard.tsx b/plugins/explore/src/components/DomainCard/DomainCard.tsx index e5efc543b2..67bee13696 100644 --- a/plugins/explore/src/components/DomainCard/DomainCard.tsx +++ b/plugins/explore/src/components/DomainCard/DomainCard.tsx @@ -14,15 +14,14 @@ * limitations under the License. */ import { DomainEntity, RELATION_OWNED_BY } from '@backstage/catalog-model'; -import { ItemCard } from '@backstage/core'; +import { ItemCard, useRouteRef } from '@backstage/core'; import { EntityRefLinks, - entityRoute, entityRouteParams, getEntityRelations, } from '@backstage/plugin-catalog-react'; import React from 'react'; -import { generatePath } from 'react-router-dom'; +import { catalogEntityRouteRef } from '../../routes'; type DomainCardProps = { entity: DomainEntity; @@ -30,6 +29,7 @@ type DomainCardProps = { export const DomainCard = ({ entity }: DomainCardProps) => { const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY); + const catalogEntityRoute = useRouteRef(catalogEntityRouteRef); return ( { /> } label="Explore" - // TODO: Use useRouteRef here to generate the path - href={generatePath( - `/catalog/${entityRoute.path}`, - entityRouteParams(entity), - )} + href={catalogEntityRoute(entityRouteParams(entity))} /> ); }; diff --git a/plugins/explore/src/components/DomainCard/DomainCardGrid.test.tsx b/plugins/explore/src/components/DomainCard/DomainCardGrid.test.tsx index bad3ca581b..ee06a50427 100644 --- a/plugins/explore/src/components/DomainCard/DomainCardGrid.test.tsx +++ b/plugins/explore/src/components/DomainCard/DomainCardGrid.test.tsx @@ -15,13 +15,13 @@ */ import { DomainEntity } from '@backstage/catalog-model'; -import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/test-utils'; import React from 'react'; -import { MemoryRouter } from 'react-router-dom'; +import { catalogEntityRouteRef } from '../../routes'; import { DomainCardGrid } from './DomainCardGrid'; describe('', () => { - it('renders a grid of domain cards', () => { + it('renders a grid of domain cards', async () => { const entities: DomainEntity[] = [ { apiVersion: 'backstage.io/v1alpha1', @@ -44,9 +44,14 @@ describe('', () => { }, }, ]; - const { getByText } = render(, { - wrapper: MemoryRouter, - }); + const { getByText } = await renderInTestApp( + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': catalogEntityRouteRef, + }, + }, + ); expect(getByText('artists')).toBeInTheDocument(); expect(getByText('playback')).toBeInTheDocument(); diff --git a/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.test.tsx b/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.test.tsx index f29ad2cd6a..cd3f2847c6 100644 --- a/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.test.tsx +++ b/plugins/explore/src/components/DomainExplorerContent/DomainExplorerContent.test.tsx @@ -20,6 +20,7 @@ import { catalogApiRef } from '@backstage/plugin-catalog-react'; import { renderInTestApp } from '@backstage/test-utils'; import { waitFor } from '@testing-library/react'; import React from 'react'; +import { catalogEntityRouteRef } from '../../routes'; import { DomainExplorerContent } from './DomainExplorerContent'; describe('', () => { @@ -71,6 +72,11 @@ describe('', () => { , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': catalogEntityRouteRef, + }, + }, ); await waitFor(() => { @@ -86,6 +92,11 @@ describe('', () => { , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': catalogEntityRouteRef, + }, + }, ); await waitFor(() => @@ -101,6 +112,11 @@ describe('', () => { , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': catalogEntityRouteRef, + }, + }, ); await waitFor(() => diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts index 27573eaeb9..c5dd6644e7 100644 --- a/plugins/explore/src/plugin.ts +++ b/plugins/explore/src/plugin.ts @@ -16,7 +16,7 @@ import { createApiFactory, createPlugin } from '@backstage/core'; import { exploreToolsConfigRef } from '@backstage/plugin-explore-react'; -import { exploreRouteRef } from './routes'; +import { catalogEntityRouteRef, exploreRouteRef } from './routes'; import { exampleTools } from './util/examples'; export const explorePlugin = createPlugin({ @@ -37,4 +37,7 @@ export const explorePlugin = createPlugin({ routes: { explore: exploreRouteRef, }, + externalRoutes: { + catalogEntity: catalogEntityRouteRef, + }, }); diff --git a/plugins/explore/src/routes.ts b/plugins/explore/src/routes.ts index c41a53128f..fc7868c4c9 100644 --- a/plugins/explore/src/routes.ts +++ b/plugins/explore/src/routes.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { createRouteRef } from '@backstage/core'; +import { createExternalRouteRef, createRouteRef } from '@backstage/core'; const NoIcon = () => null; @@ -22,3 +22,8 @@ export const exploreRouteRef = createRouteRef({ icon: NoIcon, title: 'Explore', }); + +export const catalogEntityRouteRef = createExternalRouteRef({ + id: 'catalog-entity', + params: ['namespace', 'kind', 'name'], +}); From 7b9950ce20707f9970b2fd6f436b118119af862b Mon Sep 17 00:00:00 2001 From: Alan Crosswell Date: Wed, 3 Mar 2021 16:27:46 -0500 Subject: [PATCH 03/27] Document how to install oauth2-redirect.html Signed-off-by: Alan Crosswell --- plugins/api-docs/README.md | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/plugins/api-docs/README.md b/plugins/api-docs/README.md index 182ee5a882..0b8d658f89 100644 --- a/plugins/api-docs/README.md +++ b/plugins/api-docs/README.md @@ -23,6 +23,68 @@ Other formats are displayed as plain text, but this can easily be extended. To fill the catalog with APIs, [provide entities of kind API](https://backstage.io/docs/features/software-catalog/descriptor-format#kind-api). To link that a component provides or consumes an API, see the [`providesApis`](https://backstage.io/docs/features/software-catalog/descriptor-format#specprovidesapis-optional) and [`consumesApis`](https://backstage.io/docs/features/software-catalog/descriptor-format#specconsumesapis-optional) properties on the Component kind. +## Implementing OAuth 2 Authorization Code flow with Swagger UI + +### Adding `oauth2-redirect.html` to support OAuth2 `redirect_uri` route + +The Swagger UI package by expects to have a route to `/oauth2-redirect.html` which processes +the redirect callback for the OAuth2 Authorization Code flow, however, this file is not installed +by this plugin. + +Grab a copy of [oauth2-redirect.html](https://github.com/swagger-api/swagger-ui/blob/master/dist/oauth2-redirect.html) +and put it in the `app/public/` directory in order to enable Swagger UI to complete this redirection. + +### Configuring your OAuth2 Client + +You'll need to make sure your OAuth2 client has been registered in your OAuth2 Authentication Server (AS) +with the appropriate `redirect_uris`, `scopes` and `grant_types`. For example, if your AS supports +the [OAuth 2.0 Dynamic Client Registration Protocol](https://tools.ietf.org/html/rfc7591), an example +POST request body would look like this: + +```json +{ + "client_name": "Example Backstage api-docs plugin Swagger UI Client", + "redirect_uris": [ + "https://www.getpostman.com/oauth2/callback", + "http://localhost:3000/oauth2-redirect.html" + "https:///oauth2-redirect.html" + ], + "scope": "read_pets write_pets", + "grant_types": [ + "authorization_code" + ] +} +``` + +The above `redirect_uris` are: + +- [Postman](https://www.postman.com/) testing: `https://www.getpostman.com/oauth2/callback` +- Local Backstage app development: `http://localhost:3000/oauth2-redirect.html` +- Backstage app production: `https:///oauth2-redirect.html` + +### Configuring OAuth2 in your OpenAPI 3.0 schema + +To configure [OAuth 2 Authorization Code](https://swagger.io/docs/specification/authentication/oauth2/) flow +in your OpenAPI 3.0 schema you'll need something like this snippet: + +```yaml +components: + securitySchemes: + oauth: + type: oauth2 + description: OAuth2 service + flows: + authorizationCode: + authorizationUrl: https://api.example.com/oauth2/authorize + tokenUrl: https://api.example.com/oauth2/token + scopes: + read_pets: read your pets + write_pets: modify pets in your account +security: + oauth: + - [read_pets, write_pets] +``` + ## Links - [The Backstage homepage](https://backstage.io) From b27aa7c7acc066afd6a6f36a371f40a0d9fdee01 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Thu, 18 Feb 2021 02:31:21 -0300 Subject: [PATCH 04/27] Add tests for fetchTechDocsMetadata Signed-off-by: vitorgrenzel --- .../__mocks__/@azure/storage-blob.ts | 19 ++++++ .../stages/publish/azureBlobStorage.test.ts | 67 ++++++++++++++++++- .../src/stages/publish/azureBlobStorage.ts | 34 +++++++--- 3 files changed, 107 insertions(+), 13 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 4fc1e4c374..8734b58891 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -17,6 +17,7 @@ import type { BlobUploadCommonResponse, ContainerGetPropertiesResponse, } from '@azure/storage-blob'; +import { EventEmitter } from 'events'; import fs from 'fs-extra'; import os from 'os'; import path from 'path'; @@ -62,6 +63,24 @@ export class BlockBlobClient { exists() { return checkFileExists(this.blobName); } + + download() { + const emitter = new EventEmitter(); + process.nextTick(() => { + if (fs.existsSync(this.blobName)) { + emitter.emit('data', Buffer.from(fs.readFileSync(this.blobName))); + } else { + emitter.emit( + 'error', + new Error(`The file ${this.blobName} doest not exist!`), + ); + } + emitter.emit('end'); + }); + return Promise.resolve({ + readableStreamBody: emitter, + }); + } } class BlockBlobClientFailUpload extends BlockBlobClient { diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index cf1ea60592..e1edaa61bb 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -20,8 +20,9 @@ import mockFs from 'mock-fs'; import os from 'os'; import path from 'path'; import { AzureBlobStoragePublish } from './azureBlobStorage'; -import { PublisherBase } from './types'; - +import { PublisherBase, TechDocsMetadata } from './types'; +import type { Entity, EntityName } from '@backstage/catalog-model'; +import type { Logger } from 'winston'; // NOTE: /packages/techdocs-common/__mocks__ is being used to mock Azure client library const createMockEntity = (annotations = {}) => { @@ -38,6 +39,12 @@ const createMockEntity = (annotations = {}) => { }; }; +const createMockEntityName = (): EntityName => ({ + kind: 'TestKind', + name: 'test-component-name', + namespace: 'test-namespace', +}); + const rootDir = os.platform() === 'win32' ? 'C:\\rootDir' : '/rootDir'; const getEntityRootDir = (entity: Entity) => { const { @@ -255,4 +262,60 @@ describe('error reporting', () => { mockFs.restore(); }); + + describe('fetchTechDocsMetadata', () => { + it('should return tech docs metadata', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'techdocs_metadata.json': + '{"site_name": "backstage", "site_description": "site_content"}', + }, + }); + const expectedMetadata: TechDocsMetadata = { + site_name: 'backstage', + site_description: 'site_content', + }; + expect( + await publisher.fetchTechDocsMetadata(entityNameMock), + ).toStrictEqual(expectedMetadata); + mockFs.restore(); + }); + + it('should return tech docs metadata when json encoded with single quotes', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'techdocs_metadata.json': `{'site_name': 'backstage', 'site_description': 'site_content'}`, + }, + }); + + const expectedMetadata: TechDocsMetadata = { + site_name: 'backstage', + site_description: 'site_content', + }; + expect( + await publisher.fetchTechDocsMetadata(entityNameMock), + ).toStrictEqual(expectedMetadata); + mockFs.restore(); + }); + + it('should return an error if the techdocs_metadata.json file is not present', async () => { + const entityNameMock = createMockEntityName(); + + await publisher + .fetchTechDocsMetadata(entityNameMock) + .catch(error => + expect(error.message).toEqual( + expect.stringContaining('TechDocs metadata fetch'), + ), + ); + }); + }); }); diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index 2136ee2bc2..f7d2afc117 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -201,13 +201,13 @@ export class AzureBlobStoragePublish implements PublisherBase { return; } body + .on('data', chunk => { + fileStreamChunks.push(chunk); + }) .on('error', e => { this.logger.error(e.message); reject(e.message); }) - .on('data', chunk => { - fileStreamChunks.push(chunk); - }) .on('end', () => { resolve(Buffer.concat(fileStreamChunks)); }); @@ -220,16 +220,28 @@ export class AzureBlobStoragePublish implements PublisherBase { ): Promise { const entityRootDir = `${entityName.namespace}/${entityName.kind}/${entityName.name}`; try { - return await new Promise(resolve => { - const download = this.download( - this.containerName, - `${entityRootDir}/techdocs_metadata.json`, - ); - resolve(JSON5.parse(download.toString())); + return await new Promise(async (resolve, reject) => { + try { + const techdocsMetadataJson = await this.download( + this.containerName, + `${entityRootDir}/techdocs_metadata.json`, + ); + if (!techdocsMetadataJson) { + throw new Error( + `Unable to parse the techdocs metadata file ${entityRootDir}/techdocs_metadata.json.`, + ); + } + const techdocsMetadata = JSON5.parse( + techdocsMetadataJson.toString('utf-8'), + ); + resolve(techdocsMetadata); + } catch (err) { + this.logger.error(err.message); + reject(new Error(err.message)); + } }); } catch (e) { - this.logger.error(e.message); - throw e; + throw new Error(`TechDocs metadata fetch failed, ${e.message}`); } } From 5773488da20d136ff37df03f8fd6f74145c43e62 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Thu, 18 Feb 2021 02:34:24 -0300 Subject: [PATCH 05/27] Add changeset Signed-off-by: vitorgrenzel --- .changeset/techdocs-improve-tests.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/techdocs-improve-tests.md diff --git a/.changeset/techdocs-improve-tests.md b/.changeset/techdocs-improve-tests.md new file mode 100644 index 0000000000..4c8e68482f --- /dev/null +++ b/.changeset/techdocs-improve-tests.md @@ -0,0 +1,5 @@ +--- +'@backstage/techdocs-common': patch +--- + +Improved tests fetchTechDocsMetadata to AzureBlobStorage. From 1ad2b0ed92c1073222f4eba0610033c8bb9effb1 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Thu, 18 Feb 2021 02:36:42 -0300 Subject: [PATCH 06/27] Add tests for fetchTechDocsMetadata Signed-off-by: vitorgrenzel --- .../techdocs-common/src/stages/publish/azureBlobStorage.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index f7d2afc117..1d172bf6c9 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -201,13 +201,13 @@ export class AzureBlobStoragePublish implements PublisherBase { return; } body - .on('data', chunk => { - fileStreamChunks.push(chunk); - }) .on('error', e => { this.logger.error(e.message); reject(e.message); }) + .on('data', chunk => { + fileStreamChunks.push(chunk); + }) .on('end', () => { resolve(Buffer.concat(fileStreamChunks)); }); From 71684c6cb4f3732d7198e1453b207bf2e6cb4f93 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Mon, 22 Feb 2021 10:31:34 -0300 Subject: [PATCH 07/27] Add tests for fetchTechDocsMetadata Signed-off-by: vitorgrenzel --- .../__mocks__/@azure/storage-blob.ts | 32 +++++--- .../stages/publish/azureBlobStorage.test.ts | 73 ++++++++++++++++++- .../src/stages/publish/azureBlobStorage.ts | 5 +- 3 files changed, 91 insertions(+), 19 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 8734b58891..11a034db09 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -23,6 +23,7 @@ import os from 'os'; import path from 'path'; const rootDir = os.platform() === 'win32' ? 'C:\\rootDir' : '/rootDir'; + /** * @param sourceFile Relative path to entity root dir. Contains either / or \ as file separator * depending upon the OS. @@ -49,14 +50,20 @@ export class BlockBlobClient { } uploadFile(source: string): Promise { - return Promise.resolve({ - _response: { - request: { - url: `https://example.blob.core.windows.net`, - } as any, - status: 200, - headers: {} as any, - }, + return new Promise((resolve, reject) => { + if (!fs.existsSync(source)) { + reject(`The file ${source} does not exist`); + } else { + resolve({ + _response: { + request: { + url: `https://example.blob.core.windows.net`, + } as any, + status: 200, + headers: {} as any, + }, + }); + } }); } @@ -65,17 +72,18 @@ export class BlockBlobClient { } download() { + const filePath = path.join(rootDir, this.blobName); const emitter = new EventEmitter(); process.nextTick(() => { - if (fs.existsSync(this.blobName)) { - emitter.emit('data', Buffer.from(fs.readFileSync(this.blobName))); + if (fs.existsSync(filePath)) { + emitter.emit('data', Buffer.from(fs.readFileSync(filePath))); + emitter.emit('end'); } else { emitter.emit( 'error', - new Error(`The file ${this.blobName} doest not exist!`), + new Error(`The file ${filePath} does not exist !`), ); } - emitter.emit('end'); }); return Promise.resolve({ readableStreamBody: emitter, diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index e1edaa61bb..dc75a4648c 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -14,15 +14,18 @@ * limitations under the License. */ import { getVoidLogger } from '@backstage/backend-common'; -import { Entity, ENTITY_DEFAULT_NAMESPACE } from '@backstage/catalog-model'; +import { + Entity, + EntityName, + ENTITY_DEFAULT_NAMESPACE, +} from '@backstage/catalog-model'; import { ConfigReader } from '@backstage/config'; import mockFs from 'mock-fs'; import os from 'os'; import path from 'path'; import { AzureBlobStoragePublish } from './azureBlobStorage'; import { PublisherBase, TechDocsMetadata } from './types'; -import type { Entity, EntityName } from '@backstage/catalog-model'; -import type { Logger } from 'winston'; + // NOTE: /packages/techdocs-common/__mocks__ is being used to mock Azure client library const createMockEntity = (annotations = {}) => { @@ -46,6 +49,7 @@ const createMockEntityName = (): EntityName => ({ }); const rootDir = os.platform() === 'win32' ? 'C:\\rootDir' : '/rootDir'; + const getEntityRootDir = (entity: Entity) => { const { kind, @@ -170,6 +174,69 @@ describe('publishing with valid credentials', () => { expect(await publisher.hasDocsBeenGenerated(entity)).toBe(false); }); }); + + describe('fetchTechDocsMetadata', () => { + it('should return tech docs metadata', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'techdocs_metadata.json': + '{"site_name": "backstage", "site_description": "site_content"}', + }, + }); + const expectedMetadata: TechDocsMetadata = { + site_name: 'backstage', + site_description: 'site_content', + }; + expect( + await publisher.fetchTechDocsMetadata(entityNameMock), + ).toStrictEqual(expectedMetadata); + mockFs.restore(); + }); + + it('should return tech docs metadata when json encoded with single quotes', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'techdocs_metadata.json': `{'site_name': 'backstage', 'site_description': 'site_content'}`, + }, + }); + + const expectedMetadata: TechDocsMetadata = { + site_name: 'backstage', + site_description: 'site_content', + }; + expect( + await publisher.fetchTechDocsMetadata(entityNameMock), + ).toStrictEqual(expectedMetadata); + mockFs.restore(); + }); + + it('should return an error if the techdocs_metadata.json file is not present', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + await publisher + .fetchTechDocsMetadata(entityNameMock) + .catch(error => + expect(error).toEqual( + new Error( + `TechDocs metadata fetch failed, The file ${path.join( + entityRootDir, + 'techdocs_metadata.json', + )} does not exist !`, + ), + ), + ); + }); + }); }); describe('error reporting', () => { diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index 1d172bf6c9..a0f512df6e 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -201,10 +201,7 @@ export class AzureBlobStoragePublish implements PublisherBase { return; } body - .on('error', e => { - this.logger.error(e.message); - reject(e.message); - }) + .on('error', reject) .on('data', chunk => { fileStreamChunks.push(chunk); }) From abfa1606238ffac05598c27dfc7701287d5a58d1 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Mon, 22 Feb 2021 14:48:28 -0300 Subject: [PATCH 08/27] Update mock funcion uploadFile Signed-off-by: vitorgrenzel --- .../__mocks__/@azure/storage-blob.ts | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 11a034db09..0d480a7fa9 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -50,20 +50,17 @@ export class BlockBlobClient { } uploadFile(source: string): Promise { - return new Promise((resolve, reject) => { - if (!fs.existsSync(source)) { - reject(`The file ${source} does not exist`); - } else { - resolve({ - _response: { - request: { - url: `https://example.blob.core.windows.net`, - } as any, - status: 200, - headers: {} as any, - }, - }); - } + if (!fs.existsSync(source)) { + return Promise.reject(new Error(`The file ${source} does not exist`)); + } + return Promise.resolve({ + _response: { + request: { + url: `https://example.blob.core.windows.net`, + } as any, + status: 200, + headers: {} as any, + }, }); } From a21442b1cd4533458f0fd30bc61184dfc4eef6fa Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Mon, 22 Feb 2021 14:56:02 -0300 Subject: [PATCH 09/27] Update test techdocs_metadata.json file is not present Signed-off-by: vitorgrenzel --- .../stages/publish/azureBlobStorage.test.ts | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index dc75a4648c..dd94cdafde 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -223,18 +223,21 @@ describe('publishing with valid credentials', () => { const entity = createMockEntity(); const entityRootDir = getEntityRootDir(entity); - await publisher - .fetchTechDocsMetadata(entityNameMock) - .catch(error => - expect(error).toEqual( - new Error( - `TechDocs metadata fetch failed, The file ${path.join( - entityRootDir, - 'techdocs_metadata.json', - )} does not exist !`, - ), - ), - ); + let error; + try { + await publisher.fetchTechDocsMetadata(entityNameMock); + } catch (e) { + error = e; + } + + expect(error).toEqual( + new Error( + `TechDocs metadata fetch failed, The file ${path.join( + entityRootDir, + 'techdocs_metadata.json', + )} does not exist !`, + ), + ); }); }); }); From 52396fbe9dd8095a312e115d186452aed6c7f44f Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Mon, 22 Feb 2021 15:14:34 -0300 Subject: [PATCH 10/27] Update test techdocs_metadata.json file is not present Signed-off-by: vitorgrenzel --- .../src/stages/publish/azureBlobStorage.test.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index dd94cdafde..44262768a5 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -379,13 +379,16 @@ describe('error reporting', () => { it('should return an error if the techdocs_metadata.json file is not present', async () => { const entityNameMock = createMockEntityName(); - await publisher - .fetchTechDocsMetadata(entityNameMock) - .catch(error => - expect(error.message).toEqual( - expect.stringContaining('TechDocs metadata fetch'), - ), - ); + let error; + try { + await publisher.fetchTechDocsMetadata(entityNameMock); + } catch (e) { + error = e; + } + + expect(error.message).toEqual( + expect.stringContaining('TechDocs metadata fetch'), + ); }); }); }); From 27a378b8e96907b293ad1cb4ed7ff37f1aec70b9 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Wed, 3 Mar 2021 19:42:23 -0300 Subject: [PATCH 11/27] Update test fetchTechDocsMetadata Signed-off-by: vitorgrenzel --- .../src/stages/publish/azureBlobStorage.ts | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index a0f512df6e..155d14fbb5 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -217,26 +217,19 @@ export class AzureBlobStoragePublish implements PublisherBase { ): Promise { const entityRootDir = `${entityName.namespace}/${entityName.kind}/${entityName.name}`; try { - return await new Promise(async (resolve, reject) => { - try { - const techdocsMetadataJson = await this.download( - this.containerName, - `${entityRootDir}/techdocs_metadata.json`, - ); - if (!techdocsMetadataJson) { - throw new Error( - `Unable to parse the techdocs metadata file ${entityRootDir}/techdocs_metadata.json.`, - ); - } - const techdocsMetadata = JSON5.parse( - techdocsMetadataJson.toString('utf-8'), - ); - resolve(techdocsMetadata); - } catch (err) { - this.logger.error(err.message); - reject(new Error(err.message)); - } - }); + const techdocsMetadataJson = await this.download( + this.containerName, + `${entityRootDir}/techdocs_metadata.json`, + ); + if (!techdocsMetadataJson) { + throw new Error( + `Unable to parse the techdocs metadata file ${entityRootDir}/techdocs_metadata.json.`, + ); + } + const techdocsMetadata = JSON5.parse( + techdocsMetadataJson.toString('utf-8'), + ); + return techdocsMetadata; } catch (e) { throw new Error(`TechDocs metadata fetch failed, ${e.message}`); } From 29b2109669527f02312e2f911b0d914060554878 Mon Sep 17 00:00:00 2001 From: vitorgrenzel Date: Wed, 3 Mar 2021 19:56:52 -0300 Subject: [PATCH 12/27] Delete changeset Signed-off-by: vitorgrenzel --- .changeset/techdocs-improve-tests.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/techdocs-improve-tests.md diff --git a/.changeset/techdocs-improve-tests.md b/.changeset/techdocs-improve-tests.md deleted file mode 100644 index 4c8e68482f..0000000000 --- a/.changeset/techdocs-improve-tests.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/techdocs-common': patch ---- - -Improved tests fetchTechDocsMetadata to AzureBlobStorage. From 762c7c54217a8464f8b40de6c666a7125b6ca95f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 28 Feb 2021 15:22:16 +0100 Subject: [PATCH 13/27] core-api: restructure route ref types to use a symbol to determine type + deprecate more fields Signed-off-by: Patrik Oldsberg --- packages/core-api/src/app/App.tsx | 3 +- packages/core-api/src/plugin/types.ts | 3 +- packages/core-api/src/routing/RouteRef.ts | 58 +++++++++++--------- packages/core-api/src/routing/hooks.test.tsx | 3 +- packages/core-api/src/routing/hooks.tsx | 8 ++- packages/core-api/src/routing/index.ts | 7 +-- packages/core-api/src/routing/types.ts | 44 ++++++++------- 7 files changed, 69 insertions(+), 57 deletions(-) diff --git a/packages/core-api/src/app/App.tsx b/packages/core-api/src/app/App.tsx index 9ab19b5588..11635368fb 100644 --- a/packages/core-api/src/app/App.tsx +++ b/packages/core-api/src/app/App.tsx @@ -50,14 +50,13 @@ import { } from '../extensions/traversal'; import { IconComponent, IconComponentMap, IconKey } from '../icons'; import { BackstagePlugin } from '../plugin'; -import { RouteRef } from '../routing'; +import { RouteRef, ExternalRouteRef } from '../routing'; import { routeObjectCollector, routeParentCollector, routePathCollector, } from '../routing/collectors'; import { RoutingProvider, validateRoutes } from '../routing/hooks'; -import { ExternalRouteRef } from '../routing/RouteRef'; import { AppContextProvider } from './AppContext'; import { AppIdentity } from './AppIdentity'; import { AppThemeProvider } from './AppThemeProvider'; diff --git a/packages/core-api/src/plugin/types.ts b/packages/core-api/src/plugin/types.ts index 711246f1f4..c3b64d8cb6 100644 --- a/packages/core-api/src/plugin/types.ts +++ b/packages/core-api/src/plugin/types.ts @@ -15,9 +15,8 @@ */ import { ComponentType } from 'react'; -import { RouteRef } from '../routing'; +import { RouteRef, ExternalRouteRef } from '../routing'; import { AnyApiFactory } from '../apis/system'; -import { ExternalRouteRef } from '../routing/RouteRef'; export type RouteOptions = { // Whether the route path must match exactly, defaults to true. diff --git a/packages/core-api/src/routing/RouteRef.ts b/packages/core-api/src/routing/RouteRef.ts index 67ff9bc1fb..879a9c99f8 100644 --- a/packages/core-api/src/routing/RouteRef.ts +++ b/packages/core-api/src/routing/RouteRef.ts @@ -14,19 +14,31 @@ * limitations under the License. */ -import { RouteRef } from './types'; +import { RouteRef, ExternalRouteRef, routeRefType } from './types'; import { IconComponent } from '../icons'; +// TODO(Rugvip): Remove this once we get rid of the deprecated fields, it's not exported export type RouteRefConfig = { params?: Array; - /** @deprecated Route refs no longer decide their own path */ path?: string; icon?: IconComponent; title: string; }; -export class AbsoluteRouteRef { - constructor(private readonly config: RouteRefConfig) {} +class RouteRefBaseBase { + constructor(type: string, id: string) { + this.toString = () => `routeRef{type=${type},id=${id}}`; + } +} + +export class RouteRefImpl< + Params extends { [param in string]: string } +> extends RouteRefBaseBase { + readonly [routeRefType] = 'absolute'; + + constructor(private readonly config: RouteRefConfig) { + super('absolute', config.title); + } get icon() { return this.config.icon; @@ -40,10 +52,6 @@ export class AbsoluteRouteRef { get title() { return this.config.title; } - - toString() { - return `routeRef{title=${this.title}}`; - } } export function createRouteRef< @@ -58,22 +66,27 @@ export function createRouteRef< params?: ParamKey[]; /** @deprecated Route refs no longer decide their own path */ path?: string; + /** @deprecated Route refs no longer decide their own icon */ icon?: IconComponent; + /** @deprecated Route refs no longer decide their own title */ title: string; }): RouteRef { - return new AbsoluteRouteRef(config); + return new RouteRefImpl(config); } -export class ExternalRouteRef { - readonly optional: boolean; +export class ExternalRouteRefImpl< + Optional extends boolean +> extends RouteRefBaseBase { + readonly [routeRefType] = 'external'; - private constructor({ id, optional }: ExternalRouteRefOptions) { - this.toString = () => `externalRouteRef{${id}}`; - this.optional = Boolean(optional); + constructor(id: string, readonly optional: Optional) { + super('external', id); } } -export type ExternalRouteRefOptions = { +export function createExternalRouteRef< + Optional extends boolean = false +>(options: { /** * An identifier for this route, used to identify it in error messages */ @@ -86,14 +99,9 @@ export type ExternalRouteRefOptions = { * if they aren't, `useRouteRef` will return `undefined`. */ optional?: Optional; -}; - -export function createExternalRouteRef( - options: ExternalRouteRefOptions, -): ExternalRouteRef { - return new ((ExternalRouteRef as unknown) as { - new (options: ExternalRouteRefOptions): ExternalRouteRef< - Optional - >; - })(options); +}): ExternalRouteRef { + return new ExternalRouteRefImpl( + options.id, + Boolean(options.optional) as Optional, + ); } diff --git a/packages/core-api/src/routing/hooks.test.tsx b/packages/core-api/src/routing/hooks.test.tsx index 94cd3a704d..cfb7a5c68a 100644 --- a/packages/core-api/src/routing/hooks.test.tsx +++ b/packages/core-api/src/routing/hooks.test.tsx @@ -38,10 +38,9 @@ import { import { createRouteRef, createExternalRouteRef, - ExternalRouteRef, RouteRefConfig, } from './RouteRef'; -import { AnyRouteRef, RouteRef } from './types'; +import { AnyRouteRef, RouteRef, ExternalRouteRef } from './types'; const mockConfig = (extra?: Partial>) => ({ path: '/unused', diff --git a/packages/core-api/src/routing/hooks.tsx b/packages/core-api/src/routing/hooks.tsx index 54490fb4f2..d9bbef438e 100644 --- a/packages/core-api/src/routing/hooks.tsx +++ b/packages/core-api/src/routing/hooks.tsx @@ -15,9 +15,13 @@ */ import React, { createContext, ReactNode, useContext, useMemo } from 'react'; -import { AnyRouteRef, BackstageRouteObject, RouteRef } from './types'; +import { + AnyRouteRef, + BackstageRouteObject, + RouteRef, + ExternalRouteRef, +} from './types'; import { generatePath, matchRoutes, useLocation } from 'react-router-dom'; -import { ExternalRouteRef } from './RouteRef'; // The extra TS magic here is to require a single params argument if the RouteRef // had at least one param defined, but require 0 arguments if there are no params defined. diff --git a/packages/core-api/src/routing/index.ts b/packages/core-api/src/routing/index.ts index 100158c3c5..2a0685f583 100644 --- a/packages/core-api/src/routing/index.ts +++ b/packages/core-api/src/routing/index.ts @@ -19,12 +19,9 @@ export type { AbsoluteRouteRef, ConcreteRoute, MutableRouteRef, + ExternalRouteRef, } from './types'; export { FlatRoutes } from './FlatRoutes'; -export { - createRouteRef, - createExternalRouteRef, - ExternalRouteRef, -} from './RouteRef'; +export { createRouteRef, createExternalRouteRef } from './RouteRef'; export type { RouteRefConfig } from './RouteRef'; export { useRouteRef } from './hooks'; diff --git a/packages/core-api/src/routing/types.ts b/packages/core-api/src/routing/types.ts index b21fa38052..1b2cea3465 100644 --- a/packages/core-api/src/routing/types.ts +++ b/packages/core-api/src/routing/types.ts @@ -15,35 +15,41 @@ */ import { IconComponent } from '../icons'; -import { ExternalRouteRef } from './RouteRef'; +import { getGlobalSingleton } from '../lib/globalObject'; -// @ts-ignore, we're just embedding the Params type for usage in other places -export type RouteRef = { - // TODO(Rugvip): Remove path, look up via registry instead +export const routeRefType: unique symbol = getGlobalSingleton( + 'route-ref-type', + () => Symbol('route-ref-type'), +); + +export type RouteRef = { + [routeRefType]: 'absolute'; + + params?: keyof Params; + + // TODO(Rugvip): Remove all of these once plugins don't rely on the path /** @deprecated paths are no longer accessed directly from RouteRefs, use useRouteRef instead */ path: string; + /** @deprecated icons are no longer accessed via RouteRefs */ icon?: IconComponent; - title: string; + /** @deprecated titles are no longer accessed via RouteRefs */ + title?: string; +}; + +export type ExternalRouteRef = { + [routeRefType]: 'external'; + + optional?: Optional; }; export type AnyRouteRef = RouteRef | ExternalRouteRef; -/** - * This type should not be used - * @deprecated - */ +// TODO(Rugvip): None of these should be found in the wild anymore, remove in next minor release +/** @deprecated */ export type ConcreteRoute = {}; - -/** - * This type should not be used, use RouteRef instead - * @deprecated - */ +/** @deprecated */ export type AbsoluteRouteRef = RouteRef<{}>; - -/** - * This type should not be used, use RouteRef instead - * @deprecated - */ +/** @deprecated */ export type MutableRouteRef = RouteRef<{}>; // A duplicate of the react-router RouteObject, but with routeRef added From 61e5bdb133d946b75f469fd43209a346bd2cd68d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 3 Mar 2021 22:30:00 +0100 Subject: [PATCH 14/27] core-api: add support for external route ref parameters and refactor route ref parameter types Signed-off-by: Patrik Oldsberg --- packages/core-api/src/app/App.test.tsx | 128 +++++++++++++------ packages/core-api/src/app/App.tsx | 3 +- packages/core-api/src/app/types.ts | 52 +++----- packages/core-api/src/routing/RouteRef.ts | 52 ++++++-- packages/core-api/src/routing/hooks.test.tsx | 13 +- packages/core-api/src/routing/hooks.tsx | 23 ++-- packages/core-api/src/routing/types.ts | 18 ++- 7 files changed, 189 insertions(+), 100 deletions(-) diff --git a/packages/core-api/src/app/App.test.tsx b/packages/core-api/src/app/App.test.tsx index 5ceb123b06..b9fdf05444 100644 --- a/packages/core-api/src/app/App.test.tsx +++ b/packages/core-api/src/app/App.test.tsx @@ -50,23 +50,30 @@ describe('generateBoundRoutes', () => { describe('Integration Test', () => { const plugin1RouteRef = createRouteRef({ path: '/blah1', title: '' }); - const plugin2RouteRef = createRouteRef({ path: '/blah2', title: '' }); - const externalRouteRef = createExternalRouteRef({ id: '3' }); - const optionalBarExternalRouteRef = createExternalRouteRef({ - id: 'bar', + const plugin2RouteRef = createRouteRef({ + path: '/blah2', + title: '', + params: ['x'], + }); + const err = createExternalRouteRef({ id: 'err' }); + const errParams = createExternalRouteRef({ id: 'errParams', params: ['x'] }); + const errOptional = createExternalRouteRef({ + id: 'errOptional', optional: true, }); - const optionalBazExternalRouteRef = createExternalRouteRef({ - id: 'baz', + const errParamsOptional = createExternalRouteRef({ + id: 'errParamsOptional', optional: true, + params: ['x'], }); const plugin1 = createPlugin({ id: 'blob', externalRoutes: { - foo: externalRouteRef, - bar: optionalBarExternalRouteRef, - baz: optionalBazExternalRouteRef, + err, + errParams, + errOptional, + errParamsOptional, }, }); @@ -85,14 +92,19 @@ describe('Integration Test', () => { createRoutableExtension({ component: () => Promise.resolve((_: PropsWithChildren<{ path?: string }>) => { - // eslint-disable-next-line react-hooks/rules-of-hooks - const externalLink = useRouteRef(externalRouteRef); - const barLink = useRouteRef(optionalBarExternalRouteRef); - const bazLink = useRouteRef(optionalBazExternalRouteRef); + const errLink = useRouteRef(err); + const errParamsLink = useRouteRef(errParams); + const errOptionalLink = useRouteRef(errOptional); + const errParamsOptionalLink = useRouteRef(errParamsOptional); return (
- Our routes are: {externalLink()}, bar: {barLink?.() ?? 'none'}, - baz: {bazLink?.() ?? 'none'} + err: {errLink()} + errParams: {errParamsLink({ x: 'a' })} + errOptional: {errOptionalLink?.() ?? ''} + + errParamsOptional:{' '} + {errParamsOptionalLink?.({ x: 'b' }) ?? ''} +
); }), @@ -100,14 +112,14 @@ describe('Integration Test', () => { }), ); - it('runs happy paths', async () => { - const components = { - NotFoundErrorPage: () => null, - BootErrorPage: () => null, - Progress: () => null, - Router: BrowserRouter, - }; + const components = { + NotFoundErrorPage: () => null, + BootErrorPage: () => null, + Progress: () => null, + Router: BrowserRouter, + }; + it('runs happy paths', async () => { const app = new PrivateAppImpl({ apis: [], defaultApis: [], @@ -124,8 +136,10 @@ describe('Integration Test', () => { components, bindRoutes: ({ bind }) => { bind(plugin1.externalRoutes, { - foo: plugin2RouteRef, - bar: plugin2RouteRef, + err: plugin1RouteRef, + errParams: plugin2RouteRef, + errOptional: plugin1RouteRef, + errParamsOptional: plugin2RouteRef, }); }, }); @@ -138,25 +152,19 @@ describe('Integration Test', () => { - + , ); - expect( - screen.getByText('Our routes are: /foo/bar, bar: /foo/bar, baz: none'), - ).toBeInTheDocument(); + expect(screen.getByText('err: /')).toBeInTheDocument(); + expect(screen.getByText('errParams: /foo')).toBeInTheDocument(); + expect(screen.getByText('errOptional: /')).toBeInTheDocument(); + expect(screen.getByText('errParamsOptional: /foo')).toBeInTheDocument(); }); - it('should throw some error when the route has duplicate params', () => { - const components = { - NotFoundErrorPage: () => null, - BootErrorPage: () => null, - Progress: () => null, - Router: BrowserRouter, - }; - + it('runs happy paths without optional routes', async () => { const app = new PrivateAppImpl({ apis: [], defaultApis: [], @@ -172,7 +180,53 @@ describe('Integration Test', () => { plugins: [], components, bindRoutes: ({ bind }) => { - bind(plugin1.externalRoutes, { foo: plugin2RouteRef }); + bind(plugin1.externalRoutes, { + err: plugin1RouteRef, + errParams: plugin2RouteRef, + }); + }, + }); + + const Provider = app.getProvider(); + const Router = app.getRouter(); + + await renderWithEffects( + + + + + + + + , + ); + + expect(screen.getByText('err: /')).toBeInTheDocument(); + expect(screen.getByText('errParams: /foo')).toBeInTheDocument(); + expect(screen.getByText('errOptional: ')).toBeInTheDocument(); + expect(screen.getByText('errParamsOptional: ')).toBeInTheDocument(); + }); + + it('should throw some error when the route has duplicate params', () => { + const app = new PrivateAppImpl({ + apis: [], + defaultApis: [], + themes: [ + { + id: 'light', + title: 'Light Theme', + variant: 'light', + theme: lightTheme, + }, + ], + icons: defaultSystemIcons, + plugins: [], + components, + bindRoutes: ({ bind }) => { + bind(plugin1.externalRoutes, { + err: plugin1RouteRef, + errParams: plugin2RouteRef, + }); }, }); diff --git a/packages/core-api/src/app/App.tsx b/packages/core-api/src/app/App.tsx index 11635368fb..3c58930709 100644 --- a/packages/core-api/src/app/App.tsx +++ b/packages/core-api/src/app/App.tsx @@ -50,6 +50,7 @@ import { } from '../extensions/traversal'; import { IconComponent, IconComponentMap, IconKey } from '../icons'; import { BackstagePlugin } from '../plugin'; +import { AnyRoutes } from '../plugin/types'; import { RouteRef, ExternalRouteRef } from '../routing'; import { routeObjectCollector, @@ -77,7 +78,7 @@ export function generateBoundRoutes( const result = new Map(); if (bindRoutes) { - const bind: AppRouteBinder = (externalRoutes, targetRoutes) => { + const bind: AppRouteBinder = (externalRoutes, targetRoutes: AnyRoutes) => { for (const [key, value] of Object.entries(targetRoutes)) { const externalRoute = externalRoutes[key]; if (!externalRoute) { diff --git a/packages/core-api/src/app/types.ts b/packages/core-api/src/app/types.ts index 701862601d..df4180c6e4 100644 --- a/packages/core-api/src/app/types.ts +++ b/packages/core-api/src/app/types.ts @@ -16,7 +16,7 @@ import { ComponentType } from 'react'; import { IconComponent, IconComponentMap, IconKey } from '../icons'; -import { BackstagePlugin } from '../plugin/types'; +import { AnyExternalRoutes, BackstagePlugin } from '../plugin/types'; import { ExternalRouteRef, RouteRef } from '../routing'; import { AnyApiFactory } from '../apis'; import { AppTheme, ProfileInfo } from '../apis/definitions'; @@ -79,49 +79,39 @@ export type AppComponents = { */ export type AppConfigLoader = () => Promise; -/** - * Extracts the Optional type of a map of ExternalRouteRefs, leaving only the boolean in place as value - */ -type ExternalRouteRefsToOptionalMap< - T extends { [name in string]: ExternalRouteRef } -> = { - [name in keyof T]: T[name] extends ExternalRouteRef ? U : never; -}; - /** * Extracts a union of the keys in a map whose value extends the given type */ -type ExtractKeysWithType = { +type KeysWithType = { [key in keyof Obj]: Obj[key] extends Type ? key : never; }[keyof Obj]; /** - * Given a map of boolean values denoting whether a route is optional, create a - * map of needed RouteRefs. - * - * For example { foo: false, bar: true } gives { foo: RouteRef, bar?: RouteRef } + * Takes a map Map required values and makes all keys matching Keys optional */ -type CombineOptionalAndRequiredRoutes< - OptionalMap extends { [key in string]: boolean } -> = { - [name in ExtractKeysWithType]: RouteRef; -} & - { [name in keyof OptionalMap]?: RouteRef }; +type PartialKeys< + Map extends { [name in string]: any }, + Keys extends keyof Map +> = Partial> & Required>; /** - * Creates a map of required target routes based on whether the input external - * routes are optional or not. The external routes that are marked as optional - * will also be optional in the target routes map. + * Creates a map of target routes with matching parameters based on a map of external routes. */ -type TargetRoutesMap< - T extends { [name in string]: ExternalRouteRef } -> = CombineOptionalAndRequiredRoutes>; +type TargetRouteMap = { + [name in keyof ExternalRoutes]: ExternalRoutes[name] extends ExternalRouteRef< + infer Params, + any + > + ? RouteRef + : never; +}; -export type AppRouteBinder = < - ExternalRoutes extends { [name in string]: ExternalRouteRef } ->( +export type AppRouteBinder = ( externalRoutes: ExternalRoutes, - targetRoutes: TargetRoutesMap, + targetRoutes: PartialKeys< + TargetRouteMap, + KeysWithType> + >, ) => void; export type AppOptions = { diff --git a/packages/core-api/src/routing/RouteRef.ts b/packages/core-api/src/routing/RouteRef.ts index 879a9c99f8..d218d72fbb 100644 --- a/packages/core-api/src/routing/RouteRef.ts +++ b/packages/core-api/src/routing/RouteRef.ts @@ -14,12 +14,18 @@ * limitations under the License. */ -import { RouteRef, ExternalRouteRef, routeRefType } from './types'; +import { + RouteRef, + ExternalRouteRef, + routeRefType, + AnyParams, + ParamKeys, +} from './types'; import { IconComponent } from '../icons'; // TODO(Rugvip): Remove this once we get rid of the deprecated fields, it's not exported -export type RouteRefConfig = { - params?: Array; +export type RouteRefConfig = { + params?: ParamKeys; path?: string; icon?: IconComponent; title: string; @@ -31,15 +37,17 @@ class RouteRefBaseBase { } } -export class RouteRefImpl< - Params extends { [param in string]: string } -> extends RouteRefBaseBase { +export class RouteRefImpl extends RouteRefBaseBase { readonly [routeRefType] = 'absolute'; constructor(private readonly config: RouteRefConfig) { super('absolute', config.title); } + get params(): ParamKeys { + return this.config.params as any; + } + get icon() { return this.config.icon; } @@ -54,6 +62,10 @@ export class RouteRefImpl< } } +type OptionalParams< + Params extends { [param in string]: string } +> = Params[keyof Params] extends never ? undefined : Params; + export function createRouteRef< // Params is the type that we care about and the one to be embedded in the route ref. // For example, given the params ['name', 'kind'], Params will be {name: string, kind: string} @@ -70,28 +82,43 @@ export function createRouteRef< icon?: IconComponent; /** @deprecated Route refs no longer decide their own title */ title: string; -}): RouteRef { - return new RouteRefImpl(config); +}): RouteRef> { + return new RouteRefImpl>({ + ...config, + params: (config.params ?? []) as ParamKeys>, + }); } export class ExternalRouteRefImpl< + Params extends AnyParams, Optional extends boolean > extends RouteRefBaseBase { readonly [routeRefType] = 'external'; - constructor(id: string, readonly optional: Optional) { + constructor( + id: string, + readonly params: ParamKeys, + readonly optional: Optional, + ) { super('external', id); } } export function createExternalRouteRef< - Optional extends boolean = false + Params extends { [param in ParamKey]: string }, + Optional extends boolean = false, + ParamKey extends string = never >(options: { /** * An identifier for this route, used to identify it in error messages */ id: string; + /** + * The parameters that will be provided to the external route reference. + */ + params?: ParamKey[]; + /** * Whether or not this route is optional, defaults to false. * @@ -99,9 +126,10 @@ export function createExternalRouteRef< * if they aren't, `useRouteRef` will return `undefined`. */ optional?: Optional; -}): ExternalRouteRef { - return new ExternalRouteRefImpl( +}): ExternalRouteRef, Optional> { + return new ExternalRouteRefImpl, Optional>( options.id, + (options.params ?? []) as ParamKeys>, Boolean(options.optional) as Optional, ); } diff --git a/packages/core-api/src/routing/hooks.test.tsx b/packages/core-api/src/routing/hooks.test.tsx index cfb7a5c68a..0ada37b18d 100644 --- a/packages/core-api/src/routing/hooks.test.tsx +++ b/packages/core-api/src/routing/hooks.test.tsx @@ -57,12 +57,19 @@ const ref1 = createRouteRef(mockConfig({ path: '/wat1' })); const ref2 = createRouteRef(mockConfig({ path: '/wat2' })); const ref3 = createRouteRef(mockConfig({ path: '/wat3' })); const ref4 = createRouteRef(mockConfig({ path: '/wat4' })); -const ref5 = createRouteRef(mockConfig({ path: '/wat5' })); +const ref5 = createRouteRef({ + ...mockConfig({ path: '/wat5' }), + params: ['x'], +}); const eRefA = createExternalRouteRef({ id: '1' }); const eRefB = createExternalRouteRef({ id: '2' }); -const eRefC = createExternalRouteRef({ id: '3' }); +const eRefC = createExternalRouteRef({ id: '3', params: ['y'] }); const eRefD = createExternalRouteRef({ id: '4', optional: true }); -const eRefE = createExternalRouteRef({ id: '5', optional: true }); +const eRefE = createExternalRouteRef({ + id: '5', + optional: true, + params: ['z'], +}); const MockRouteSource = (props: { path?: string; diff --git a/packages/core-api/src/routing/hooks.tsx b/packages/core-api/src/routing/hooks.tsx index d9bbef438e..4d419485f6 100644 --- a/packages/core-api/src/routing/hooks.tsx +++ b/packages/core-api/src/routing/hooks.tsx @@ -20,6 +20,7 @@ import { BackstageRouteObject, RouteRef, ExternalRouteRef, + AnyParams, } from './types'; import { generatePath, matchRoutes, useLocation } from 'react-router-dom'; @@ -28,10 +29,8 @@ import { generatePath, matchRoutes, useLocation } from 'react-router-dom'; // Without this we'd have to pass in empty object to all parameter-less RouteRefs // just to make TypeScript happy, or we would have to make the argument optional in // which case you might forget to pass it in when it is actually required. -export type RouteFunc = ( - ...[params]: Params[keyof Params] extends never - ? readonly [] - : readonly [Params] +export type RouteFunc = ( + ...[params]: Params extends undefined ? readonly [] : readonly [Params] ) => string; class RouteResolver { @@ -42,8 +41,8 @@ class RouteResolver { private readonly routeBindings: Map, ) {} - resolve( - routeRefOrExternalRouteRef: RouteRef | ExternalRouteRef, + resolve( + routeRefOrExternalRouteRef: RouteRef | ExternalRouteRef, sourceLocation: ReturnType, ): RouteFunc | undefined { const routeRef = @@ -116,14 +115,14 @@ class RouteResolver { const RoutingContext = createContext(undefined); -export function useRouteRef( - routeRef: ExternalRouteRef, -): Optional extends true ? RouteFunc<{}> | undefined : RouteFunc<{}>; -export function useRouteRef( +export function useRouteRef( + routeRef: ExternalRouteRef, +): Optional extends true ? RouteFunc | undefined : RouteFunc; +export function useRouteRef( routeRef: RouteRef, ): RouteFunc; -export function useRouteRef( - routeRef: RouteRef | ExternalRouteRef, +export function useRouteRef( + routeRef: RouteRef | ExternalRouteRef, ): RouteFunc | undefined { const sourceLocation = useLocation(); const resolver = useContext(RoutingContext); diff --git a/packages/core-api/src/routing/types.ts b/packages/core-api/src/routing/types.ts index 1b2cea3465..de6f991ec9 100644 --- a/packages/core-api/src/routing/types.ts +++ b/packages/core-api/src/routing/types.ts @@ -17,15 +17,20 @@ import { IconComponent } from '../icons'; import { getGlobalSingleton } from '../lib/globalObject'; +export type AnyParams = { [param in string]: string } | undefined; +export type ParamKeys = keyof Params extends never + ? [] + : (keyof Params)[]; + export const routeRefType: unique symbol = getGlobalSingleton( 'route-ref-type', () => Symbol('route-ref-type'), ); -export type RouteRef = { +export type RouteRef = { [routeRefType]: 'absolute'; - params?: keyof Params; + params: ParamKeys; // TODO(Rugvip): Remove all of these once plugins don't rely on the path /** @deprecated paths are no longer accessed directly from RouteRefs, use useRouteRef instead */ @@ -36,13 +41,18 @@ export type RouteRef = { title?: string; }; -export type ExternalRouteRef = { +export type ExternalRouteRef< + Params extends AnyParams = any, + Optional extends boolean = any +> = { [routeRefType]: 'external'; + params: ParamKeys; + optional?: Optional; }; -export type AnyRouteRef = RouteRef | ExternalRouteRef; +export type AnyRouteRef = RouteRef | ExternalRouteRef; // TODO(Rugvip): None of these should be found in the wild anymore, remove in next minor release /** @deprecated */ From 964e43c023baca1e77639f4f5d6556216c5e7a15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Mar 2021 04:22:06 +0000 Subject: [PATCH 15/27] chore(deps): bump swagger-ui-react from 3.38.0 to 3.44.0 Bumps [swagger-ui-react](https://github.com/swagger-api/swagger-ui) from 3.38.0 to 3.44.0. - [Release notes](https://github.com/swagger-api/swagger-ui/releases) - [Commits](https://github.com/swagger-api/swagger-ui/compare/v3.38.0...v3.44.0) Signed-off-by: dependabot[bot] --- yarn.lock | 138 +++++++++++++++++++++++++++--------------------------- 1 file changed, 70 insertions(+), 68 deletions(-) diff --git a/yarn.lock b/yarn.lock index 783debcf8c..67b3cbf519 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1662,10 +1662,10 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.11.2": - version "7.12.5" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" - integrity sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ== +"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.11.2", "@babel/runtime-corejs3@^7.13.6": + version "7.13.9" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.9.tgz#b2fa9a6e5690ef8d4c4f2d30cac3ec1a8bb633ce" + integrity sha512-p6WSr71+5u/VBf1KDS/Y4dK3ZwbV+DD6wQO3X2EbUVluEOiyXUk09DzcwSaUH4WomYXrEPC+i2rqzuthhZhOJw== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" @@ -8523,7 +8523,7 @@ base64-arraybuffer@^0.2.0: resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz#4b944fac0191aa5907afe2d8c999ccc57ce80f45" integrity sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ== -base64-js@^1.0.2, base64-js@^1.2.0, base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -11540,10 +11540,10 @@ domhandler@^4.0.0: dependencies: domelementtype "^2.1.0" -dompurify@^2.0.12, dompurify@^2.1.1, dompurify@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.2.3.tgz#ec653ba521b39f397c2ca045769438d593ea8a9f" - integrity sha512-8Hv7Q0FuwD9rWoB6qI2eZsfKbGXfoUVuGHHrE15vgk4ReOKwOkSgbqb2OMFtc0d5besOEkoLkcyuV10zQ2X5gw== +dompurify@^2.0.12, dompurify@^2.1.1, dompurify@^2.2.6: + version "2.2.6" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.2.6.tgz#54945dc5c0b45ce5ae228705777e8e59d7b2edc4" + integrity sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ== domutils@1.5.1: version "1.5.1" @@ -11988,7 +11988,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.53" resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== @@ -12024,7 +12024,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -es6-weak-map@^2.0.2: +es6-weak-map@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== @@ -14726,7 +14726,7 @@ ieee754@1.1.13: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: +ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -14995,7 +14995,7 @@ interpret@^2.0.0, interpret@^2.2.0: resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -invariant@^2.0.0, invariant@^2.2.3, invariant@^2.2.4: +invariant@^2.0.0, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -15422,7 +15422,7 @@ is-promise@4.0.0: resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== -is-promise@^2.1, is-promise@^2.1.0: +is-promise@^2.1.0, is-promise@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== @@ -16204,7 +16204,7 @@ js-cookie@^2.2.1: resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-file-download@^0.4.1: +js-file-download@^0.4.12: version "0.4.12" resolved "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821" integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg== @@ -17294,10 +17294,10 @@ lodash@4.17.15: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@~4.17.20, lodash@~4.17.4: - version "4.17.20" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, 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.2.1, lodash@~4.17.20, lodash@~4.17.4: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^1.0.2: version "1.0.2" @@ -17442,7 +17442,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-queue@0.1: +lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= @@ -17733,19 +17733,19 @@ memoize-one@^5.1.1: resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== -memoizee@^0.4.12: - version "0.4.14" - resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== +memoizee@^0.4.15: + version "0.4.15" + resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" memoizerific@^1.11.3: version "1.11.3" @@ -18478,7 +18478,7 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: resolved "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== -next-tick@1: +next-tick@1, next-tick@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== @@ -21175,18 +21175,18 @@ react-color@^2.17.0: reactcss "^1.2.0" tinycolor2 "^1.4.1" -react-copy-to-clipboard@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz#8eae107bb400be73132ed3b6a7b4fb156090208e" - integrity sha512-ELKq31/E3zjFs5rDWNCfFL4NvNFQvGRoJdAKReD/rUPA+xxiLPQmZBZBvy2vgH7V0GE9isIQpT9WXbwIVErYdA== +react-copy-to-clipboard@5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz#2a0623b1115a1d8c84144e9434d3342b5af41ab4" + integrity sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw== dependencies: copy-to-clipboard "^3" prop-types "^15.5.8" -react-debounce-input@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.2.tgz#d2cc99c1ce47fae89037965f5699edc1b0317197" - integrity sha512-RIBu68Cq/gImKz/2h1cE042REDqyqj3D+7SJ3lnnIpJX0ht9D9PfH7KAnL+SgDz6hvKa9pZS2CnAxlkrLmnQlg== +react-debounce-input@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.3.tgz#9e8c69771a621c81e8fe36b45ade49a95059cd87" + integrity sha512-7Bfjm9sxrtgB+IsSrdXoo4CVqKg7CbWC68dNhr8q7ZmY6C0AqtR524//SenHQWT+eeSG9DmSLWNWCUFSyaaWSQ== dependencies: lodash.debounce "^4" prop-types "^15.7.2" @@ -21336,10 +21336,12 @@ react-hotkeys@2.0.0: dependencies: prop-types "^15.6.1" -react-immutable-proptypes@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz#023d6f39bb15c97c071e9e60d00d136eac5fa0b4" - integrity sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ= +react-immutable-proptypes@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz#cce96d68cc3c18e89617cbf3092d08e35126af4a" + integrity sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ== + dependencies: + invariant "^2.2.2" react-immutable-pure-component@^1.1.1: version "1.2.3" @@ -23994,10 +23996,10 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -swagger-client@^3.12.1: - version "3.12.1" - resolved "https://registry.npmjs.org/swagger-client/-/swagger-client-3.12.1.tgz#bbe4521c0f662e72ad84fa9dbe3eb42c9960d901" - integrity sha512-jxhf7yvMq1SIlaMBlL0S+2mk5eovdYNzVAn1Ewrpe1pkby2pm5PnnP8XiSImCuX7d+BxUfVFkOgCTeK38+fBlA== +swagger-client@^3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/swagger-client/-/swagger-client-3.13.1.tgz#d2531ede4a498911aa084384e387e5008e7b6a70" + integrity sha512-Hmy4+wVVa3kveWzC7PIeUwiAY5qcYbm4XlC4uZ7e5kAePfB2cprXImiqrZHIzL+ndU0YTN7I+9w/ZayTisn3Jg== dependencies: "@babel/runtime-corejs3" "^7.11.2" btoa "^1.2.1" @@ -24015,30 +24017,30 @@ swagger-client@^3.12.1: url "~0.11.0" swagger-ui-react@^3.37.2: - version "3.38.0" - resolved "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-3.38.0.tgz#eebe7f03ba18e2b12cf921319da868729aadd3df" - integrity sha512-jkTRzKEWhilsHexZw1t9JvrDAInaGK9o1rF9EOXYqlb6wXeFVn5kK11eP6RhTRbYW6gM+unY2y10KV3dNbV5Mw== + version "3.44.0" + resolved "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-3.44.0.tgz#4b553d7af46b45efa3bf96a53a05c58ed3b6e34e" + integrity sha512-+OMrm/D/V51XUPdh97RCUFCnomH4wJzR50NdE2ho6ZM0M+EsNaYzPmNLoeEhBupNHbL20NO6buSiVA99B4DjRg== dependencies: - "@babel/runtime-corejs3" "^7.11.2" + "@babel/runtime-corejs3" "^7.13.6" "@braintree/sanitize-url" "^5.0.0" "@kyleshockey/object-assign-deep" "^0.4.2" "@kyleshockey/xml" "^1.0.2" - base64-js "^1.2.0" + base64-js "^1.5.1" classnames "^2.2.6" css.escape "1.5.1" deep-extend "0.6.0" - dompurify "^2.2.3" - ieee754 "^1.1.13" + dompurify "^2.2.6" + ieee754 "^1.2.1" immutable "^3.x.x" - js-file-download "^0.4.1" + js-file-download "^0.4.12" js-yaml "^3.13.1" - lodash "^4.17.19" - memoizee "^0.4.12" + lodash "^4.17.21" + memoizee "^0.4.15" prop-types "^15.7.2" randombytes "^2.1.0" - react-copy-to-clipboard "5.0.1" - react-debounce-input "^3.2.0" - react-immutable-proptypes "2.1.0" + react-copy-to-clipboard "5.0.3" + react-debounce-input "^3.2.3" + react-immutable-proptypes "2.2.0" react-immutable-pure-component "^1.1.1" react-inspector "^2.3.0" react-motion "^0.5.2" @@ -24050,8 +24052,8 @@ swagger-ui-react@^3.37.2: reselect "^4.0.0" serialize-error "^2.1.0" sha.js "^2.4.11" - swagger-client "^3.12.1" - url-parse "^1.4.7" + swagger-client "^3.13.1" + url-parse "^1.5.1" xml-but-prettier "^1.0.1" zenscroll "^4.0.2" @@ -24382,7 +24384,7 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -timers-ext@^0.1.5: +timers-ext@^0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== @@ -25209,10 +25211,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.4.7: - version "1.4.7" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-parse@^1.4.3, url-parse@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" From 61e6baafbcdadda0be507f7690b9246bac9bb6a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Mar 2021 04:25:11 +0000 Subject: [PATCH 16/27] chore(deps-dev): bump start-server-and-test from 1.11.2 to 1.12.0 Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.11.2 to 1.12.0. - [Release notes](https://github.com/bahmutov/start-server-and-test/releases) - [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.11.2...v1.12.0) Signed-off-by: dependabot[bot] --- yarn.lock | 117 ++++++++++++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 69 deletions(-) diff --git a/yarn.lock b/yarn.lock index 783debcf8c..6380e41b6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2824,39 +2824,11 @@ is-promise "4.0.0" tslib "~2.0.1" -"@hapi/address@^4.0.1": - version "4.1.0" - resolved "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d" - integrity sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@hapi/formula@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128" - integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A== - "@hapi/hoek@^9.0.0": version "9.0.4" resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz#e80ad4e8e8d2adc6c77d985f698447e8628b6010" integrity sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw== -"@hapi/joi@^17.1.1": - version "17.1.1" - resolved "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz#9cc8d7e2c2213d1e46708c6260184b447c661350" - integrity sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg== - dependencies: - "@hapi/address" "^4.0.1" - "@hapi/formula" "^2.0.0" - "@hapi/hoek" "^9.0.0" - "@hapi/pinpoint" "^2.0.0" - "@hapi/topo" "^5.0.0" - -"@hapi/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz#805b40d4dbec04fc116a73089494e00f073de8df" - integrity sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw== - "@hapi/topo@^5.0.0": version "5.0.0" resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" @@ -4481,6 +4453,23 @@ dependencies: any-observable "^0.3.0" +"@sideway/address@^4.1.0": + version "4.1.1" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz#9e321e74310963fdf8eebfbee09c7bd69972de4d" + integrity sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -8074,13 +8063,6 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axios@^0.19.2: - version "0.19.2" - resolved "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== - dependencies: - follow-redirects "1.5.10" - axios@^0.20.0: version "0.20.0" resolved "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz#057ba30f04884694993a8cd07fa394cff11c50bd" @@ -10999,20 +10981,6 @@ debug@4, debug@4.3.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, de dependencies: ms "2.1.2" -debug@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -13125,13 +13093,6 @@ fn-name@~3.0.0: resolved "https://registry.npmjs.org/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c" integrity sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA== -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - follow-redirects@^1.0.0, follow-redirects@^1.10.0: version "1.13.0" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" @@ -16180,6 +16141,17 @@ jmespath@0.15.0: resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= +joi@^17.3.0: + version "17.4.0" + resolved "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" + integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.0" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + jose@^1.27.1: version "1.28.0" resolved "https://registry.npmjs.org/jose/-/jose-1.28.0.tgz#0803f8c71f43cd293a9d931c555c30531f5ca5dc" @@ -22593,6 +22565,13 @@ rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@^6.5.5, rxjs@^6.6.0: dependencies: tslib "^1.9.0" +rxjs@^6.6.3: + version "6.6.6" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" + integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -23483,17 +23462,17 @@ stacktrace-js@^2.0.0: stacktrace-gps "^3.0.4" start-server-and-test@^1.10.11: - version "1.11.2" - resolved "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.11.2.tgz#9144b7b6f25197148f159f261ae80119afbb17d5" - integrity sha512-rk1zS5WQvdbc8slE5hPtzfji1dFSnBAfm+vSjToZNrBvozHJvuAG80xE5u8N4tQjg3Ej1Crjc19J++r28HGJgg== + version "1.12.0" + resolved "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.12.0.tgz#e836553c928a13026f79c740757d378b92bee8d6" + integrity sha512-y3M/PLUPkPBsgKoengMIMQeceT8uOnOc4bkdor/RSCK9Ih/j8z4WthSCrAboXLjgtJJWOporAiEQsnYox+THXg== dependencies: bluebird "3.7.2" check-more-types "2.24.0" - debug "4.1.1" + debug "4.3.1" execa "3.4.0" lazy-ass "1.6.0" ps-tree "1.2.0" - wait-on "5.1.0" + wait-on "5.2.1" start-server-webpack-plugin@^2.2.5: version "2.2.5" @@ -25496,16 +25475,16 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-on@5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-5.1.0.tgz#b697f21c6fea0908b9c7ad6ed56ace4736768b66" - integrity sha512-JM0kgaE+V0nCDvSl72iM05W8NDt2E2M56WC5mzR7M+T+k6xjt2yYpyom+xA8RasSunFGzbxIpAXbVzXqtweAnA== +wait-on@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-5.2.1.tgz#05b66fcb4d7f5da01537f03e7cf96e8836422996" + integrity sha512-H2F986kNWMU9hKlI9l/ppO6tN8ZSJd35yBljMLa1/vjzWP++Qh6aXyt77/u7ySJFZQqBtQxnvm/xgG48AObXcw== dependencies: - "@hapi/joi" "^17.1.1" - axios "^0.19.2" - lodash "^4.17.19" + axios "^0.21.1" + joi "^17.3.0" + lodash "^4.17.20" minimist "^1.2.5" - rxjs "^6.5.5" + rxjs "^6.6.3" walker@^1.0.7, walker@~1.0.5: version "1.0.7" From a50989489a97b7490d49a9cc5f86f30ac09d5290 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Mar 2021 04:29:20 +0000 Subject: [PATCH 17/27] chore(deps): bump @roadiehq/backstage-plugin-travis-ci Bumps [@roadiehq/backstage-plugin-travis-ci](https://github.com/RoadieHQ/backstage-plugin-travis-ci) from 0.2.8 to 0.4.5. - [Release notes](https://github.com/RoadieHQ/backstage-plugin-travis-ci/releases) - [Commits](https://github.com/RoadieHQ/backstage-plugin-travis-ci/commits) Signed-off-by: dependabot[bot] --- packages/app/package.json | 2 +- yarn.lock | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index d9b9a32c0a..8756a09f7f 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -41,7 +41,7 @@ "@roadiehq/backstage-plugin-buildkite": "^0.1.3", "@roadiehq/backstage-plugin-github-insights": "^0.2.16", "@roadiehq/backstage-plugin-github-pull-requests": "^0.7.6", - "@roadiehq/backstage-plugin-travis-ci": "^0.2.8", + "@roadiehq/backstage-plugin-travis-ci": "^0.4.5", "history": "^5.0.0", "prop-types": "^15.7.2", "react": "^16.12.0", diff --git a/yarn.lock b/yarn.lock index 783debcf8c..8269495680 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4393,25 +4393,24 @@ react-router "6.0.0-beta.0" react-use "^15.3.6" -"@roadiehq/backstage-plugin-travis-ci@^0.2.8": - version "0.2.8" - resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-travis-ci/-/backstage-plugin-travis-ci-0.2.8.tgz#c730531519bf3e3dba35522d5e6c822176ddb9c8" - integrity sha512-8R8waHoviT5chHGybAMVVRHHmeytn+8Po7sU08WCYIt4Vkw2/gwu36fd90y+lW4x6T0s3ZiaJrsQ3KlA7LmRnQ== +"@roadiehq/backstage-plugin-travis-ci@^0.4.5": + version "0.4.5" + resolved "https://registry.npmjs.org/@roadiehq/backstage-plugin-travis-ci/-/backstage-plugin-travis-ci-0.4.5.tgz#c80eb972951badd110173f5521aae65b8a5cfc53" + integrity sha512-+y5kFtVaPjXgf6naGVU2E3C33nvoXuaBbfYEmCeByg2t0b5jHMHzsTv2tV5/8zeAcus/5+yIkRCq+F1Tcbwutw== dependencies: - "@backstage/catalog-model" "^0.2.0" - "@backstage/core" "^0.3.0" - "@backstage/core-api" "^0.2.1" - "@backstage/plugin-catalog" "^0.2.1" + "@backstage/catalog-model" "^0.7.0" + "@backstage/core" "^0.6.0" + "@backstage/plugin-catalog" "^0.3.1" "@backstage/theme" "^0.2.1" "@material-ui/core" "^4.9.1" "@material-ui/icons" "^4.9.1" "@material-ui/lab" "4.0.0-alpha.45" - date-fns "^2.15.0" + cross-fetch "^3.0.6" + date-fns "^2.16.1" history "^5.0.0" - moment "^2.27.0" + moment "^2.29.1" react "^16.13.1" react-dom "^16.13.1" - react-lazylog "^4.5.2" react-router "6.0.0-beta.0" react-router-dom "6.0.0-beta.0" react-use "^15.3.3" @@ -10960,10 +10959,10 @@ date-fns@^1.27.2: resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -date-fns@^2.0.0-alpha.27, date-fns@^2.0.1, date-fns@^2.15.0: - version "2.15.0" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" - integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== +date-fns@^2.0.0-alpha.27, date-fns@^2.0.1, date-fns@^2.16.1: + version "2.18.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.18.0.tgz#08e50aee300ad0d2c5e054e3f0d10d8f9cdfe09e" + integrity sha512-NYyAg4wRmGVU4miKq5ivRACOODdZRY3q5WLmOJSq8djyzftYphU7dTHLcEtLqEvfqMKQ0jVv91P4BAwIjsXIcw== dateformat@^3.0.0: version "3.0.3" @@ -18236,7 +18235,7 @@ modify-values@^1.0.0: resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@^2.19.3, moment@^2.25.3, moment@^2.27.0: +moment@^2.19.3, moment@^2.25.3, moment@^2.27.0, moment@^2.29.1: version "2.29.1" resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== From a5129f6e1d3505c91999224fcb97da089e9bd4b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Mar 2021 04:31:56 +0000 Subject: [PATCH 18/27] chore(deps): bump logform from 2.1.2 to 2.2.0 Bumps [logform](https://github.com/winstonjs/logform) from 2.1.2 to 2.2.0. - [Release notes](https://github.com/winstonjs/logform/releases) - [Changelog](https://github.com/winstonjs/logform/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/logform/compare/2.1.2...v2.2.0) Signed-off-by: dependabot[bot] --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 783debcf8c..028de26619 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12875,10 +12875,10 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -fecha@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" - integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== +fecha@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" + integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== fetch-readablestream@^0.2.0: version "0.2.0" @@ -17340,13 +17340,13 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" logform@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" - integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== + version "2.2.0" + resolved "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" + integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== dependencies: colors "^1.2.1" fast-safe-stringify "^2.0.4" - fecha "^2.3.3" + fecha "^4.2.0" ms "^2.1.1" triple-beam "^1.3.0" From 0755fc632dca52949719ed8b837af94016849898 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Mar 2021 09:48:33 +0100 Subject: [PATCH 19/27] core-api: tweak route ref types Signed-off-by: Patrik Oldsberg --- packages/core-api/src/routing/RouteRef.ts | 7 ++++--- packages/core-api/src/routing/types.ts | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/core-api/src/routing/RouteRef.ts b/packages/core-api/src/routing/RouteRef.ts index d218d72fbb..eda16ccc91 100644 --- a/packages/core-api/src/routing/RouteRef.ts +++ b/packages/core-api/src/routing/RouteRef.ts @@ -31,13 +31,14 @@ export type RouteRefConfig = { title: string; }; -class RouteRefBaseBase { +class RouteRefBase { constructor(type: string, id: string) { this.toString = () => `routeRef{type=${type},id=${id}}`; } } -export class RouteRefImpl extends RouteRefBaseBase { +export class RouteRefImpl extends RouteRefBase + implements RouteRef { readonly [routeRefType] = 'absolute'; constructor(private readonly config: RouteRefConfig) { @@ -92,7 +93,7 @@ export function createRouteRef< export class ExternalRouteRefImpl< Params extends AnyParams, Optional extends boolean -> extends RouteRefBaseBase { +> extends RouteRefBase implements ExternalRouteRef { readonly [routeRefType] = 'external'; constructor( diff --git a/packages/core-api/src/routing/types.ts b/packages/core-api/src/routing/types.ts index de6f991ec9..69de5345a5 100644 --- a/packages/core-api/src/routing/types.ts +++ b/packages/core-api/src/routing/types.ts @@ -28,7 +28,7 @@ export const routeRefType: unique symbol = getGlobalSingleton( ); export type RouteRef = { - [routeRefType]: 'absolute'; + readonly [routeRefType]: 'absolute'; params: ParamKeys; @@ -45,7 +45,7 @@ export type ExternalRouteRef< Params extends AnyParams = any, Optional extends boolean = any > = { - [routeRefType]: 'external'; + readonly [routeRefType]: 'external'; params: ParamKeys; From eed2656f12b84d765558a01c4f5168fd9c70be2d Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 4 Mar 2021 10:54:34 +0100 Subject: [PATCH 20/27] chore: updating scaffolder v2 template Signed-off-by: blam --- .../sample-templates/v1beta2-demo/template.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend/sample-templates/v1beta2-demo/template.yaml b/plugins/scaffolder-backend/sample-templates/v1beta2-demo/template.yaml index b1a4b0d91d..5b90e6c121 100644 --- a/plugins/scaffolder-backend/sample-templates/v1beta2-demo/template.yaml +++ b/plugins/scaffolder-backend/sample-templates/v1beta2-demo/template.yaml @@ -36,7 +36,7 @@ spec: - id: fetch-base name: Fetch Base action: fetch:cookiecutter - parameters: + input: url: ./template values: name: '{{ parameters.name }}' @@ -44,14 +44,14 @@ spec: - id: fetch-docs name: Fetch Docs action: fetch:plain - parameters: + input: targetPath: ./community url: https://github.com/backstage/community/tree/main/backstage-community-sessions - id: publish name: Publish action: publish:github - parameters: + input: allowedHosts: ['github.com'] description: 'This is {{ parameters.name }}' repoUrl: '{{ parameters.repoUrl }}' @@ -59,7 +59,7 @@ spec: - id: register name: Register action: catalog:register - parameters: + input: repoContentsUrl: '{{ steps.publish.output.repoContentsUrl }}' catalogInfoPath: '/catalog-info.yaml' From c5a4d041acdf9fe3519aeaea63801038a31736d9 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Mar 2021 11:54:14 +0100 Subject: [PATCH 21/27] core-api: skip wrapping the component data store in an object Signed-off-by: Patrik Oldsberg --- .../core-api/src/extensions/componentData.test.tsx | 11 ++++------- packages/core-api/src/extensions/componentData.tsx | 7 ++++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/core-api/src/extensions/componentData.test.tsx b/packages/core-api/src/extensions/componentData.test.tsx index cb0918b290..417fe07414 100644 --- a/packages/core-api/src/extensions/componentData.test.tsx +++ b/packages/core-api/src/extensions/componentData.test.tsx @@ -100,19 +100,16 @@ describe('elementData', () => { const element = ; const container = (global as any)[ '__@backstage/component-data-store__' - ].store.get(element.type); + ].get(element.type); expect(container.map.get('my-data')).toBe(data); }); it('should should be able to attach data for newer versions', () => { const data = { foo: 'bar' }; const Component = () => null; - (global as any)['__@backstage/component-data-store__'].store.set( - Component, - { - map: new Map([['my-data', data]]), - }, - ); + (global as any)['__@backstage/component-data-store__'].set(Component, { + map: new Map([['my-data', data]]), + }); const element = ; expect(getComponentData(element, 'my-data')).toBe(data); diff --git a/packages/core-api/src/extensions/componentData.tsx b/packages/core-api/src/extensions/componentData.tsx index d18379d25f..8b46d34705 100644 --- a/packages/core-api/src/extensions/componentData.tsx +++ b/packages/core-api/src/extensions/componentData.tsx @@ -33,9 +33,10 @@ type MaybeComponentNode = ReactNode & { }; // The store is bridged across versions using the global object -const { store } = getGlobalSingleton('component-data-store', () => ({ - store: new WeakMap, DataContainer>(), -})); +const store = getGlobalSingleton( + 'component-data-store', + () => new WeakMap, DataContainer>(), +); export function attachComponentData

( component: ComponentType

, From 4fbc9df797b25a5df4845b6e596038effff9f8b9 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Mar 2021 12:19:12 +0100 Subject: [PATCH 22/27] changesets: add changeset for kafka-backend config packaging fix Signed-off-by: Patrik Oldsberg --- .changeset/dry-swans-exercise.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dry-swans-exercise.md diff --git a/.changeset/dry-swans-exercise.md b/.changeset/dry-swans-exercise.md new file mode 100644 index 0000000000..7080f3997d --- /dev/null +++ b/.changeset/dry-swans-exercise.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kafka-backend': patch +--- + +Fixed `config.d.ts` not being included in the published package. From 2f98cf16c6912be16c9fd5cf692b3d5fa4c9f21a Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 4 Mar 2021 12:47:03 +0100 Subject: [PATCH 23/27] chore: make sure to throw when e2e fails Signed-off-by: blam --- packages/e2e-test/src/commands/run.ts | 49 ++++++++++++++++----------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/packages/e2e-test/src/commands/run.ts b/packages/e2e-test/src/commands/run.ts index 5f4894f9e9..851dccae16 100644 --- a/packages/e2e-test/src/commands/run.ts +++ b/packages/e2e-test/src/commands/run.ts @@ -42,33 +42,44 @@ const templatePackagePaths = [ ]; export async function run() { - const rootDir = await fs.mkdtemp(resolvePath(os.tmpdir(), 'backstage-e2e-')); - print(`CLI E2E test root: ${rootDir}\n`); + try { + const rootDir = await fs.mkdtemp( + resolvePath(os.tmpdir(), 'backstage-e2e-'), + ); + print(`CLI E2E test root: ${rootDir}\n`); - print('Building dist workspace'); - const workspaceDir = await buildDistWorkspace('workspace', rootDir); + print('Building dist workspace'); + const workspaceDir = await buildDistWorkspace('workspace', rootDir); - const isPostgres = Boolean(process.env.POSTGRES_USER); - print('Creating a Backstage App'); - const appDir = await createApp('test-app', isPostgres, workspaceDir, rootDir); + const isPostgres = Boolean(process.env.POSTGRES_USER); + print('Creating a Backstage App'); + const appDir = await createApp( + 'test-app', + isPostgres, + workspaceDir, + rootDir, + ); - print('Creating a Backstage Plugin'); - const pluginName = await createPlugin('test-plugin', appDir); + print('Creating a Backstage Plugin'); + const pluginName = await createPlugin('test-plugin', appDir); - print('Creating a Backstage Backend Plugin'); - await createPlugin('test-plugin', appDir, ['--backend']); + print('Creating a Backstage Backend Plugin'); + await createPlugin('test-plugin', appDir, ['--backend']); - print('Starting the app'); - await testAppServe(pluginName, appDir); + print('Starting the app'); + await testAppServe(pluginName, appDir); - print('Testing the backend startup'); - await testBackendStart(appDir, isPostgres); + print('Testing the backend startup'); + await testBackendStart(appDir, isPostgres); - print('All tests successful, removing test dir'); - await fs.remove(rootDir); + print('All tests successful, removing test dir'); + await fs.remove(rootDir); - // Just in case some child process was left hanging - process.exit(0); + // Just in case some child process was left hanging + process.exit(0); + } catch { + process.exit(1); + } } /** From b93538accde0828f75c6dad57b6c65c6ade3a53b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Mar 2021 12:52:06 +0100 Subject: [PATCH 24/27] cli: fix for type declarations being required even if not built Signed-off-by: Patrik Oldsberg --- .changeset/tender-ravens-collect.md | 5 ++++ packages/cli/src/lib/builder/config.ts | 32 +++++++++++++------------- 2 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 .changeset/tender-ravens-collect.md diff --git a/.changeset/tender-ravens-collect.md b/.changeset/tender-ravens-collect.md new file mode 100644 index 0000000000..73599e8cfc --- /dev/null +++ b/.changeset/tender-ravens-collect.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fix for type declaration input being required for build even if types aren't being built. diff --git a/packages/cli/src/lib/builder/config.ts b/packages/cli/src/lib/builder/config.ts index a236e87806..f8305ad6e0 100644 --- a/packages/cli/src/lib/builder/config.ts +++ b/packages/cli/src/lib/builder/config.ts @@ -36,22 +36,6 @@ import { svgrTemplate } from '../svgrTemplate'; export const makeConfigs = async ( options: BuildOptions, ): Promise => { - const typesInput = paths.resolveTargetRoot( - 'dist-types', - relativePath(paths.targetRoot, paths.targetDir), - 'src/index.d.ts', - ); - - const declarationsExist = await fs.pathExists(typesInput); - if (!declarationsExist) { - const path = relativePath(paths.targetDir, typesInput); - throw new Error( - `No declaration files found at ${path}, be sure to run ${chalk.bgRed.white( - 'yarn tsc', - )} to generate .d.ts files before packaging`, - ); - } - const configs = new Array(); if (options.outputs.has(Output.cjs) || options.outputs.has(Output.esm)) { @@ -112,6 +96,22 @@ export const makeConfigs = async ( } if (options.outputs.has(Output.types)) { + const typesInput = paths.resolveTargetRoot( + 'dist-types', + relativePath(paths.targetRoot, paths.targetDir), + 'src/index.d.ts', + ); + + const declarationsExist = await fs.pathExists(typesInput); + if (!declarationsExist) { + const path = relativePath(paths.targetDir, typesInput); + throw new Error( + `No declaration files found at ${path}, be sure to run ${chalk.bgRed.white( + 'yarn tsc', + )} to generate .d.ts files before packaging`, + ); + } + configs.push({ input: typesInput, output: { From 946615dbab38123bb4f67ae7e74d736e02d3c869 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Mar 2021 13:12:03 +0100 Subject: [PATCH 25/27] cli: fix plugin template by using renderInTestApp in component test Signed-off-by: Patrik Oldsberg --- .../ExampleComponent/ExampleComponent.test.tsx.hbs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/cli/templates/default-plugin/src/components/ExampleComponent/ExampleComponent.test.tsx.hbs b/packages/cli/templates/default-plugin/src/components/ExampleComponent/ExampleComponent.test.tsx.hbs index e6eab17493..0044b67a37 100644 --- a/packages/cli/templates/default-plugin/src/components/ExampleComponent/ExampleComponent.test.tsx.hbs +++ b/packages/cli/templates/default-plugin/src/components/ExampleComponent/ExampleComponent.test.tsx.hbs @@ -1,11 +1,10 @@ import React from 'react'; -import { render } from '@testing-library/react'; import { ExampleComponent } from './ExampleComponent'; import { ThemeProvider } from '@material-ui/core'; import { lightTheme } from '@backstage/theme'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { msw } from '@backstage/test-utils'; +import { msw, renderInTestApp } from '@backstage/test-utils'; describe('ExampleComponent', () => { const server = setupServer(); @@ -19,8 +18,8 @@ describe('ExampleComponent', () => { ); }); - it('should render', () => { - const rendered = render( + it('should render', async () => { + const rendered = await renderInTestApp( , From ff2ab4fade1e9d572b5ef382a8c3edc0e0828cd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 4 Mar 2021 13:11:10 +0000 Subject: [PATCH 26/27] Version Packages --- .changeset/afraid-weeks-sort.md | 7 - .changeset/blue-lemons-reflect.md | 7 - .changeset/brown-hotels-study.md | 6 - .changeset/chatty-turkeys-fold.md | 5 - .changeset/clean-plums-crash.md | 5 - .changeset/curvy-pugs-type.md | 5 - .changeset/dry-swans-exercise.md | 5 - .changeset/empty-taxis-search.md | 6 - .changeset/empty-windows-nail.md | 5 - .changeset/fluffy-elephants-suffer.md | 7 - .changeset/gentle-bears-fry.md | 5 - .changeset/honest-moose-eat.md | 5 - .changeset/hot-islands-kick.md | 5 - .changeset/hungry-frogs-flow.md | 5 - .changeset/itchy-items-serve.md | 5 - .changeset/kind-pens-deliver.md | 10 -- .changeset/large-eggs-help.md | 19 --- .changeset/late-singers-speak.md | 5 - .changeset/late-tables-provide.md | 5 - .changeset/light-vans-hide.md | 5 - .changeset/long-bikes-check.md | 23 ---- .changeset/lucky-turtles-sort.md | 5 - .changeset/metal-pianos-repeat.md | 5 - .changeset/nervous-dogs-pull.md | 5 - .changeset/new-forks-perform.md | 5 - .changeset/nice-spies-beam.md | 5 - .changeset/old-coats-suffer.md | 5 - .changeset/perfect-scissors-swim.md | 5 - .changeset/pink-ads-shave.md | 37 ------ .changeset/polite-ads-press.md | 5 - .changeset/popular-sheep-act.md | 6 - .changeset/red-taxis-confess.md | 23 ---- .changeset/rich-socks-move.md | 6 - .changeset/rude-ways-camp.md | 5 - .changeset/shaggy-spiders-shop.md | 5 - .changeset/short-geese-double.md | 5 - .changeset/silly-dolphins-repair.md | 5 - .changeset/silver-balloons-play.md | 5 - .changeset/slimy-singers-return.md | 5 - .changeset/soft-months-invite.md | 5 - .changeset/sour-insects-marry.md | 31 ----- .changeset/spotty-cooks-work.md | 22 ---- .changeset/stale-ducks-sing.md | 56 -------- .changeset/strange-apes-exercise.md | 5 - .changeset/strange-carrots-fix.md | 25 ---- .changeset/sweet-experts-whisper.md | 5 - .changeset/swift-cows-thank.md | 5 - .changeset/tame-wolves-hunt.md | 5 - .changeset/tender-ravens-collect.md | 5 - .changeset/three-pumpkins-watch.md | 7 - .changeset/tidy-ads-juggle.md | 5 - .changeset/twenty-pandas-crash.md | 5 - .changeset/yellow-rice-appear.md | 5 - .changeset/young-pens-argue.md | 5 - packages/app/CHANGELOG.md | 69 ++++++++++ packages/app/package.json | 62 ++++----- packages/backend-common/CHANGELOG.md | 7 + packages/backend-common/package.json | 4 +- packages/backend/CHANGELOG.md | 32 +++++ packages/backend/package.json | 24 ++-- packages/catalog-model/CHANGELOG.md | 6 + packages/catalog-model/package.json | 4 +- packages/cli/CHANGELOG.md | 11 ++ packages/cli/package.json | 8 +- packages/core-api/CHANGELOG.md | 7 + packages/core-api/package.json | 4 +- packages/core/CHANGELOG.md | 43 +++++++ packages/core/package.json | 6 +- packages/create-app/CHANGELOG.md | 162 ++++++++++++++++++++++++ packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 17 +++ packages/dev-utils/package.json | 10 +- packages/techdocs-common/CHANGELOG.md | 12 ++ packages/techdocs-common/package.json | 8 +- plugins/api-docs/CHANGELOG.md | 39 ++++++ plugins/api-docs/package.json | 12 +- plugins/auth-backend/CHANGELOG.md | 12 ++ plugins/auth-backend/package.json | 8 +- plugins/catalog-backend/CHANGELOG.md | 12 ++ plugins/catalog-backend/package.json | 8 +- plugins/catalog-import/CHANGELOG.md | 18 +++ plugins/catalog-import/package.json | 12 +- plugins/catalog-react/CHANGELOG.md | 16 +++ plugins/catalog-react/package.json | 10 +- plugins/catalog/CHANGELOG.md | 21 +++ plugins/catalog/package.json | 12 +- plugins/circleci/CHANGELOG.md | 18 +++ plugins/circleci/package.json | 12 +- plugins/cloudbuild/CHANGELOG.md | 19 +++ plugins/cloudbuild/package.json | 12 +- plugins/cost-insights/CHANGELOG.md | 12 ++ plugins/cost-insights/package.json | 8 +- plugins/explore-react/CHANGELOG.md | 12 ++ plugins/explore-react/package.json | 8 +- plugins/explore/CHANGELOG.md | 36 ++++++ plugins/explore/package.json | 14 +- plugins/fossa/CHANGELOG.md | 17 +++ plugins/fossa/package.json | 12 +- plugins/gcp-projects/CHANGELOG.md | 12 ++ plugins/gcp-projects/package.json | 8 +- plugins/github-actions/CHANGELOG.md | 19 +++ plugins/github-actions/package.json | 12 +- plugins/gitops-profiles/CHANGELOG.md | 12 ++ plugins/gitops-profiles/package.json | 8 +- plugins/graphiql/CHANGELOG.md | 12 ++ plugins/graphiql/package.json | 8 +- plugins/jenkins/CHANGELOG.md | 20 +++ plugins/jenkins/package.json | 12 +- plugins/kafka-backend/CHANGELOG.md | 12 ++ plugins/kafka-backend/package.json | 8 +- plugins/kafka/CHANGELOG.md | 17 +++ plugins/kafka/package.json | 12 +- plugins/kubernetes-backend/CHANGELOG.md | 12 ++ plugins/kubernetes-backend/package.json | 8 +- plugins/kubernetes/CHANGELOG.md | 24 ++++ plugins/kubernetes/package.json | 14 +- plugins/lighthouse/CHANGELOG.md | 18 +++ plugins/lighthouse/package.json | 12 +- plugins/newrelic/CHANGELOG.md | 12 ++ plugins/newrelic/package.json | 8 +- plugins/org/CHANGELOG.md | 18 +++ plugins/org/package.json | 14 +- plugins/pagerduty/CHANGELOG.md | 45 +++++++ plugins/pagerduty/package.json | 12 +- plugins/proxy-backend/CHANGELOG.md | 10 ++ plugins/proxy-backend/package.json | 6 +- plugins/register-component/CHANGELOG.md | 17 +++ plugins/register-component/package.json | 12 +- plugins/rollbar/CHANGELOG.md | 17 +++ plugins/rollbar/package.json | 12 +- plugins/scaffolder-backend/CHANGELOG.md | 69 ++++++++++ plugins/scaffolder-backend/package.json | 8 +- plugins/scaffolder/CHANGELOG.md | 54 ++++++++ plugins/scaffolder/package.json | 12 +- plugins/search/CHANGELOG.md | 17 +++ plugins/search/package.json | 12 +- plugins/sentry/CHANGELOG.md | 17 +++ plugins/sentry/package.json | 12 +- plugins/sonarqube/CHANGELOG.md | 19 +++ plugins/sonarqube/package.json | 12 +- plugins/splunk-on-call/CHANGELOG.md | 17 +++ plugins/splunk-on-call/package.json | 12 +- plugins/tech-radar/CHANGELOG.md | 12 ++ plugins/tech-radar/package.json | 8 +- plugins/techdocs-backend/CHANGELOG.md | 16 +++ plugins/techdocs-backend/package.json | 10 +- plugins/techdocs/CHANGELOG.md | 24 ++++ plugins/techdocs/package.json | 14 +- plugins/user-settings/CHANGELOG.md | 12 ++ plugins/user-settings/package.json | 8 +- plugins/welcome/CHANGELOG.md | 12 ++ plugins/welcome/package.json | 8 +- yarn.lock | 106 ++++++++++++++-- 153 files changed, 1509 insertions(+), 766 deletions(-) delete mode 100644 .changeset/afraid-weeks-sort.md delete mode 100644 .changeset/blue-lemons-reflect.md delete mode 100644 .changeset/brown-hotels-study.md delete mode 100644 .changeset/chatty-turkeys-fold.md delete mode 100644 .changeset/clean-plums-crash.md delete mode 100644 .changeset/curvy-pugs-type.md delete mode 100644 .changeset/dry-swans-exercise.md delete mode 100644 .changeset/empty-taxis-search.md delete mode 100644 .changeset/empty-windows-nail.md delete mode 100644 .changeset/fluffy-elephants-suffer.md delete mode 100644 .changeset/gentle-bears-fry.md delete mode 100644 .changeset/honest-moose-eat.md delete mode 100644 .changeset/hot-islands-kick.md delete mode 100644 .changeset/hungry-frogs-flow.md delete mode 100644 .changeset/itchy-items-serve.md delete mode 100644 .changeset/kind-pens-deliver.md delete mode 100644 .changeset/large-eggs-help.md delete mode 100644 .changeset/late-singers-speak.md delete mode 100644 .changeset/late-tables-provide.md delete mode 100644 .changeset/light-vans-hide.md delete mode 100644 .changeset/long-bikes-check.md delete mode 100644 .changeset/lucky-turtles-sort.md delete mode 100644 .changeset/metal-pianos-repeat.md delete mode 100644 .changeset/nervous-dogs-pull.md delete mode 100644 .changeset/new-forks-perform.md delete mode 100644 .changeset/nice-spies-beam.md delete mode 100644 .changeset/old-coats-suffer.md delete mode 100644 .changeset/perfect-scissors-swim.md delete mode 100644 .changeset/pink-ads-shave.md delete mode 100644 .changeset/polite-ads-press.md delete mode 100644 .changeset/popular-sheep-act.md delete mode 100644 .changeset/red-taxis-confess.md delete mode 100644 .changeset/rich-socks-move.md delete mode 100644 .changeset/rude-ways-camp.md delete mode 100644 .changeset/shaggy-spiders-shop.md delete mode 100644 .changeset/short-geese-double.md delete mode 100644 .changeset/silly-dolphins-repair.md delete mode 100644 .changeset/silver-balloons-play.md delete mode 100644 .changeset/slimy-singers-return.md delete mode 100644 .changeset/soft-months-invite.md delete mode 100644 .changeset/sour-insects-marry.md delete mode 100644 .changeset/spotty-cooks-work.md delete mode 100644 .changeset/stale-ducks-sing.md delete mode 100644 .changeset/strange-apes-exercise.md delete mode 100644 .changeset/strange-carrots-fix.md delete mode 100644 .changeset/sweet-experts-whisper.md delete mode 100644 .changeset/swift-cows-thank.md delete mode 100644 .changeset/tame-wolves-hunt.md delete mode 100644 .changeset/tender-ravens-collect.md delete mode 100644 .changeset/three-pumpkins-watch.md delete mode 100644 .changeset/tidy-ads-juggle.md delete mode 100644 .changeset/twenty-pandas-crash.md delete mode 100644 .changeset/yellow-rice-appear.md delete mode 100644 .changeset/young-pens-argue.md diff --git a/.changeset/afraid-weeks-sort.md b/.changeset/afraid-weeks-sort.md deleted file mode 100644 index c5ec608daf..0000000000 --- a/.changeset/afraid-weeks-sort.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -k8s plugin now surfaces k8s components with only label selector query annotation. -Previously backstage.io/kubernetes-label-selector catalog entity annotation would only work if you also included backstage.io/kubernetes-id. -But backstage.io/kubernetes-id value was ignored diff --git a/.changeset/blue-lemons-reflect.md b/.changeset/blue-lemons-reflect.md deleted file mode 100644 index 8b2fc144fd..0000000000 --- a/.changeset/blue-lemons-reflect.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-circleci': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-github-actions': patch ---- - -Use Breadcrumbs from @backstage/core rather than material-ui diff --git a/.changeset/brown-hotels-study.md b/.changeset/brown-hotels-study.md deleted file mode 100644 index 2b9e6a86b8..0000000000 --- a/.changeset/brown-hotels-study.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-scaffolder-backend': patch ---- - -Move logic for constructing the template form to the backend, using a new `./parameter-schema` endpoint that returns the form schema for a given template. diff --git a/.changeset/chatty-turkeys-fold.md b/.changeset/chatty-turkeys-fold.md deleted file mode 100644 index bbc083cd85..0000000000 --- a/.changeset/chatty-turkeys-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Bump `@svgr/webpack` from `5.4.x` to `5.5.x`. diff --git a/.changeset/clean-plums-crash.md b/.changeset/clean-plums-crash.md deleted file mode 100644 index 77cd94f097..0000000000 --- a/.changeset/clean-plums-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': patch ---- - -Forward authorization header on backend request if present diff --git a/.changeset/curvy-pugs-type.md b/.changeset/curvy-pugs-type.md deleted file mode 100644 index 7e94a5b35f..0000000000 --- a/.changeset/curvy-pugs-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -GithubDiscoveryProcessor outputs locations as optional to avoid outputting errors for missing locations (see https://github.com/backstage/backstage/issues/4730). diff --git a/.changeset/dry-swans-exercise.md b/.changeset/dry-swans-exercise.md deleted file mode 100644 index 7080f3997d..0000000000 --- a/.changeset/dry-swans-exercise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kafka-backend': patch ---- - -Fixed `config.d.ts` not being included in the published package. diff --git a/.changeset/empty-taxis-search.md b/.changeset/empty-taxis-search.md deleted file mode 100644 index ad45f290d3..0000000000 --- a/.changeset/empty-taxis-search.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch -'@backstage/plugin-catalog': patch ---- - -Update messaging when no entities are in a table. diff --git a/.changeset/empty-windows-nail.md b/.changeset/empty-windows-nail.md deleted file mode 100644 index 0b2eeb08cc..0000000000 --- a/.changeset/empty-windows-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Make the external `createComponent` route optional, hiding the "Create Component" button if it isn't bound. diff --git a/.changeset/fluffy-elephants-suffer.md b/.changeset/fluffy-elephants-suffer.md deleted file mode 100644 index cd118829ed..0000000000 --- a/.changeset/fluffy-elephants-suffer.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/catalog-model': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-scaffolder-backend': patch ---- - -Add version `backstage.io/v1beta2` schema for Template entities. diff --git a/.changeset/gentle-bears-fry.md b/.changeset/gentle-bears-fry.md deleted file mode 100644 index 43966311c7..0000000000 --- a/.changeset/gentle-bears-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-sonarqube': patch ---- - -Collect all available metric types if the number exceeds the default page size of 100. diff --git a/.changeset/honest-moose-eat.md b/.changeset/honest-moose-eat.md deleted file mode 100644 index be42e9e26b..0000000000 --- a/.changeset/honest-moose-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Add optional `logClientErrors` to errorHandler to log 4XX errors diff --git a/.changeset/hot-islands-kick.md b/.changeset/hot-islands-kick.md deleted file mode 100644 index 67222245de..0000000000 --- a/.changeset/hot-islands-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Added a verification for well formed URLs when processing proxy targets. Otherwise users gets a cryptic error message thrown from Express which makes it hard to debug. diff --git a/.changeset/hungry-frogs-flow.md b/.changeset/hungry-frogs-flow.md deleted file mode 100644 index 91a6ab0892..0000000000 --- a/.changeset/hungry-frogs-flow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Consider both authentication methods for both `onprem` and `cloud` BitBucket diff --git a/.changeset/itchy-items-serve.md b/.changeset/itchy-items-serve.md deleted file mode 100644 index df39751e9d..0000000000 --- a/.changeset/itchy-items-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': patch ---- - -Use external url for static docs diff --git a/.changeset/kind-pens-deliver.md b/.changeset/kind-pens-deliver.md deleted file mode 100644 index e4937cb396..0000000000 --- a/.changeset/kind-pens-deliver.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@backstage/techdocs-common': patch -'@backstage/plugin-auth-backend': patch -'@backstage/plugin-kafka-backend': patch -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-techdocs-backend': patch ---- - -remove usage of res.send() for res.json() and res.end() to ensure content types are more consistently application/json on backend responses and error cases diff --git a/.changeset/large-eggs-help.md b/.changeset/large-eggs-help.md deleted file mode 100644 index e310ad7645..0000000000 --- a/.changeset/large-eggs-help.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@backstage/plugin-explore': minor ---- - -Introduce external route for linking to the entity page from the explore plugin. - -To use the explore plugin you have to bind the external route in your app: - -```typescript -const app = createApp({ - ... - bindRoutes({ bind }) { - ... - bind(explorePlugin.externalRoutes, { - catalogEntity: catalogPlugin.routes.catalogEntity, - }); - }, -}); -``` diff --git a/.changeset/late-singers-speak.md b/.changeset/late-singers-speak.md deleted file mode 100644 index 5e58e09c23..0000000000 --- a/.changeset/late-singers-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Change debug log format to print as color grey diff --git a/.changeset/late-tables-provide.md b/.changeset/late-tables-provide.md deleted file mode 100644 index 125d3bc3ac..0000000000 --- a/.changeset/late-tables-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Tweak the template cards to be even more compliant with MUI examples, and a little bit more dense. diff --git a/.changeset/light-vans-hide.md b/.changeset/light-vans-hide.md deleted file mode 100644 index ccc1339959..0000000000 --- a/.changeset/light-vans-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Add organization name to the API Explorer page title diff --git a/.changeset/long-bikes-check.md b/.changeset/long-bikes-check.md deleted file mode 100644 index 4fbc28d5aa..0000000000 --- a/.changeset/long-bikes-check.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -The api-docs plugin has been migrated to use an [external route reference](https://backstage.io/docs/plugins/composability#binding-external-routes-in-the-app) to dynamically link to the create component page. - -If you want to have a button that links to the scaffolder plugin from the API explorer, apply the following changes to `packages/app/src/App.tsx`: - -```diff -+ import { apiDocsPlugin } from '@backstage/plugin-api-docs'; - import { scaffolderPlugin } from '@backstage/plugin-scaffolder'; - - const app = createApp({ - // ... - bindRoutes({ bind }) { -+ bind(apiDocsPlugin.externalRoutes, { -+ createComponent: scaffolderPlugin.routes.root, -+ }); - }, - }); -``` - -If you choose to not bind the routes, the button to create new APIs is not displayed. diff --git a/.changeset/lucky-turtles-sort.md b/.changeset/lucky-turtles-sort.md deleted file mode 100644 index 56c223da2a..0000000000 --- a/.changeset/lucky-turtles-sort.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch ---- - -Allow apps to pass in a KubernetesClustersSupplier diff --git a/.changeset/metal-pianos-repeat.md b/.changeset/metal-pianos-repeat.md deleted file mode 100644 index e24320938a..0000000000 --- a/.changeset/metal-pianos-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -Support AWS auth provider on kubernetes FE plugin diff --git a/.changeset/nervous-dogs-pull.md b/.changeset/nervous-dogs-pull.md deleted file mode 100644 index fd62b751d8..0000000000 --- a/.changeset/nervous-dogs-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Fix for proxy-backend plugin when global-agent is enabled diff --git a/.changeset/new-forks-perform.md b/.changeset/new-forks-perform.md deleted file mode 100644 index 04d6d59be1..0000000000 --- a/.changeset/new-forks-perform.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Use entity relation for the owner of an entity in the catalog entity page header. diff --git a/.changeset/nice-spies-beam.md b/.changeset/nice-spies-beam.md deleted file mode 100644 index 0ac956709a..0000000000 --- a/.changeset/nice-spies-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Bump `@testing-library/react` in the plugin template from `^10.4.1` to `^11.2.5`. To apply this to an existing plugin, update the dependency in your `package.json`. diff --git a/.changeset/old-coats-suffer.md b/.changeset/old-coats-suffer.md deleted file mode 100644 index 5938c60b1e..0000000000 --- a/.changeset/old-coats-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': minor ---- - -Add authorization header on techdocs api requests. Breaking change as clients now needs the Identity API. diff --git a/.changeset/perfect-scissors-swim.md b/.changeset/perfect-scissors-swim.md deleted file mode 100644 index 7cbe02d321..0000000000 --- a/.changeset/perfect-scissors-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Fixed an issue where the `backend:dev` command would get stuck executing the backend process multiple times, causing port conflict issues. diff --git a/.changeset/pink-ads-shave.md b/.changeset/pink-ads-shave.md deleted file mode 100644 index 50d0ddef22..0000000000 --- a/.changeset/pink-ads-shave.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -'@backstage/plugin-scaffolder': minor -'@backstage/plugin-scaffolder-backend': minor ---- - -The scaffolder has been updated to support the new `v1beta2` template schema which allows for custom template actions! - -See documentation for more information how to create and register new template actions. - -**Breaking changes** - -The backend scaffolder plugin now needs a `UrlReader` which can be pulled from the PluginEnvironment. - -The following change is required in `backend/src/plugins/scaffolder.ts` - -```diff - export default async function createPlugin({ - logger, - config, - database, -+ reader, - }: PluginEnvironment): Promise { - - // omitted code - - return await createRouter({ - preparers, - templaters, - publishers, - logger, - config, - dockerClient, - database, - catalogClient, -+ reader, - }); -``` diff --git a/.changeset/polite-ads-press.md b/.changeset/polite-ads-press.md deleted file mode 100644 index 6e9ba2f5c3..0000000000 --- a/.changeset/polite-ads-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-import': patch ---- - -Bump react-hook-form version constraint to "^6.15.4" diff --git a/.changeset/popular-sheep-act.md b/.changeset/popular-sheep-act.md deleted file mode 100644 index 885d9f0e6b..0000000000 --- a/.changeset/popular-sheep-act.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/core-api': patch -'@backstage/core': patch ---- - -Added support for optional external route references. By setting `optional: true` when creating an `ExternalRouteRef` it is no longer a requirement to bind the route in the app. If the app isn't bound `useRouteRef` will return `undefined`. diff --git a/.changeset/red-taxis-confess.md b/.changeset/red-taxis-confess.md deleted file mode 100644 index 4fa40d8f17..0000000000 --- a/.changeset/red-taxis-confess.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -The api-docs plugin has been migrated to use an [external route reference](https://backstage.io/docs/plugins/composability#binding-external-routes-in-the-app) to dynamically link to the create component page. This means you need to migrate the api docs plugin to use the new extension components, as well as bind the external route. - -To bind the external route from the api docs plugin to the scaffolder template index page, make sure you have the appropriate imports and add the following to the `createApp` call: - -```ts -import { apiDocsPlugin } from '@backstage/plugin-api-docs'; -import { scaffolderPlugin } from '@backstage/plugin-scaffolder'; - -const app = createApp({ - // ... - bindRoutes({ bind }) { - bind(apiDocsPlugin.externalRoutes, { - createComponent: scaffolderPlugin.routes.root, - }); - }, -}); -``` - -If you choose to not bind the routes, the button to create new APIs is not displayed. diff --git a/.changeset/rich-socks-move.md b/.changeset/rich-socks-move.md deleted file mode 100644 index 5aeb3121f1..0000000000 --- a/.changeset/rich-socks-move.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/core-api': patch -'@backstage/core': patch ---- - -Internal refactor of how component data is access to avoid polluting components and make it possible to bridge across versions. diff --git a/.changeset/rude-ways-camp.md b/.changeset/rude-ways-camp.md deleted file mode 100644 index 37413141bd..0000000000 --- a/.changeset/rude-ways-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core': patch ---- - -Improve rendering of multiple support item links in the `SupportButton` diff --git a/.changeset/shaggy-spiders-shop.md b/.changeset/shaggy-spiders-shop.md deleted file mode 100644 index ae500f1e81..0000000000 --- a/.changeset/shaggy-spiders-shop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-sonarqube': patch ---- - -Display '-' instead of 'undefined' if no code coverage is reported. diff --git a/.changeset/short-geese-double.md b/.changeset/short-geese-double.md deleted file mode 100644 index 1c63321be7..0000000000 --- a/.changeset/short-geese-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -New config command to export the configuration schema. When running backstage-cli with yarn, consider using `yarn --silent backstage-cli config:schema` to get a clean output on `stdout`. diff --git a/.changeset/silly-dolphins-repair.md b/.changeset/silly-dolphins-repair.md deleted file mode 100644 index 43c6aed230..0000000000 --- a/.changeset/silly-dolphins-repair.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core': patch ---- - -Added the color prop to TrendLine from the Sparklines props types to be able to have custom colors. diff --git a/.changeset/silver-balloons-play.md b/.changeset/silver-balloons-play.md deleted file mode 100644 index 24a5c8ac46..0000000000 --- a/.changeset/silver-balloons-play.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core': patch ---- - -Added a new useSupportConfig hook that reads a new `app.support` config key. Also updated the SupportButton and ErrorPage components to use the new config. diff --git a/.changeset/slimy-singers-return.md b/.changeset/slimy-singers-return.md deleted file mode 100644 index c5fc60aaa2..0000000000 --- a/.changeset/slimy-singers-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Fixed file path resolution for templates with a file location diff --git a/.changeset/soft-months-invite.md b/.changeset/soft-months-invite.md deleted file mode 100644 index a6a20973e9..0000000000 --- a/.changeset/soft-months-invite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Introduce parameters for namespace, kind, and name to `entityRouteRef`. diff --git a/.changeset/sour-insects-marry.md b/.changeset/sour-insects-marry.md deleted file mode 100644 index 27e72977d5..0000000000 --- a/.changeset/sour-insects-marry.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -'@backstage/core': minor -'@backstage/plugin-pagerduty': patch ---- - -- Adds onClick and other props to IconLinkVertical; -- Allows TriggerButton component to render when pager duty key is missing; -- Refactors TriggerButton and PagerDutyCard not to have shared state; -- Removes the `action` prop of the IconLinkVertical component while adding `onClick`. - - Instead of having an action including a button with onClick, now the whole component can be clickable making it easier to implement and having a better UX. - - Before: - - ```ts - const myLink: IconLinkVerticalProps = { - label: 'Click me', - action: