From cb3300c1a2373636bf37368a8f0d410b4a4d759a Mon Sep 17 00:00:00 2001 From: Alex McKay Date: Fri, 23 Aug 2024 15:53:24 -0400 Subject: [PATCH 1/3] add default entity filter & docs Signed-off-by: Alex McKay --- .changeset/rude-bananas-watch.md | 5 ++++ .../backstage-plugin-datadog/README.md | 29 +++++++++++++++++++ .../src/alpha/entityCards.tsx | 1 + .../src/alpha/entityContent.tsx | 1 + 4 files changed, 36 insertions(+) create mode 100644 .changeset/rude-bananas-watch.md diff --git a/.changeset/rude-bananas-watch.md b/.changeset/rude-bananas-watch.md new file mode 100644 index 000000000..a1db2276e --- /dev/null +++ b/.changeset/rude-bananas-watch.md @@ -0,0 +1,5 @@ +--- +'@roadiehq/backstage-plugin-datadog': patch +--- + +Filter entity cards and content to components and resources by default, add documentation on how to override if needed diff --git a/plugins/frontend/backstage-plugin-datadog/README.md b/plugins/frontend/backstage-plugin-datadog/README.md index d3e299201..85f1caf9d 100644 --- a/plugins/frontend/backstage-plugin-datadog/README.md +++ b/plugins/frontend/backstage-plugin-datadog/README.md @@ -64,6 +64,35 @@ const serviceEntityPage = ( ); ``` +### Integrating with `EntityPage` (New Frontend System) + +Follow this section if you are using Backstage's [new frontend system](https://backstage.io/docs/frontend-system/). + +1. Import `datadogPlugin` in your `App.tsx` and add it to your app's `features` array: + +```typescript +import datadogPlugin from '@roadiehq/backstage-plugin-datadog/alpha'; +// ... +export const app = createApp({ + features: [ + // ... + datadogPlugin, + // ... + ], +}); +``` + +2. Next, enable your desired extensions in `app-config.yaml`. By default, the content and cards will only appear on entities that are components or resources. You can override that behavior by adding a config block, demonstrated on the 'datadog-graph' card. + +```yaml +app: + extensions: + - entity-content:datadog/entity + - entity-card:datadog/datadog-graph: + config: + filter: kind:component,api,resource +``` + ## Specify datadog domain Datadog embedded graph is using `datadoghq.eu`as default top-level domain, when other is not specified. If you are using other domain, you need to specify it with corresponding annotations `datadoghq.com/site`. diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx index 68d3f3cb7..1937c8947 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx @@ -6,6 +6,7 @@ import { createEntityCardExtension } from '@backstage/plugin-catalog-react/alpha */ export const entityDatadogGraphCard = createEntityCardExtension({ name: 'datadog-graph', + filter: 'kind:component,resource', loader: () => import('../components/GraphWidget').then(m => ), }); diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx index 21c55aeba..d1263c496 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx @@ -13,6 +13,7 @@ export const entityDatadogContent = createEntityContentExtension({ defaultPath: '/datadog', defaultTitle: 'Datadog', name: 'entity', + filter: 'kind:component,resource', routeRef: convertLegacyRouteRef(entityContentRouteRef), loader: () => import('../Router').then(m => compatWrapper()), }); From ac5bb2db56b4acbcd6133f5b13b31d1cdf1a0cc9 Mon Sep 17 00:00:00 2001 From: Alex McKay Date: Tue, 27 Aug 2024 10:35:13 -0400 Subject: [PATCH 2/3] use updated syntax from 1.30 release Signed-off-by: Alex McKay --- .../src/alpha/entityCards.test.tsx | 37 ++++++++-------- .../src/alpha/entityCards.tsx | 12 +++--- .../src/alpha/entityContent.test.tsx | 42 +++++++++---------- .../src/alpha/entityContent.tsx | 16 +++---- 4 files changed, 54 insertions(+), 53 deletions(-) diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.test.tsx b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.test.tsx index 06d904746..76157fb01 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.test.tsx +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.test.tsx @@ -1,29 +1,30 @@ import { screen, waitFor } from '@testing-library/react'; -import { createExtensionTester } from '@backstage/frontend-test-utils'; -import { entityDatadogGraphCard } from './entityCards'; import { - createApiExtension, - createApiFactory, -} from '@backstage/frontend-plugin-api'; + createExtensionTester, + renderInTestApp, + TestApiProvider, +} from '@backstage/frontend-test-utils'; +import { EntityProvider } from '@backstage/plugin-catalog-react'; +import { entityDatadogGraphCard } from './entityCards'; import { DatadogApi, datadogApiRef } from '../api'; import { entityWithDatadogAnnotations } from '../mocks/mocks'; - -jest.mock('@backstage/plugin-catalog-react', () => ({ - ...jest.requireActual('@backstage/plugin-catalog-react'), - useEntity: () => entityWithDatadogAnnotations, -})); +import React from 'react'; describe('Entity content extensions', () => { - const mockDatadogApi = createApiExtension({ - factory: createApiFactory({ - api: datadogApiRef, - deps: {}, - factory: () => ({} as unknown as DatadogApi), - }), - }); + const mockDatadogApi = { + api: datadogApiRef, + deps: {}, + factory: () => ({} as unknown as DatadogApi), + }; it('should render the graph card on an entity with the correct annotation', async () => { - createExtensionTester(entityDatadogGraphCard).add(mockDatadogApi).render(); + renderInTestApp( + + + {createExtensionTester(entityDatadogGraphCard).reactElement()} + + , + ); await waitFor( () => { expect(screen.getByText('Datadog Graph')).toBeInTheDocument(); diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx index 1937c8947..d67b7c59c 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityCards.tsx @@ -1,12 +1,14 @@ import React from 'react'; -import { createEntityCardExtension } from '@backstage/plugin-catalog-react/alpha'; +import { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha'; /** * @alpha */ -export const entityDatadogGraphCard = createEntityCardExtension({ +export const entityDatadogGraphCard = EntityCardBlueprint.make({ name: 'datadog-graph', - filter: 'kind:component,resource', - loader: () => - import('../components/GraphWidget').then(m => ), + params: { + filter: 'kind:component,resource', + loader: () => + import('../components/GraphWidget').then(m => ), + }, }); diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.test.tsx b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.test.tsx index 9da875dd6..3f268f286 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.test.tsx +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.test.tsx @@ -1,34 +1,30 @@ import { screen, waitFor } from '@testing-library/react'; -import { createExtensionTester } from '@backstage/frontend-test-utils'; -import { entityDatadogContent } from './entityContent'; import { - createApiExtension, - createApiFactory, -} from '@backstage/frontend-plugin-api'; + createExtensionTester, + renderInTestApp, + TestApiProvider, +} from '@backstage/frontend-test-utils'; +import { EntityProvider } from '@backstage/plugin-catalog-react'; +import { entityDatadogContent } from './entityContent'; import { DatadogApi, datadogApiRef } from '../api'; import { entityWithDatadogAnnotations } from '../mocks/mocks'; - -jest.mock('@backstage/plugin-catalog-react', () => ({ - ...jest.requireActual('@backstage/plugin-catalog-react'), - useEntity: () => entityWithDatadogAnnotations, -})); - -jest.mock('@backstage/core-plugin-api', () => ({ - ...jest.requireActual('@backstage/core-plugin-api'), - useRouteRef: () => () => '/datadog', -})); +import React from 'react'; describe('Entity content extensions', () => { - const mockDatadogApi = createApiExtension({ - factory: createApiFactory({ - api: datadogApiRef, - deps: {}, - factory: () => ({} as unknown as DatadogApi), - }), - }); + const mockDatadogApi = { + api: datadogApiRef, + deps: {}, + factory: () => ({} as unknown as DatadogApi), + }; it('should render the dashboard on an entity with the correct annotation', async () => { - createExtensionTester(entityDatadogContent).add(mockDatadogApi).render(); + renderInTestApp( + + + {createExtensionTester(entityDatadogContent).reactElement()} + + , + ); await waitFor( () => { expect(screen.getByTestId('Datadog dashboard 0')).toBeInTheDocument(); diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx index d1263c496..3a888f89e 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/entityContent.tsx @@ -2,18 +2,20 @@ import { compatWrapper, convertLegacyRouteRef, } from '@backstage/core-compat-api'; -import { createEntityContentExtension } from '@backstage/plugin-catalog-react/alpha'; +import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha'; import { entityContentRouteRef } from '../plugin'; import React from 'react'; /** * @alpha */ -export const entityDatadogContent = createEntityContentExtension({ - defaultPath: '/datadog', - defaultTitle: 'Datadog', +export const entityDatadogContent = EntityContentBlueprint.make({ name: 'entity', - filter: 'kind:component,resource', - routeRef: convertLegacyRouteRef(entityContentRouteRef), - loader: () => import('../Router').then(m => compatWrapper()), + params: { + defaultPath: '/datadog', + defaultTitle: 'Datadog', + filter: 'kind:component,resource', + routeRef: convertLegacyRouteRef(entityContentRouteRef), + loader: () => import('../Router').then(m => compatWrapper()), + }, }); From b53fa7b0fc63d72ded69f614604067bccff5d6c4 Mon Sep 17 00:00:00 2001 From: Alex McKay Date: Thu, 29 Aug 2024 16:44:26 -0400 Subject: [PATCH 3/3] Merge branch 'main' into addDefaultFilter Signed-off-by: Alex McKay --- packages/backend/CHANGELOG.md | 20 ++++ packages/backend/package.json | 30 +++--- .../backstage-aws-backend/CHANGELOG.md | 6 ++ .../backstage-aws-backend/package.json | 8 +- .../CHANGELOG.md | 6 ++ .../package.json | 8 +- .../backstage-plugin-aws-auth/CHANGELOG.md | 6 ++ .../backstage-plugin-aws-auth/package.json | 8 +- .../catalog-backend-module-aws/CHANGELOG.md | 6 ++ .../catalog-backend-module-aws/package.json | 6 +- .../CHANGELOG.md | 6 ++ .../package.json | 13 ++- .../catalog-backend-module-okta/CHANGELOG.md | 6 ++ .../catalog-backend-module-okta/package.json | 16 ++- .../CHANGELOG.md | 10 ++ .../package.json | 12 ++- .../CHANGELOG.md | 9 ++ .../package.json | 10 +- .../CHANGELOG.md | 8 ++ .../package.json | 8 +- plugins/backend/rag-ai-backend/CHANGELOG.md | 14 +++ plugins/backend/rag-ai-backend/package.json | 10 +- .../src/service/RagAiController.ts | 16 ++- plugins/backend/rag-ai-node/CHANGELOG.md | 6 ++ plugins/backend/rag-ai-node/package.json | 2 +- .../rag-ai-storage-pgvector/CHANGELOG.md | 8 ++ .../rag-ai-storage-pgvector/package.json | 8 +- .../backstage-plugin-argo-cd/CHANGELOG.md | 12 +++ .../backstage-plugin-argo-cd/package.json | 28 ++++- .../backstage-plugin-argo-cd/src/alpha.ts | 2 + .../src/alpha/apis.tsx | 33 ++++++ .../src/alpha/entityCards.test.tsx | 47 +++++++++ .../src/alpha/entityCards.tsx | 30 ++++++ .../src/alpha/index.ts | 1 + .../src/alpha/pages.tsx | 22 ++++ .../src/alpha/plugin.tsx | 26 +++++ .../src/components/ArgoCDDetailsCard.tsx | 6 +- .../src/components/ArgoCDHistoryCard.tsx | 9 +- .../backstage-plugin-aws-lambda/CHANGELOG.md | 6 ++ .../backstage-plugin-aws-lambda/package.json | 9 +- .../backstage-plugin-aws/CHANGELOG.md | 6 ++ .../backstage-plugin-aws/package.json | 9 +- .../CHANGELOG.md | 6 ++ .../package.json | 8 +- .../backstage-plugin-bugsnag/CHANGELOG.md | 6 ++ .../backstage-plugin-bugsnag/package.json | 9 +- .../backstage-plugin-buildkite/CHANGELOG.md | 6 ++ .../backstage-plugin-buildkite/package.json | 9 +- .../backstage-plugin-cloudsmith/CHANGELOG.md | 6 ++ .../backstage-plugin-cloudsmith/package.json | 9 +- .../backstage-plugin-datadog/CHANGELOG.md | 6 ++ .../backstage-plugin-datadog/package.json | 3 +- .../src/alpha/apis.ts | 16 +-- .../CHANGELOG.md | 6 ++ .../package.json | 9 +- .../CHANGELOG.md | 6 ++ .../package.json | 9 +- .../backstage-plugin-iframe/CHANGELOG.md | 6 ++ .../backstage-plugin-iframe/package.json | 9 +- .../backstage-plugin-jira/CHANGELOG.md | 6 ++ .../backstage-plugin-jira/package.json | 9 +- .../.eslintrc.js | 5 + .../CHANGELOG.md | 25 +++++ .../backstage-plugin-launchdarkly/README.md | 47 +++++++++ .../card-screenshot.png | Bin 0 -> 137859 bytes .../package.json | 58 +++++++++++ .../EntityLaunchdarklyOverviewCard.tsx | 97 ++++++++++++++++++ .../EntityLaunchdarklyOverviewCard/index.ts | 16 +++ .../src/constants.ts | 21 ++++ .../src/hooks/useLaunchdarklyFlags.ts | 46 +++++++++ .../src/index.ts | 20 ++++ .../src/plugin.test.ts | 7 ++ .../src/plugin.ts | 59 +++++++++++ .../src/routes.ts | 20 ++++ .../src/setupTests.ts | 16 +++ .../backstage-plugin-prometheus/CHANGELOG.md | 6 ++ .../backstage-plugin-prometheus/package.json | 9 +- .../CHANGELOG.md | 6 ++ .../package.json | 9 +- .../backstage-plugin-shortcut/CHANGELOG.md | 6 ++ .../backstage-plugin-shortcut/package.json | 9 +- .../backstage-plugin-travis-ci/CHANGELOG.md | 6 ++ .../backstage-plugin-travis-ci/package.json | 9 +- plugins/frontend/rag-ai/CHANGELOG.md | 6 ++ plugins/frontend/rag-ai/package.json | 8 +- .../CHANGELOG.md | 6 ++ .../package.json | 9 +- .../backstage-plugin-home-rss/CHANGELOG.md | 6 ++ .../backstage-plugin-home-rss/package.json | 9 +- .../scaffolder-backend-argocd/CHANGELOG.md | 8 ++ .../scaffolder-backend-argocd/package.json | 8 +- .../CHANGELOG.md | 6 ++ .../package.json | 6 +- .../CHANGELOG.md | 6 ++ .../package.json | 16 ++- .../CHANGELOG.md | 6 ++ .../package.json | 9 +- .../CHANGELOG.md | 6 ++ .../package.json | 9 +- .../CHANGELOG.md | 6 ++ .../package.json | 2 +- yarn.lock | 38 ++----- 102 files changed, 1184 insertions(+), 139 deletions(-) create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha.ts create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha/apis.tsx create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.test.tsx create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.tsx create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha/index.ts create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha/pages.tsx create mode 100644 plugins/frontend/backstage-plugin-argo-cd/src/alpha/plugin.tsx create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/.eslintrc.js create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/CHANGELOG.md create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/README.md create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/card-screenshot.png create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/package.json create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/components/EntityLaunchdarklyOverviewCard/EntityLaunchdarklyOverviewCard.tsx create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/components/EntityLaunchdarklyOverviewCard/index.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/constants.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/hooks/useLaunchdarklyFlags.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/index.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/plugin.test.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/plugin.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/routes.ts create mode 100644 plugins/frontend/backstage-plugin-launchdarkly/src/setupTests.ts diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index c05a896db..6b72c9400 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,25 @@ # backend +## 2.1.15 + +### Patch Changes + +- Updated dependencies [d6ae6e9] + - @roadiehq/scaffolder-backend-module-http-request@4.3.3 + - @roadiehq/scaffolder-backend-module-utils@2.0.1 + - @roadiehq/scaffolder-backend-module-aws@2.4.25 + - @roadiehq/rag-ai-backend-retrieval-augmenter@0.3.8 + - @roadiehq/backstage-plugin-argo-cd-backend@3.0.4 + - @roadiehq/rag-ai-backend-embeddings-openai@0.2.8 + - @roadiehq/catalog-backend-module-gravatar@1.0.3 + - @roadiehq/rag-ai-backend-embeddings-aws@0.2.8 + - @roadiehq/catalog-backend-module-okta@0.10.2 + - @roadiehq/catalog-backend-module-aws@5.0.2 + - @roadiehq/backstage-plugin-aws-auth@0.4.24 + - @roadiehq/rag-ai-storage-pgvector@0.1.6 + - @roadiehq/backstage-plugin-aws-backend@1.1.24 + - @roadiehq/rag-ai-backend@1.0.2 + ## 2.1.14 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index b10c7ebc6..174b676b2 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "backend", - "version": "2.1.14", + "version": "2.1.15", "main": "dist/index.cjs.js", "types": "src/index.ts", "private": true, @@ -42,20 +42,20 @@ "@langchain/core": "^0.2.27", "@langchain/openai": "^0.2.7", "@octokit/rest": "^19.0.3", - "@roadiehq/backstage-plugin-argo-cd-backend": "3.0.3", - "@roadiehq/backstage-plugin-aws-auth": "^0.4.23", - "@roadiehq/backstage-plugin-aws-backend": "^1.1.23", - "@roadiehq/catalog-backend-module-aws": "^5.0.0", - "@roadiehq/catalog-backend-module-okta": "^0.10.0", - "@roadiehq/rag-ai-backend": "^1.0.0", - "@roadiehq/rag-ai-backend-embeddings-aws": "^0.2.7", - "@roadiehq/rag-ai-backend-embeddings-openai": "^0.2.7", - "@roadiehq/rag-ai-backend-retrieval-augmenter": "^0.3.7", - "@roadiehq/rag-ai-storage-pgvector": "^0.1.5", - "@roadiehq/catalog-backend-module-gravatar": "^1.0.0", - "@roadiehq/scaffolder-backend-module-aws": "^2.4.24", - "@roadiehq/scaffolder-backend-module-http-request": "^4.3.2", - "@roadiehq/scaffolder-backend-module-utils": "^2.0.0", + "@roadiehq/backstage-plugin-argo-cd-backend": "3.0.4", + "@roadiehq/backstage-plugin-aws-auth": "^0.4.24", + "@roadiehq/backstage-plugin-aws-backend": "^1.1.24", + "@roadiehq/catalog-backend-module-aws": "^5.0.2", + "@roadiehq/catalog-backend-module-okta": "^0.10.2", + "@roadiehq/rag-ai-backend": "^1.0.2", + "@roadiehq/rag-ai-backend-embeddings-aws": "^0.2.8", + "@roadiehq/rag-ai-backend-embeddings-openai": "^0.2.8", + "@roadiehq/rag-ai-backend-retrieval-augmenter": "^0.3.8", + "@roadiehq/rag-ai-storage-pgvector": "^0.1.6", + "@roadiehq/catalog-backend-module-gravatar": "^1.0.3", + "@roadiehq/scaffolder-backend-module-aws": "^2.4.25", + "@roadiehq/scaffolder-backend-module-http-request": "^4.3.3", + "@roadiehq/scaffolder-backend-module-utils": "^2.0.1", "app": "^1.1.3", "better-sqlite3": "^9.0.0", "dockerode": "^3.3.0", diff --git a/plugins/backend/backstage-aws-backend/CHANGELOG.md b/plugins/backend/backstage-aws-backend/CHANGELOG.md index f77b38d32..0a0462b30 100644 --- a/plugins/backend/backstage-aws-backend/CHANGELOG.md +++ b/plugins/backend/backstage-aws-backend/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-aws-backend +## 1.1.24 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.1.23 ### Patch Changes diff --git a/plugins/backend/backstage-aws-backend/package.json b/plugins/backend/backstage-aws-backend/package.json index 417522f25..37ad71b10 100644 --- a/plugins/backend/backstage-aws-backend/package.json +++ b/plugins/backend/backstage-aws-backend/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-aws-backend", - "version": "1.1.23", + "version": "1.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin" + "role": "backend-plugin", + "pluginId": "backstage-plugin-aws-backend", + "pluginPackages": [ + "@roadiehq/backstage-plugin-aws-backend" + ] }, "repository": { "type": "git", diff --git a/plugins/backend/backstage-plugin-argo-cd-backend/CHANGELOG.md b/plugins/backend/backstage-plugin-argo-cd-backend/CHANGELOG.md index 7525f412f..5c43d14f8 100644 --- a/plugins/backend/backstage-plugin-argo-cd-backend/CHANGELOG.md +++ b/plugins/backend/backstage-plugin-argo-cd-backend/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-argo-cd-backend +## 3.0.4 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 3.0.3 ### Patch Changes diff --git a/plugins/backend/backstage-plugin-argo-cd-backend/package.json b/plugins/backend/backstage-plugin-argo-cd-backend/package.json index f224adad8..1d137694a 100644 --- a/plugins/backend/backstage-plugin-argo-cd-backend/package.json +++ b/plugins/backend/backstage-plugin-argo-cd-backend/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-argo-cd-backend", - "version": "3.0.3", + "version": "3.0.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin" + "role": "backend-plugin", + "pluginId": "backstage-plugin-argo-cd-backend", + "pluginPackages": [ + "@roadiehq/backstage-plugin-argo-cd-backend" + ] }, "repository": { "type": "git", diff --git a/plugins/backend/backstage-plugin-aws-auth/CHANGELOG.md b/plugins/backend/backstage-plugin-aws-auth/CHANGELOG.md index b68d10922..7c114dd72 100644 --- a/plugins/backend/backstage-plugin-aws-auth/CHANGELOG.md +++ b/plugins/backend/backstage-plugin-aws-auth/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-aws-auth +## 0.4.24 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 0.4.23 ### Patch Changes diff --git a/plugins/backend/backstage-plugin-aws-auth/package.json b/plugins/backend/backstage-plugin-aws-auth/package.json index df857336b..779826737 100644 --- a/plugins/backend/backstage-plugin-aws-auth/package.json +++ b/plugins/backend/backstage-plugin-aws-auth/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-aws-auth", - "version": "0.4.23", + "version": "0.4.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,7 +20,11 @@ "clean": "backstage-cli clean" }, "backstage": { - "role": "backend-plugin" + "role": "backend-plugin", + "pluginId": "backstage-plugin-aws-auth", + "pluginPackages": [ + "@roadiehq/backstage-plugin-aws-auth" + ] }, "repository": { "type": "git", diff --git a/plugins/backend/catalog-backend-module-aws/CHANGELOG.md b/plugins/backend/catalog-backend-module-aws/CHANGELOG.md index e0e107a79..2a9d40e7b 100644 --- a/plugins/backend/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/backend/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-catalog-backend-module-aws +## 5.0.2 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 5.0.1 ### Patch Changes diff --git a/plugins/backend/catalog-backend-module-aws/package.json b/plugins/backend/catalog-backend-module-aws/package.json index ccecddba5..8822061fe 100644 --- a/plugins/backend/catalog-backend-module-aws/package.json +++ b/plugins/backend/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@roadiehq/catalog-backend-module-aws", "description": "A set of Backstage catalog providers for AWS", - "version": "5.0.1", + "version": "5.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -12,7 +12,9 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "catalog-backend-module-aws", + "pluginPackage": "@backstage/plugin-catalog-backend" }, "homepage": "https://roadie.io", "repository": { diff --git a/plugins/backend/catalog-backend-module-gravatar/CHANGELOG.md b/plugins/backend/catalog-backend-module-gravatar/CHANGELOG.md index dde0e568f..2a605ad04 100644 --- a/plugins/backend/catalog-backend-module-gravatar/CHANGELOG.md +++ b/plugins/backend/catalog-backend-module-gravatar/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/catalog-backend-module-gravatar +## 1.0.3 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.0.2 ### Patch Changes diff --git a/plugins/backend/catalog-backend-module-gravatar/package.json b/plugins/backend/catalog-backend-module-gravatar/package.json index 4ac894a77..91e07a8cb 100644 --- a/plugins/backend/catalog-backend-module-gravatar/package.json +++ b/plugins/backend/catalog-backend-module-gravatar/package.json @@ -1,7 +1,7 @@ { "name": "@roadiehq/catalog-backend-module-gravatar", "description": "A set of Backstage catalog providers for gravatar", - "version": "1.0.2", + "version": "1.0.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -9,8 +9,17 @@ ".": "./src/index.ts", "./package.json": "./package.json" }, + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ] + } + }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "catalog-backend-module-gravatar", + "pluginPackage": "@backstage/plugin-catalog-backend" }, "homepage": "https://roadie.io", "repository": { diff --git a/plugins/backend/catalog-backend-module-okta/CHANGELOG.md b/plugins/backend/catalog-backend-module-okta/CHANGELOG.md index 721478554..ad3338ac0 100644 --- a/plugins/backend/catalog-backend-module-okta/CHANGELOG.md +++ b/plugins/backend/catalog-backend-module-okta/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/catalog-backend-module-okta +## 0.10.2 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 0.10.1 ### Patch Changes diff --git a/plugins/backend/catalog-backend-module-okta/package.json b/plugins/backend/catalog-backend-module-okta/package.json index 234646ecc..07ee9cdb6 100644 --- a/plugins/backend/catalog-backend-module-okta/package.json +++ b/plugins/backend/catalog-backend-module-okta/package.json @@ -1,7 +1,7 @@ { "name": "@roadiehq/catalog-backend-module-okta", "description": "A set of Backstage catalog providers for Okta", - "version": "0.10.1", + "version": "0.10.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,8 +10,20 @@ "./package.json": "./package.json", "./new-backend": "./src/new-backend.ts" }, + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ], + "new-backend": [ + "src/new-backend.ts" + ] + } + }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "catalog-backend-module-okta", + "pluginPackage": "@backstage/plugin-catalog-backend" }, "homepage": "https://roadie.io", "repository": { diff --git a/plugins/backend/rag-ai-backend-embeddings-aws/CHANGELOG.md b/plugins/backend/rag-ai-backend-embeddings-aws/CHANGELOG.md index 88d283dd7..d1841c5f1 100644 --- a/plugins/backend/rag-ai-backend-embeddings-aws/CHANGELOG.md +++ b/plugins/backend/rag-ai-backend-embeddings-aws/CHANGELOG.md @@ -1,5 +1,15 @@ # @roadiehq/rag-ai-backend-embeddings-aws +## 0.2.8 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata +- Updated dependencies [d6ae6e9] + - @roadiehq/rag-ai-backend-retrieval-augmenter@0.3.8 + - @roadiehq/rag-ai-backend@1.0.2 + - @roadiehq/rag-ai-node@0.1.6 + ## 0.2.7 ### Patch Changes diff --git a/plugins/backend/rag-ai-backend-embeddings-aws/package.json b/plugins/backend/rag-ai-backend-embeddings-aws/package.json index 91a614f99..4bbe19f53 100644 --- a/plugins/backend/rag-ai-backend-embeddings-aws/package.json +++ b/plugins/backend/rag-ai-backend-embeddings-aws/package.json @@ -1,7 +1,7 @@ { "name": "@roadiehq/rag-ai-backend-embeddings-aws", "description": "The AWS (Bedrock) backend module for the @roadiehq/rag-ai plugin.", - "version": "0.2.7", + "version": "0.2.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -11,7 +11,9 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "rag-ai-backend-embeddings-aws", + "pluginPackage": "@roadiehq/rag-ai-backend" }, "bugs": { "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", @@ -40,9 +42,9 @@ "@langchain/aws": "^0.0.10", "@langchain/community": "^0.2.28", "@langchain/core": "^0.2.27", - "@roadiehq/rag-ai-backend": "^1.0.0", - "@roadiehq/rag-ai-backend-retrieval-augmenter": "^0.3.7", - "@roadiehq/rag-ai-node": "^0.1.5", + "@roadiehq/rag-ai-backend": "^1.0.2", + "@roadiehq/rag-ai-backend-retrieval-augmenter": "^0.3.8", + "@roadiehq/rag-ai-node": "^0.1.6", "langchain": "^0.1.21", "winston": "^3.11.0" }, diff --git a/plugins/backend/rag-ai-backend-embeddings-openai/CHANGELOG.md b/plugins/backend/rag-ai-backend-embeddings-openai/CHANGELOG.md index c96086478..9497d7766 100644 --- a/plugins/backend/rag-ai-backend-embeddings-openai/CHANGELOG.md +++ b/plugins/backend/rag-ai-backend-embeddings-openai/CHANGELOG.md @@ -1,5 +1,14 @@ # @roadiehq/rag-ai-backend-embeddings-openai +## 0.2.8 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata +- Updated dependencies [d6ae6e9] + - @roadiehq/rag-ai-backend-retrieval-augmenter@0.3.8 + - @roadiehq/rag-ai-node@0.1.6 + ## 0.2.7 ### Patch Changes diff --git a/plugins/backend/rag-ai-backend-embeddings-openai/package.json b/plugins/backend/rag-ai-backend-embeddings-openai/package.json index 21e617e69..546c8c9cb 100644 --- a/plugins/backend/rag-ai-backend-embeddings-openai/package.json +++ b/plugins/backend/rag-ai-backend-embeddings-openai/package.json @@ -1,7 +1,7 @@ { "name": "@roadiehq/rag-ai-backend-embeddings-openai", "description": "The OpenAI backend module for the @roadiehq/rag-ai plugin.", - "version": "0.2.7", + "version": "0.2.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -11,7 +11,9 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "rag-ai-backend-embeddings-openai", + "pluginPackage": "@roadiehq/rag-ai-backend" }, "bugs": { "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", @@ -38,8 +40,8 @@ "@langchain/core": "^0.2.27", "@langchain/community": "^0.2.28", "@langchain/openai": "^0.2.7", - "@roadiehq/rag-ai-backend-retrieval-augmenter": "^0.3.7", - "@roadiehq/rag-ai-node": "^0.1.5", + "@roadiehq/rag-ai-backend-retrieval-augmenter": "^0.3.8", + "@roadiehq/rag-ai-node": "^0.1.6", "langchain": "^0.0.209", "winston": "^3.11.0" }, diff --git a/plugins/backend/rag-ai-backend-retrieval-augmenter/CHANGELOG.md b/plugins/backend/rag-ai-backend-retrieval-augmenter/CHANGELOG.md index 7993dc3d4..4906d32fa 100644 --- a/plugins/backend/rag-ai-backend-retrieval-augmenter/CHANGELOG.md +++ b/plugins/backend/rag-ai-backend-retrieval-augmenter/CHANGELOG.md @@ -1,5 +1,13 @@ # @roadiehq/rag-ai-backend-retrieval-augmenter +## 0.3.8 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata +- Updated dependencies [d6ae6e9] + - @roadiehq/rag-ai-node@0.1.6 + ## 0.3.7 ### Patch Changes diff --git a/plugins/backend/rag-ai-backend-retrieval-augmenter/package.json b/plugins/backend/rag-ai-backend-retrieval-augmenter/package.json index 8c472861a..b1f7475dc 100644 --- a/plugins/backend/rag-ai-backend-retrieval-augmenter/package.json +++ b/plugins/backend/rag-ai-backend-retrieval-augmenter/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/rag-ai-backend-retrieval-augmenter", - "version": "0.3.7", + "version": "0.3.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,9 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin" + "role": "backend-plugin-module", + "pluginId": "rag-ai-backend-retrieval-augmenter", + "pluginPackage": "@roadiehq/rag-ai-backend" }, "bugs": { "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", @@ -38,7 +40,7 @@ "@backstage/config": "^1.2.0", "@backstage/plugin-search-common": "^1.2.14", "@langchain/core": "^0.2.27", - "@roadiehq/rag-ai-node": "^0.1.5", + "@roadiehq/rag-ai-node": "^0.1.6", "langchain": "^0.1.21", "node-fetch": "^2.6.7", "p-limit": "^3.0.2", diff --git a/plugins/backend/rag-ai-backend/CHANGELOG.md b/plugins/backend/rag-ai-backend/CHANGELOG.md index 479a93f34..e206d39ba 100644 --- a/plugins/backend/rag-ai-backend/CHANGELOG.md +++ b/plugins/backend/rag-ai-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @roadiehq/rag-ai-backend +## 1.0.2 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata +- Updated dependencies [d6ae6e9] + - @roadiehq/rag-ai-node@0.1.6 + +## 1.0.1 + +### Patch Changes + +- 5fd75a3: Fixed missing newlines + ## 1.0.0 ### Major Changes diff --git a/plugins/backend/rag-ai-backend/package.json b/plugins/backend/rag-ai-backend/package.json index b01136b30..9b352cf28 100644 --- a/plugins/backend/rag-ai-backend/package.json +++ b/plugins/backend/rag-ai-backend/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/rag-ai-backend", - "version": "1.0.0", + "version": "1.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin" + "role": "backend-plugin", + "pluginId": "rag-ai-backend", + "pluginPackages": [ + "@roadiehq/rag-ai-backend" + ] }, "bugs": { "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", @@ -34,7 +38,7 @@ "@backstage/backend-common": "^0.24.0", "@backstage/config": "^1.2.0", "@langchain/core": "^0.2.27", - "@roadiehq/rag-ai-node": "^0.1.5", + "@roadiehq/rag-ai-node": "^0.1.6", "@types/express": "*", "@backstage/backend-plugin-api": "^0.8.0", "express": "^4.17.1", diff --git a/plugins/backend/rag-ai-backend/src/service/RagAiController.ts b/plugins/backend/rag-ai-backend/src/service/RagAiController.ts index e8c18c658..0e6e5a7d0 100644 --- a/plugins/backend/rag-ai-backend/src/service/RagAiController.ts +++ b/plugins/backend/rag-ai-backend/src/service/RagAiController.ts @@ -136,13 +136,25 @@ export class RagAiController { const stream = await this.llmService.query(embeddingDocs, query); for await (const chunk of stream) { - const text = typeof chunk === 'string' ? chunk : chunk.content; + const text = + typeof chunk === 'string' ? chunk : (chunk.content as string); const event = `event: response\n`; - const data = `data: ${text}\n\n`; + const data = this.parseSseText(text); res.write(event + data); res.flush?.(); } res.end(); }; + + private parseSseText = (text: string): string => { + const lines = text.split('\n'); + + const output = lines.reduce((result, line) => { + const data = `data: ${line}\n`; + return result + data; + }, ''); + + return `${output}\n`; + }; } diff --git a/plugins/backend/rag-ai-node/CHANGELOG.md b/plugins/backend/rag-ai-node/CHANGELOG.md index ac3b9230f..7eae97e73 100644 --- a/plugins/backend/rag-ai-node/CHANGELOG.md +++ b/plugins/backend/rag-ai-node/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/rag-ai-node +## 0.1.6 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 0.1.5 ### Patch Changes diff --git a/plugins/backend/rag-ai-node/package.json b/plugins/backend/rag-ai-node/package.json index 79d2881b8..6f708525a 100644 --- a/plugins/backend/rag-ai-node/package.json +++ b/plugins/backend/rag-ai-node/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/rag-ai-node", - "version": "0.1.5", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/backend/rag-ai-storage-pgvector/CHANGELOG.md b/plugins/backend/rag-ai-storage-pgvector/CHANGELOG.md index d71719fd7..5b5869370 100644 --- a/plugins/backend/rag-ai-storage-pgvector/CHANGELOG.md +++ b/plugins/backend/rag-ai-storage-pgvector/CHANGELOG.md @@ -1,5 +1,13 @@ # @roadiehq/rag-ai-storage-pgvector +## 0.1.6 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata +- Updated dependencies [d6ae6e9] + - @roadiehq/rag-ai-node@0.1.6 + ## 0.1.5 ### Patch Changes diff --git a/plugins/backend/rag-ai-storage-pgvector/package.json b/plugins/backend/rag-ai-storage-pgvector/package.json index 8e22b6178..e54a9588a 100644 --- a/plugins/backend/rag-ai-storage-pgvector/package.json +++ b/plugins/backend/rag-ai-storage-pgvector/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/rag-ai-storage-pgvector", - "version": "0.1.5", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,9 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin" + "role": "backend-plugin-module", + "pluginId": "rag-ai-storage-pgvector", + "pluginPackage": "@roadiehq/rag-ai-backend" }, "bugs": { "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", @@ -34,7 +36,7 @@ "@backstage/backend-common": "^0.24.0", "@backstage/config": "^1.2.0", "@langchain/core": "^0.2.27", - "@roadiehq/rag-ai-node": "^0.1.5", + "@roadiehq/rag-ai-node": "^0.1.6", "knex": "^3.0.0", "winston": "^3.2.1" }, diff --git a/plugins/frontend/backstage-plugin-argo-cd/CHANGELOG.md b/plugins/frontend/backstage-plugin-argo-cd/CHANGELOG.md index 53b0fca95..5b01773eb 100644 --- a/plugins/frontend/backstage-plugin-argo-cd/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-argo-cd/CHANGELOG.md @@ -1,5 +1,17 @@ # @roadiehq/backstage-plugin-argo-cd +## 2.7.0 + +### Minor Changes + +- 971f076: Adds support for Backstage's new frontend system, available via the `/alpha` sub-path export. + +## 2.6.7 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.6.6 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-argo-cd/package.json b/plugins/frontend/backstage-plugin-argo-cd/package.json index de882d534..2ce178856 100644 --- a/plugins/frontend/backstage-plugin-argo-cd/package.json +++ b/plugins/frontend/backstage-plugin-argo-cd/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-argo-cd", - "version": "2.6.6", + "version": "2.7.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,8 +20,29 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-argo-cd", + "pluginPackages": [ + "@roadiehq/backstage-plugin-argo-cd", + "@roadiehq/backstage-plugin-argo-cd-backend" + ] }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", @@ -34,8 +55,10 @@ }, "dependencies": { "@backstage/catalog-model": "^1.6.0", + "@backstage/core-compat-api": "^0.2.8", "@backstage/core-components": "^0.14.10", "@backstage/core-plugin-api": "^1.9.3", + "@backstage/frontend-plugin-api": "^0.7.0", "@backstage/plugin-catalog-react": "^1.12.3", "@backstage/theme": "^0.5.6", "@material-ui/core": "^4.12.2", @@ -66,6 +89,7 @@ "@rollup/plugin-node-resolve": "^15.0.1", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^14.0.0", + "@backstage/frontend-test-utils": "^0.1.12", "esbuild": "^0.11.13", "jest-environment-jsdom": "^29.2.1", "msw": "^1.0.1", diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha.ts b/plugins/frontend/backstage-plugin-argo-cd/src/alpha.ts new file mode 100644 index 000000000..de7705b2d --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha.ts @@ -0,0 +1,2 @@ +export * from './alpha/index'; +export { default } from './alpha/index'; diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha/apis.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/apis.tsx new file mode 100644 index 000000000..9490f30f7 --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/apis.tsx @@ -0,0 +1,33 @@ +import { + createApiExtension, + createApiFactory, + discoveryApiRef, +} from '@backstage/frontend-plugin-api'; +import { ArgoCDApiClient, argoCDApiRef } from '../api'; +import { configApiRef, identityApiRef } from '@backstage/core-plugin-api'; + +/** + * @alpha + */ +export const argoCDApiExtension = createApiExtension({ + factory: createApiFactory({ + api: argoCDApiRef, + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + configApi: configApiRef, + }, + factory: ({ discoveryApi, identityApi, configApi }) => + new ArgoCDApiClient({ + discoveryApi, + identityApi, + backendBaseUrl: configApi.getString('backend.baseUrl'), + useNamespacedApps: Boolean( + configApi.getOptionalBoolean('argocd.namespacedApps'), + ), + searchInstances: Boolean( + configApi.getOptionalConfigArray('argocd.appLocatorMethods')?.length, + ), + }), + }), +}); diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.test.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.test.tsx new file mode 100644 index 000000000..cf00b92f1 --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.test.tsx @@ -0,0 +1,47 @@ +import { screen, waitFor } from '@testing-library/react'; +import { + createExtensionTester, + TestApiProvider, + renderInTestApp, +} from '@backstage/frontend-test-utils'; +import { + entityArgoCDOverviewCard, + entityArgoCDHistoryCard, +} from './entityCards'; +import { ArgoCDApiClient, argoCDApiRef } from '../api'; +import { getEntityStub } from '../mocks/mocks'; +import React from 'react'; +import { EntityProvider } from '@backstage/plugin-catalog-react'; + +describe('Entity cards extensions', () => { + const mockArgocdApi = {} as unknown as ArgoCDApiClient; + const mockedEntity = getEntityStub; + + it('should render the overview card on an entity', async () => { + renderInTestApp( + + + {createExtensionTester(entityArgoCDOverviewCard).reactElement()} + + , + ); + + await waitFor(() => { + expect(screen.getByText('ArgoCD overview')).toBeInTheDocument(); + }); + }); + + it('should render the history card on an entity', async () => { + renderInTestApp( + + + {createExtensionTester(entityArgoCDHistoryCard).reactElement()} + + , + ); + + await waitFor(() => { + expect(screen.getByText('ArgoCD history')).toBeInTheDocument(); + }); + }); +}); diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.tsx new file mode 100644 index 000000000..91cfaac1a --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/entityCards.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha'; + +/** + * @alpha + */ +export const entityArgoCDOverviewCard = EntityCardBlueprint.make({ + name: 'overviewCard', + params: { + filter: 'kind:component', + loader: () => + import('../components/ArgoCDDetailsCard').then(m => ( + + )), + }, +}); + +/** + * @alpha + */ +export const entityArgoCDHistoryCard: any = EntityCardBlueprint.make({ + name: 'historyCard', + params: { + filter: 'kind:component', + loader: () => + import('../components/ArgoCDHistoryCard').then(m => ( + + )), + }, +}); diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha/index.ts b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/index.ts new file mode 100644 index 000000000..b68aea57f --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/index.ts @@ -0,0 +1 @@ +export { default } from './plugin'; diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha/pages.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/pages.tsx new file mode 100644 index 000000000..e87f6060c --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/pages.tsx @@ -0,0 +1,22 @@ +import React from 'react'; // Add this line to import React + +import { createPageExtension } from '@backstage/frontend-plugin-api'; +import { + compatWrapper, + convertLegacyRouteRef, +} from '@backstage/core-compat-api'; +import { entityContentRouteRef } from '../plugin'; + +/** + * @alpha + */ +export const argoCdPage = createPageExtension({ + name: 'ArgoCdPage', + namespace: 'argocd', + defaultPath: '/', + // you can reuse the existing routeRef + // by wrapping into the convertLegacyRouteRef. + routeRef: convertLegacyRouteRef(entityContentRouteRef), + // these inputs usually match the props required by the component. + loader: () => import('../Router').then(m => compatWrapper()), +}); diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/alpha/plugin.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/plugin.tsx new file mode 100644 index 000000000..f1cb46706 --- /dev/null +++ b/plugins/frontend/backstage-plugin-argo-cd/src/alpha/plugin.tsx @@ -0,0 +1,26 @@ +import { convertLegacyRouteRefs } from '@backstage/core-compat-api'; +import { createPlugin, BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { + entityArgoCDOverviewCard, + entityArgoCDHistoryCard, +} from './entityCards'; +import { argoCDApiExtension } from './apis'; + +import { entityContentRouteRef } from '../plugin'; +import { argoCdPage } from './pages'; + +/** + * @alpha + */ +const plugin: BackstagePlugin = createPlugin({ + id: 'argocd', + extensions: [ + argoCdPage, + entityArgoCDOverviewCard, + entityArgoCDHistoryCard, + argoCDApiExtension, + ], + routes: convertLegacyRouteRefs({ argocd: entityContentRouteRef }), +}); + +export default plugin; diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDDetailsCard.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDDetailsCard.tsx index 3d0db4269..31b344eb2 100644 --- a/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDDetailsCard.tsx +++ b/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDDetailsCard.tsx @@ -32,7 +32,6 @@ import { import { ErrorBoundary, InfoCard, - MissingAnnotationEmptyState, Table, TableColumn, } from '@backstage/core-components'; @@ -41,7 +40,10 @@ import { isArgocdAvailable } from '../conditions'; import { ArgoCDAppDetails, ArgoCDAppList } from '../types'; import { useAppDetails } from './useAppDetails'; import SyncIcon from '@material-ui/icons/Sync'; -import { useEntity } from '@backstage/plugin-catalog-react'; +import { + MissingAnnotationEmptyState, + useEntity, +} from '@backstage/plugin-catalog-react'; import { DetailsDrawerComponent as detailsDrawerComponent } from './DetailsDrawer'; interface Condition { diff --git a/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDHistoryCard.tsx b/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDHistoryCard.tsx index f819e1843..a484d109b 100644 --- a/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDHistoryCard.tsx +++ b/plugins/frontend/backstage-plugin-argo-cd/src/components/ArgoCDHistoryCard.tsx @@ -15,13 +15,12 @@ */ import { Entity } from '@backstage/catalog-model'; +import { ErrorBoundary, InfoCard } from '@backstage/core-components'; +import { configApiRef, useApi } from '@backstage/core-plugin-api'; import { - ErrorBoundary, - InfoCard, MissingAnnotationEmptyState, -} from '@backstage/core-components'; -import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { useEntity } from '@backstage/plugin-catalog-react'; + useEntity, +} from '@backstage/plugin-catalog-react'; import { LinearProgress } from '@material-ui/core'; import React, { useEffect, useState } from 'react'; import { isArgocdAvailable } from '../conditions'; diff --git a/plugins/frontend/backstage-plugin-aws-lambda/CHANGELOG.md b/plugins/frontend/backstage-plugin-aws-lambda/CHANGELOG.md index 423b0256a..41185a6d4 100644 --- a/plugins/frontend/backstage-plugin-aws-lambda/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-aws-lambda/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-aws-lambda +## 2.2.10 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.2.9 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-aws-lambda/package.json b/plugins/frontend/backstage-plugin-aws-lambda/package.json index c7a4f8ce3..dfcbf0ca0 100644 --- a/plugins/frontend/backstage-plugin-aws-lambda/package.json +++ b/plugins/frontend/backstage-plugin-aws-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-aws-lambda", - "version": "2.2.9", + "version": "2.2.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,8 +21,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-aws-lambda", + "pluginPackages": [ + "@roadiehq/backstage-plugin-aws-lambda" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-aws/CHANGELOG.md b/plugins/frontend/backstage-plugin-aws/CHANGELOG.md index 81e8e7c29..e949ac702 100644 --- a/plugins/frontend/backstage-plugin-aws/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-aws/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-aws +## 1.1.24 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.1.23 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-aws/package.json b/plugins/frontend/backstage-plugin-aws/package.json index 69d538e6f..824c9ca70 100644 --- a/plugins/frontend/backstage-plugin-aws/package.json +++ b/plugins/frontend/backstage-plugin-aws/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-aws", - "version": "1.1.23", + "version": "1.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,8 +21,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-aws", + "pluginPackages": [ + "@roadiehq/backstage-plugin-aws" + ] }, + "sideEffects": false, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/frontend/backstage-plugin-bitbucket-pullrequest/CHANGELOG.md b/plugins/frontend/backstage-plugin-bitbucket-pullrequest/CHANGELOG.md index 4cbcd4f62..a20e1758c 100644 --- a/plugins/frontend/backstage-plugin-bitbucket-pullrequest/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-bitbucket-pullrequest/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-bitbucket-pullrequest +## 2.0.2 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.0.1 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-bitbucket-pullrequest/package.json b/plugins/frontend/backstage-plugin-bitbucket-pullrequest/package.json index ba958348f..44e6a2634 100644 --- a/plugins/frontend/backstage-plugin-bitbucket-pullrequest/package.json +++ b/plugins/frontend/backstage-plugin-bitbucket-pullrequest/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-bitbucket-pullrequest", - "version": "2.0.1", + "version": "2.0.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -15,7 +15,11 @@ "directory": "plugins/frontend/backstage-plugin-bitbucket-pullrequest" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-bitbucket-pullrequest", + "pluginPackages": [ + "@roadiehq/backstage-plugin-bitbucket-pullrequest" + ] }, "sideEffects": false, "scripts": { diff --git a/plugins/frontend/backstage-plugin-bugsnag/CHANGELOG.md b/plugins/frontend/backstage-plugin-bugsnag/CHANGELOG.md index e21223e16..9eb995452 100644 --- a/plugins/frontend/backstage-plugin-bugsnag/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-bugsnag/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-bugsnag +## 2.2.10 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.2.9 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-bugsnag/package.json b/plugins/frontend/backstage-plugin-bugsnag/package.json index ea3769e2f..45cebfec1 100644 --- a/plugins/frontend/backstage-plugin-bugsnag/package.json +++ b/plugins/frontend/backstage-plugin-bugsnag/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-bugsnag", - "version": "2.2.9", + "version": "2.2.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -19,8 +19,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-bugsnag", + "pluginPackages": [ + "@roadiehq/backstage-plugin-bugsnag" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-buildkite/CHANGELOG.md b/plugins/frontend/backstage-plugin-buildkite/CHANGELOG.md index e140cd306..1393c99eb 100644 --- a/plugins/frontend/backstage-plugin-buildkite/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-buildkite/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-buildkite +## 2.3.2 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.3.1 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-buildkite/package.json b/plugins/frontend/backstage-plugin-buildkite/package.json index 79a5434f9..c196f2381 100644 --- a/plugins/frontend/backstage-plugin-buildkite/package.json +++ b/plugins/frontend/backstage-plugin-buildkite/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-buildkite", - "version": "2.3.1", + "version": "2.3.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,8 +20,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-buildkite", + "pluginPackages": [ + "@roadiehq/backstage-plugin-buildkite" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-cloudsmith/CHANGELOG.md b/plugins/frontend/backstage-plugin-cloudsmith/CHANGELOG.md index 7da9382a1..544fe74bc 100644 --- a/plugins/frontend/backstage-plugin-cloudsmith/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-cloudsmith/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-cloudsmith +## 1.0.23 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.0.22 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-cloudsmith/package.json b/plugins/frontend/backstage-plugin-cloudsmith/package.json index ad4253456..bf8127e81 100644 --- a/plugins/frontend/backstage-plugin-cloudsmith/package.json +++ b/plugins/frontend/backstage-plugin-cloudsmith/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-cloudsmith", - "version": "1.0.22", + "version": "1.0.23", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,8 +21,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-cloudsmith", + "pluginPackages": [ + "@roadiehq/backstage-plugin-cloudsmith" + ] }, + "sideEffects": false, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/frontend/backstage-plugin-datadog/CHANGELOG.md b/plugins/frontend/backstage-plugin-datadog/CHANGELOG.md index b2da69f9f..37ba7b668 100644 --- a/plugins/frontend/backstage-plugin-datadog/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-datadog/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-datadog +## 2.3.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.3.0 ### Minor Changes diff --git a/plugins/frontend/backstage-plugin-datadog/package.json b/plugins/frontend/backstage-plugin-datadog/package.json index e24f4cb96..6aedad1b5 100644 --- a/plugins/frontend/backstage-plugin-datadog/package.json +++ b/plugins/frontend/backstage-plugin-datadog/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-datadog", - "version": "2.3.0", + "version": "2.3.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -38,6 +38,7 @@ "url": "github:RoadieHQ/roadie-backstage-plugins", "directory": "plugins/frontend/backstage-plugin-datadog" }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-datadog/src/alpha/apis.ts b/plugins/frontend/backstage-plugin-datadog/src/alpha/apis.ts index 296a6a8b0..9043b30cf 100644 --- a/plugins/frontend/backstage-plugin-datadog/src/alpha/apis.ts +++ b/plugins/frontend/backstage-plugin-datadog/src/alpha/apis.ts @@ -1,5 +1,5 @@ import { - createApiExtension, + ApiBlueprint, createApiFactory, discoveryApiRef, } from '@backstage/frontend-plugin-api'; @@ -8,10 +8,12 @@ import { datadogApiRef, DatadogApiClient } from '../api'; /** * @alpha */ -export const datadogApi = createApiExtension({ - factory: createApiFactory({ - api: datadogApiRef, - deps: { discoveryApi: discoveryApiRef }, - factory: ({ discoveryApi }) => new DatadogApiClient({ discoveryApi }), - }), +export const datadogApi = ApiBlueprint.make({ + params: { + factory: createApiFactory({ + api: datadogApiRef, + deps: { discoveryApi: discoveryApiRef }, + factory: ({ discoveryApi }) => new DatadogApiClient({ discoveryApi }), + }), + }, }); diff --git a/plugins/frontend/backstage-plugin-github-insights/CHANGELOG.md b/plugins/frontend/backstage-plugin-github-insights/CHANGELOG.md index 1df61e1f9..8dd8da546 100644 --- a/plugins/frontend/backstage-plugin-github-insights/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-github-insights/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-github-insights +## 2.4.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.4.0 ### Minor Changes diff --git a/plugins/frontend/backstage-plugin-github-insights/package.json b/plugins/frontend/backstage-plugin-github-insights/package.json index b09f51507..6ba125c31 100644 --- a/plugins/frontend/backstage-plugin-github-insights/package.json +++ b/plugins/frontend/backstage-plugin-github-insights/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-github-insights", - "version": "2.4.0", + "version": "2.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,8 +20,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-github-insights", + "pluginPackages": [ + "@roadiehq/backstage-plugin-github-insights" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "tsc": "tsc", diff --git a/plugins/frontend/backstage-plugin-github-pull-requests/CHANGELOG.md b/plugins/frontend/backstage-plugin-github-pull-requests/CHANGELOG.md index da8065cb3..f6139b512 100644 --- a/plugins/frontend/backstage-plugin-github-pull-requests/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-github-pull-requests/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-github-pull-requests +## 2.5.28 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.5.27 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-github-pull-requests/package.json b/plugins/frontend/backstage-plugin-github-pull-requests/package.json index e2dec1462..2cb3c4a79 100644 --- a/plugins/frontend/backstage-plugin-github-pull-requests/package.json +++ b/plugins/frontend/backstage-plugin-github-pull-requests/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-github-pull-requests", - "version": "2.5.27", + "version": "2.5.28", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,8 +21,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-github-pull-requests", + "pluginPackages": [ + "@roadiehq/backstage-plugin-github-pull-requests" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-iframe/CHANGELOG.md b/plugins/frontend/backstage-plugin-iframe/CHANGELOG.md index 17e7b0ad1..5ddcb7669 100644 --- a/plugins/frontend/backstage-plugin-iframe/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-iframe/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-iframe +## 1.4.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.4.0 ### Minor Changes diff --git a/plugins/frontend/backstage-plugin-iframe/package.json b/plugins/frontend/backstage-plugin-iframe/package.json index 1dfb12342..fa1ed281e 100644 --- a/plugins/frontend/backstage-plugin-iframe/package.json +++ b/plugins/frontend/backstage-plugin-iframe/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-iframe", - "version": "1.4.0", + "version": "1.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,8 +21,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-iframe", + "pluginPackages": [ + "@roadiehq/backstage-plugin-iframe" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-jira/CHANGELOG.md b/plugins/frontend/backstage-plugin-jira/CHANGELOG.md index 3a55c6b4e..46d653bef 100644 --- a/plugins/frontend/backstage-plugin-jira/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-jira/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-jira +## 2.5.10 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.5.9 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-jira/package.json b/plugins/frontend/backstage-plugin-jira/package.json index c889a882f..626438de9 100644 --- a/plugins/frontend/backstage-plugin-jira/package.json +++ b/plugins/frontend/backstage-plugin-jira/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-jira", - "version": "2.5.9", + "version": "2.5.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,8 +20,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-jira", + "pluginPackages": [ + "@roadiehq/backstage-plugin-jira" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-launchdarkly/.eslintrc.js b/plugins/frontend/backstage-plugin-launchdarkly/.eslintrc.js new file mode 100644 index 000000000..831909090 --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + 'notice/notice': 'off', + }, +}); diff --git a/plugins/frontend/backstage-plugin-launchdarkly/CHANGELOG.md b/plugins/frontend/backstage-plugin-launchdarkly/CHANGELOG.md new file mode 100644 index 000000000..ad73a1c05 --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/CHANGELOG.md @@ -0,0 +1,25 @@ +# @roadiehq/backstage-plugin-launchdarkly + +## 0.0.5 + +### Patch Changes + +- 09bad0c: Add title and seach options to feature flags card. + +## 0.0.4 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + +## 0.0.3 + +### Patch Changes + +- 34fa446: Add plugin id to the package file. + +## 0.0.2 + +### Patch Changes + +- bc516e3: Initial version of LaunchDarkly plugin. diff --git a/plugins/frontend/backstage-plugin-launchdarkly/README.md b/plugins/frontend/backstage-plugin-launchdarkly/README.md new file mode 100644 index 000000000..81c37b1f0 --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/README.md @@ -0,0 +1,47 @@ +# LaunchDarkly + +Welcome to the LaunchDarkly plugin! It allows you to view feature flags on an entity page in Backstage. + +drawing + +## Getting started + +Add a proxy configuration for LaunchDarkly in the `app-config.yaml` file + +``` +proxy: + '/launchdarkly/api': + target: https://app.launchdarkly.com/api + headers: + Authorization: ${LAUNCHDARKLY_API_KEY} +``` + +In the `packages/app/src/components/catalog/EntityPage.tsx` under `overviewContent` add the following: + +``` + + + + + +``` + +Set the `LAUNCHDARKLY_API_KEY` environment variable and run the backstage backend. + +Create an entity with the following annotations and import it: + +``` +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: launchdarklytest + annotations: + launchdarkly.com/project-key: default + launchdarkly.com/environment-key: test + launchdarkly.com/context: "{ \"kind\": \"tenant\", \"key\": \"blah\", \"name\": \"blah\" }" +spec: + type: service + lifecycle: unknown + owner: 'group:engineering' +``` diff --git a/plugins/frontend/backstage-plugin-launchdarkly/card-screenshot.png b/plugins/frontend/backstage-plugin-launchdarkly/card-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..86d49dbd19f8e7b32d6e6f7940d077f729554734 GIT binary patch literal 137859 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 = [ + { + title: 'Name', + field: 'name', + }, + { + title: 'Value', + field: '_value', + }, +]; + +export const EntityLaunchdarklyOverviewCard = ( + props: EntityLaunchdarklyOverviewCardProps, +) => { + const { title, enableSearch = false } = props; + const { entity } = useEntity(); + const unsetAnnotations = difference( + [ + LAUNCHDARKLY_PROJECT_KEY_ANNOTATION, + LAUNCHDARKLY_CONTEXT_PROPERTIES_ANNOTATION, + LAUNCHDARKLY_ENVIRONMENT_KEY_ANNOTATION, + ], + Object.keys(entity.metadata?.annotations || {}), + ); + + const { value, error, loading } = useLaunchdarklyFlags(entity); + + if (unsetAnnotations.length > 0) { + return ( + + ); + } + + if (loading) { + return ; + } + + if (error && error.message) { + return ; + } + + return ( + + ); +}; diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/components/EntityLaunchdarklyOverviewCard/index.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/components/EntityLaunchdarklyOverviewCard/index.ts new file mode 100644 index 000000000..6764a4d8d --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/components/EntityLaunchdarklyOverviewCard/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2024 Larder Software Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { EntityLaunchdarklyOverviewCard } from './EntityLaunchdarklyOverviewCard'; diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/constants.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/constants.ts new file mode 100644 index 000000000..50ca9449c --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/constants.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2024 Larder Software Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const LAUNCHDARKLY_PROJECT_KEY_ANNOTATION = + 'launchdarkly.com/project-key'; +export const LAUNCHDARKLY_ENVIRONMENT_KEY_ANNOTATION = + 'launchdarkly.com/environment-key'; +export const LAUNCHDARKLY_CONTEXT_PROPERTIES_ANNOTATION = + 'launchdarkly.com/context'; diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/hooks/useLaunchdarklyFlags.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/hooks/useLaunchdarklyFlags.ts new file mode 100644 index 000000000..114ad27df --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/hooks/useLaunchdarklyFlags.ts @@ -0,0 +1,46 @@ +import { Entity } from '@backstage/catalog-model'; +import { useAsync } from 'react-use'; +import { + LAUNCHDARKLY_CONTEXT_PROPERTIES_ANNOTATION, + LAUNCHDARKLY_ENVIRONMENT_KEY_ANNOTATION, + LAUNCHDARKLY_PROJECT_KEY_ANNOTATION, +} from '../constants'; +import { discoveryApiRef, useApi } from '@backstage/core-plugin-api'; + +export const useLaunchdarklyFlags = (entity: Entity) => { + const discovery = useApi(discoveryApiRef); + + return useAsync(async () => { + const projectKey = + entity.metadata.annotations?.[LAUNCHDARKLY_PROJECT_KEY_ANNOTATION] || + 'default'; + const environmentKey = + entity.metadata.annotations?.[LAUNCHDARKLY_ENVIRONMENT_KEY_ANNOTATION] || + 'production'; + const cntxt = + entity.metadata.annotations?.[LAUNCHDARKLY_CONTEXT_PROPERTIES_ANNOTATION]; + + if (projectKey && environmentKey && cntxt) { + const url = `${await discovery.getBaseUrl('proxy')}/launchdarkly/api`; + const response = await fetch( + `${url}/v2/projects/${projectKey}/environments/${environmentKey}/flags/evaluate`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: cntxt, + }, + ); + + if (!response.ok) { + throw new Error( + `Failed to retrieve launchdarkly environment ${environmentKey}: ${response.statusText}`, + ); + } + + return (await response.json()).items; + } + return undefined; + }); +}; diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/index.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/index.ts new file mode 100644 index 000000000..872ff7bcb --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2024 Larder Software Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { + launchdarklyPlugin, + EntityLaunchdarklyOverviewCard, + isLaunchdarklyAvailable, +} from './plugin'; diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/plugin.test.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/plugin.test.ts new file mode 100644 index 000000000..9b1f8ba2a --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/plugin.test.ts @@ -0,0 +1,7 @@ +import { launchdarklyPlugin } from './plugin'; + +describe('launchdarkly', () => { + it('should export plugin', () => { + expect(launchdarklyPlugin).toBeDefined(); + }); +}); diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/plugin.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/plugin.ts new file mode 100644 index 000000000..1aab0acaf --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/plugin.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2024 Larder Software Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createPlugin, + createComponentExtension, +} from '@backstage/core-plugin-api'; + +import { rootRouteRef } from './routes'; +import { Entity } from '@backstage/catalog-model'; +import difference from 'lodash/difference'; +import { + LAUNCHDARKLY_CONTEXT_PROPERTIES_ANNOTATION, + LAUNCHDARKLY_ENVIRONMENT_KEY_ANNOTATION, + LAUNCHDARKLY_PROJECT_KEY_ANNOTATION, +} from './constants'; + +export const launchdarklyPlugin = createPlugin({ + id: 'launchdarkly', + routes: { + root: rootRouteRef, + }, +}); + +export const EntityLaunchdarklyOverviewCard = launchdarklyPlugin.provide( + createComponentExtension({ + name: 'EntityLaunchdarklyOverviewCard', + component: { + lazy: () => + import('./components/EntityLaunchdarklyOverviewCard').then( + m => m.EntityLaunchdarklyOverviewCard, + ), + }, + }), +); + +export const isLaunchdarklyAvailable = (entity: Entity) => { + const diff = difference( + [ + LAUNCHDARKLY_PROJECT_KEY_ANNOTATION, + LAUNCHDARKLY_CONTEXT_PROPERTIES_ANNOTATION, + LAUNCHDARKLY_ENVIRONMENT_KEY_ANNOTATION, + ], + Object.keys(entity.metadata?.annotations || {}), + ); + return diff.length === 0; +}; diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/routes.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/routes.ts new file mode 100644 index 000000000..41eb58cb8 --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/routes.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2024 Larder Software Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createRouteRef } from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'launchdarkly', +}); diff --git a/plugins/frontend/backstage-plugin-launchdarkly/src/setupTests.ts b/plugins/frontend/backstage-plugin-launchdarkly/src/setupTests.ts new file mode 100644 index 000000000..608886c15 --- /dev/null +++ b/plugins/frontend/backstage-plugin-launchdarkly/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2024 Larder Software Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; diff --git a/plugins/frontend/backstage-plugin-prometheus/CHANGELOG.md b/plugins/frontend/backstage-plugin-prometheus/CHANGELOG.md index a720c11dd..5fe842b17 100644 --- a/plugins/frontend/backstage-plugin-prometheus/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-prometheus/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-prometheus +## 2.11.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.11.0 ### Minor Changes diff --git a/plugins/frontend/backstage-plugin-prometheus/package.json b/plugins/frontend/backstage-plugin-prometheus/package.json index e7ffa3f70..c95391fdd 100644 --- a/plugins/frontend/backstage-plugin-prometheus/package.json +++ b/plugins/frontend/backstage-plugin-prometheus/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-prometheus", - "version": "2.11.0", + "version": "2.11.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,8 +20,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-prometheus", + "pluginPackages": [ + "@roadiehq/backstage-plugin-prometheus" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-security-insights/CHANGELOG.md b/plugins/frontend/backstage-plugin-security-insights/CHANGELOG.md index 689592d8c..c25f526ef 100644 --- a/plugins/frontend/backstage-plugin-security-insights/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-security-insights/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-security-insights +## 2.3.20 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.3.19 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-security-insights/package.json b/plugins/frontend/backstage-plugin-security-insights/package.json index f58909b60..74b6a2b6f 100644 --- a/plugins/frontend/backstage-plugin-security-insights/package.json +++ b/plugins/frontend/backstage-plugin-security-insights/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-security-insights", - "version": "2.3.19", + "version": "2.3.20", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -21,8 +21,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-security-insights", + "pluginPackages": [ + "@roadiehq/backstage-plugin-security-insights" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/backstage-plugin-shortcut/CHANGELOG.md b/plugins/frontend/backstage-plugin-shortcut/CHANGELOG.md index d7dbe1c46..d51073b58 100644 --- a/plugins/frontend/backstage-plugin-shortcut/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-shortcut/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-shortcut +## 1.2.2 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.2.1 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-shortcut/package.json b/plugins/frontend/backstage-plugin-shortcut/package.json index 498797d1e..074a21bbf 100644 --- a/plugins/frontend/backstage-plugin-shortcut/package.json +++ b/plugins/frontend/backstage-plugin-shortcut/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-shortcut", - "version": "1.2.1", + "version": "1.2.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -19,8 +19,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-shortcut", + "pluginPackages": [ + "@roadiehq/backstage-plugin-shortcut" + ] }, + "sideEffects": false, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/frontend/backstage-plugin-travis-ci/CHANGELOG.md b/plugins/frontend/backstage-plugin-travis-ci/CHANGELOG.md index dc0164806..319abc98b 100644 --- a/plugins/frontend/backstage-plugin-travis-ci/CHANGELOG.md +++ b/plugins/frontend/backstage-plugin-travis-ci/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-travis-ci +## 2.1.24 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.1.23 ### Patch Changes diff --git a/plugins/frontend/backstage-plugin-travis-ci/package.json b/plugins/frontend/backstage-plugin-travis-ci/package.json index cb64e206f..76021c33c 100644 --- a/plugins/frontend/backstage-plugin-travis-ci/package.json +++ b/plugins/frontend/backstage-plugin-travis-ci/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-travis-ci", - "version": "2.1.23", + "version": "2.1.24", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,8 +20,13 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-travis-ci", + "pluginPackages": [ + "@roadiehq/backstage-plugin-travis-ci" + ] }, + "sideEffects": false, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/frontend/rag-ai/CHANGELOG.md b/plugins/frontend/rag-ai/CHANGELOG.md index 4f38433d0..76342d9d7 100644 --- a/plugins/frontend/rag-ai/CHANGELOG.md +++ b/plugins/frontend/rag-ai/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/rag-ai +## 1.1.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.1.0 ### Minor Changes diff --git a/plugins/frontend/rag-ai/package.json b/plugins/frontend/rag-ai/package.json index ed215087f..0d14270a8 100644 --- a/plugins/frontend/rag-ai/package.json +++ b/plugins/frontend/rag-ai/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/rag-ai", - "version": "1.1.0", + "version": "1.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "rag-ai", + "pluginPackages": [ + "@roadiehq/rag-ai" + ] }, "sideEffects": false, "scripts": { diff --git a/plugins/home/backstage-plugin-home-markdown/CHANGELOG.md b/plugins/home/backstage-plugin-home-markdown/CHANGELOG.md index cea87e409..bfbaea82a 100644 --- a/plugins/home/backstage-plugin-home-markdown/CHANGELOG.md +++ b/plugins/home/backstage-plugin-home-markdown/CHANGELOG.md @@ -1,5 +1,11 @@ ## 1.1.0 +## 2.5.27 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.5.26 ### Patch Changes diff --git a/plugins/home/backstage-plugin-home-markdown/package.json b/plugins/home/backstage-plugin-home-markdown/package.json index 8a31472f2..1ec1b5c0c 100644 --- a/plugins/home/backstage-plugin-home-markdown/package.json +++ b/plugins/home/backstage-plugin-home-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-home-markdown", - "version": "2.5.26", + "version": "2.5.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-home-markdown", + "pluginPackages": [ + "@roadiehq/backstage-plugin-home-markdown" + ] }, "repository": { "type": "git", @@ -21,6 +25,7 @@ "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", "email": "support@roadie.io" }, + "sideEffects": false, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/home/backstage-plugin-home-rss/CHANGELOG.md b/plugins/home/backstage-plugin-home-rss/CHANGELOG.md index f19d10e7a..8bd2049ec 100644 --- a/plugins/home/backstage-plugin-home-rss/CHANGELOG.md +++ b/plugins/home/backstage-plugin-home-rss/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/backstage-plugin-home-rss +## 1.3.13 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.3.12 ### Patch Changes diff --git a/plugins/home/backstage-plugin-home-rss/package.json b/plugins/home/backstage-plugin-home-rss/package.json index f73caa8af..0181f15fc 100644 --- a/plugins/home/backstage-plugin-home-rss/package.json +++ b/plugins/home/backstage-plugin-home-rss/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/backstage-plugin-home-rss", - "version": "1.3.12", + "version": "1.3.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "backstage-plugin-home-rss", + "pluginPackages": [ + "@roadiehq/backstage-plugin-home-rss" + ] }, "repository": { "type": "git", @@ -21,6 +25,7 @@ "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", "email": "support@roadie.io" }, + "sideEffects": false, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/scaffolder-actions/scaffolder-backend-argocd/CHANGELOG.md b/plugins/scaffolder-actions/scaffolder-backend-argocd/CHANGELOG.md index ab870c5f3..1e2c2095b 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-argocd/CHANGELOG.md +++ b/plugins/scaffolder-actions/scaffolder-backend-argocd/CHANGELOG.md @@ -1,5 +1,13 @@ # @roadiehq/scaffolder-backend-argocd +## 1.1.28 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata +- Updated dependencies [d6ae6e9] + - @roadiehq/backstage-plugin-argo-cd-backend@3.0.4 + ## 1.1.27 ### Patch Changes diff --git a/plugins/scaffolder-actions/scaffolder-backend-argocd/package.json b/plugins/scaffolder-actions/scaffolder-backend-argocd/package.json index 64e9c7388..ed445387e 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-argocd/package.json +++ b/plugins/scaffolder-actions/scaffolder-backend-argocd/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/scaffolder-backend-argocd", - "version": "1.1.27", + "version": "1.1.28", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,9 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "scaffolder-backend-argocd", + "pluginPackage": "@backstage/plugin-scaffolder-backend" }, "repository": { "type": "git", @@ -34,7 +36,7 @@ "@backstage/backend-common": "^0.24.0", "@backstage/config": "^1.2.0", "@backstage/plugin-scaffolder-backend": "^1.24.0", - "@roadiehq/backstage-plugin-argo-cd-backend": "^3.0.2", + "@roadiehq/backstage-plugin-argo-cd-backend": "^3.0.4", "@backstage/backend-test-utils": "^0.5.0", "winston": "^3.2.1" }, diff --git a/plugins/scaffolder-actions/scaffolder-backend-module-aws/CHANGELOG.md b/plugins/scaffolder-actions/scaffolder-backend-module-aws/CHANGELOG.md index 2f09f18b8..fe85f5510 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-module-aws/CHANGELOG.md +++ b/plugins/scaffolder-actions/scaffolder-backend-module-aws/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/scaffolder-backend-module-aws +## 2.4.25 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.4.24 ### Patch Changes diff --git a/plugins/scaffolder-actions/scaffolder-backend-module-aws/package.json b/plugins/scaffolder-actions/scaffolder-backend-module-aws/package.json index b5a708d1f..cda02af4b 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-module-aws/package.json +++ b/plugins/scaffolder-actions/scaffolder-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/scaffolder-backend-module-aws", - "version": "2.4.24", + "version": "2.4.25", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -8,7 +8,9 @@ "access": "public" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "scaffolder-backend-module-aws", + "pluginPackage": "@backstage/plugin-scaffolder-backend" }, "repository": { "type": "git", diff --git a/plugins/scaffolder-actions/scaffolder-backend-module-http-request/CHANGELOG.md b/plugins/scaffolder-actions/scaffolder-backend-module-http-request/CHANGELOG.md index 4fce1e072..f2a23bcce 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-module-http-request/CHANGELOG.md +++ b/plugins/scaffolder-actions/scaffolder-backend-module-http-request/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/scaffolder-backend-module-http-request +## 4.3.3 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 4.3.2 ### Patch Changes diff --git a/plugins/scaffolder-actions/scaffolder-backend-module-http-request/package.json b/plugins/scaffolder-actions/scaffolder-backend-module-http-request/package.json index 3d665f9e3..50941b176 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-module-http-request/package.json +++ b/plugins/scaffolder-actions/scaffolder-backend-module-http-request/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/scaffolder-backend-module-http-request", - "version": "4.3.2", + "version": "4.3.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -8,13 +8,25 @@ "access": "public" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "scaffolder-backend-module-http-request", + "pluginPackage": "@backstage/plugin-scaffolder-backend" }, "exports": { ".": "./src/index.ts", "./package.json": "./package.json", "./new-backend": "./src/new-backend.ts" }, + "typesVersions": { + "*": { + "package.json": [ + "package.json" + ], + "new-backend": [ + "src/new-backend.ts" + ] + } + }, "repository": { "type": "git", "url": "github:RoadieHQ/roadie-backstage-plugins", diff --git a/plugins/scaffolder-actions/scaffolder-backend-module-utils/CHANGELOG.md b/plugins/scaffolder-actions/scaffolder-backend-module-utils/CHANGELOG.md index 942b41f1a..14ed2c2d3 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-module-utils/CHANGELOG.md +++ b/plugins/scaffolder-actions/scaffolder-backend-module-utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/scaffolder-backend-module-utils +## 2.0.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.0.0 ### Major Changes diff --git a/plugins/scaffolder-actions/scaffolder-backend-module-utils/package.json b/plugins/scaffolder-actions/scaffolder-backend-module-utils/package.json index 4751619d9..9a275c0a4 100644 --- a/plugins/scaffolder-actions/scaffolder-backend-module-utils/package.json +++ b/plugins/scaffolder-actions/scaffolder-backend-module-utils/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/scaffolder-backend-module-utils", - "version": "2.0.0", + "version": "2.0.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -8,7 +8,9 @@ "access": "public" }, "backstage": { - "role": "backend-plugin-module" + "role": "backend-plugin-module", + "pluginId": "scaffolder-backend-module-utils", + "pluginPackage": "@backstage/plugin-scaffolder-backend" }, "exports": { ".": "./src/index.ts", @@ -19,6 +21,9 @@ "*": { "package.json": [ "package.json" + ], + "new-backend": [ + "src/new-backend.ts" ] } }, diff --git a/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/CHANGELOG.md b/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/CHANGELOG.md index 2fd785727..0e72452c8 100644 --- a/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/CHANGELOG.md +++ b/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/plugin-scaffolder-frontend-module-http-request-field +## 1.7.1 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 1.7.0 ### Minor Changes diff --git a/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/package.json b/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/package.json index 74112e905..5410aab50 100644 --- a/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/package.json +++ b/plugins/scaffolder-field-extensions/scaffolder-frontend-module-http-request-field/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/plugin-scaffolder-frontend-module-http-request-field", - "version": "1.7.0", + "version": "1.7.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -10,7 +10,11 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "frontend-plugin" + "role": "frontend-plugin", + "pluginId": "plugin-scaffolder-frontend-module-http-request-field", + "pluginPackages": [ + "@roadiehq/plugin-scaffolder-frontend-module-http-request-field" + ] }, "repository": { "type": "git", @@ -21,6 +25,7 @@ "url": "https://github.com/RoadieHQ/roadie-backstage-plugins/issues", "email": "support@roadie.io" }, + "sideEffects": false, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/utils/roadie-backstage-entity-validator/CHANGELOG.md b/utils/roadie-backstage-entity-validator/CHANGELOG.md index e6aff9dc7..0ab906056 100644 --- a/utils/roadie-backstage-entity-validator/CHANGELOG.md +++ b/utils/roadie-backstage-entity-validator/CHANGELOG.md @@ -1,5 +1,11 @@ # @roadiehq/roadie-backstage-entity-validator +## 2.4.12 + +### Patch Changes + +- d6ae6e9: Release all packages to rollout new metadata + ## 2.4.11 ### Patch Changes diff --git a/utils/roadie-backstage-entity-validator/package.json b/utils/roadie-backstage-entity-validator/package.json index d5480f0d2..ee6f3ce91 100644 --- a/utils/roadie-backstage-entity-validator/package.json +++ b/utils/roadie-backstage-entity-validator/package.json @@ -1,6 +1,6 @@ { "name": "@roadiehq/roadie-backstage-entity-validator", - "version": "2.4.11", + "version": "2.4.12", "author": "RoadieHQ", "description": "Backstage entity validator library", "main": "src/index.js", diff --git a/yarn.lock b/yarn.lock index e648b846d..41ab51f19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28760,6 +28760,13 @@ react-window@^1.8.10, react-window@^1.8.6: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" +"react@^16.13.1 || ^17.0.0 || ^18.0.0": + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + react@^18.0.2: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -30565,16 +30572,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -30648,7 +30646,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -30662,13 +30660,6 @@ strip-ansi@5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -32794,7 +32785,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -32812,15 +32803,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"