From 01bf98c778cb262799a03150793542ed88071713 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 4 Sep 2025 14:40:48 +0530 Subject: [PATCH 001/177] Fixed duplicate route warning for TechDocs Addons documentation in Docusaurus Signed-off-by: Aditya Kumar --- docs/features/techdocs/addons--new.md | 2 +- docs/features/techdocs/addons.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/techdocs/addons--new.md b/docs/features/techdocs/addons--new.md index 07138d4b8e..a552ad1ace 100644 --- a/docs/features/techdocs/addons--new.md +++ b/docs/features/techdocs/addons--new.md @@ -5,7 +5,7 @@ description: How to find, use, or create TechDocs Addons. --- :::info -This documentation is written for [the new frontend system](../../frontend-system/index.md) which is still in alpha and is only supported by a small number of plugins. +This documentation is written for [the new frontend system](../../frontend-system/index.md) which is still in alpha and is only supported by a small number of plugins. If you are on the [old frontend system](./getting-started.md#adding-techdocs-frontend-plugin) you may want to read [its own article](./addons.md) instead. ::: ## Concepts diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 435239794b..f67f1c5660 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -1,5 +1,5 @@ --- -id: addons +id: addons--old title: TechDocs Addons description: How to find, use, or create TechDocs Addons. --- From e0ffe84d55fbf0ee29d8aac0510f90b49f919a8b Mon Sep 17 00:00:00 2001 From: Gaurav Agrawal Date: Sun, 7 Sep 2025 18:05:57 +0000 Subject: [PATCH 002/177] fix(scaffolder): add missing templatingExtensions flag to RouterProps contextMenu Signed-off-by: Gaurav Agrawal --- .changeset/ready-pots-arrive.md | 5 +++ .../components/ActionsPage/ActionsPage.tsx | 6 +++- .../ListTasksPage/ListTasksPage.tsx | 6 +++- .../src/components/Router/Router.tsx | 4 ++- .../TemplatingExtensionsPage.tsx | 34 ++++++++++++++++--- 5 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 .changeset/ready-pots-arrive.md diff --git a/.changeset/ready-pots-arrive.md b/.changeset/ready-pots-arrive.md new file mode 100644 index 0000000000..96f13a12ae --- /dev/null +++ b/.changeset/ready-pots-arrive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Add missing `templatingExtensions` option to RouterProps.contextMenu to allow global control across scaffolder pages diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx index 402c0427dc..6be502659a 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.tsx @@ -240,6 +240,7 @@ export type ActionsPageProps = { editor?: boolean; tasks?: boolean; create?: boolean; + templatingExtensions?: boolean; }; }; @@ -265,7 +266,10 @@ export const ActionsPage = (props: ActionsPageProps) => { props?.contextMenu?.create !== false ? () => navigate(createLink()) : undefined, - onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink()), + onTemplatingExtensionsClicked: + props?.contextMenu?.templatingExtensions !== false + ? () => navigate(templatingExtensionsLink()) + : undefined, }; return ( diff --git a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx index d6b5b7116e..6cce6c3727 100644 --- a/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx +++ b/plugins/scaffolder/src/components/ListTasksPage/ListTasksPage.tsx @@ -55,6 +55,7 @@ export interface MyTaskPageProps { editor?: boolean; actions?: boolean; create?: boolean; + templatingExtensions?: boolean; }; } @@ -193,7 +194,10 @@ export const ListTasksPage = (props: MyTaskPageProps) => { props?.contextMenu?.create !== false ? () => navigate(createLink()) : undefined, - onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink()), + onTemplatingExtensionsClicked: + props?.contextMenu?.templatingExtensions !== false + ? () => navigate(templatingExtensionsLink()) + : undefined, }; return ( diff --git a/plugins/scaffolder/src/components/Router/Router.tsx b/plugins/scaffolder/src/components/Router/Router.tsx index a57811a520..7a2496c046 100644 --- a/plugins/scaffolder/src/components/Router/Router.tsx +++ b/plugins/scaffolder/src/components/Router/Router.tsx @@ -103,6 +103,8 @@ export type RouterProps = { tasks?: boolean; /** Whether to show a link to the create page (on /create subroutes) */ create?: boolean; + /** Whether to show a link to the templating extensions page */ + templatingExtensions?: boolean; }; }; @@ -244,7 +246,7 @@ export const InternalRouter = ( /> } + element={} /> } /> diff --git a/plugins/scaffolder/src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx b/plugins/scaffolder/src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx index 720d6204ea..fc2b180596 100644 --- a/plugins/scaffolder/src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx +++ b/plugins/scaffolder/src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx @@ -296,7 +296,18 @@ export const TemplatingExtensionsPageContent = ({ ); }; -export const TemplatingExtensionsPage = () => { +export type TemplatingExtensionsPageProps = { + contextMenu?: { + editor?: boolean; + actions?: boolean; + tasks?: boolean; + create?: boolean; + }; +}; + +export const TemplatingExtensionsPage = ( + props: TemplatingExtensionsPageProps, +) => { const navigate = useNavigate(); const editorLink = useRouteRef(editRouteRef); const tasksLink = useRouteRef(scaffolderListTaskRouteRef); @@ -304,10 +315,23 @@ export const TemplatingExtensionsPage = () => { const actionsLink = useRouteRef(actionsRouteRef); const scaffolderPageContextMenuProps: ScaffolderPageContextMenuProps = { - onEditorClicked: () => navigate(editorLink()), - onActionsClicked: () => navigate(actionsLink()), - onTasksClicked: () => navigate(tasksLink()), - onCreateClicked: () => navigate(createLink()), + onEditorClicked: + props?.contextMenu?.editor !== false + ? () => navigate(editorLink()) + : undefined, + onActionsClicked: + props?.contextMenu?.actions !== false + ? () => navigate(actionsLink()) + : undefined, + onTasksClicked: + props?.contextMenu?.tasks !== false + ? () => navigate(tasksLink()) + : undefined, + onCreateClicked: + props?.contextMenu?.create !== false + ? () => navigate(createLink()) + : undefined, + onTemplatingExtensionsClicked: undefined, }; const { t } = useTranslationRef(scaffolderTranslationRef); From 443c0e4348cc6328cdb82c4d4f6f5135e51cffa5 Mon Sep 17 00:00:00 2001 From: Gaurav Agrawal Date: Sun, 7 Sep 2025 19:51:00 +0000 Subject: [PATCH 003/177] fix: add api report Signed-off-by: Gaurav Agrawal --- plugins/scaffolder/report.api.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/scaffolder/report.api.md b/plugins/scaffolder/report.api.md index fbb73f6225..a4a339f01e 100644 --- a/plugins/scaffolder/report.api.md +++ b/plugins/scaffolder/report.api.md @@ -492,6 +492,7 @@ export type RouterProps = { actions?: boolean; tasks?: boolean; create?: boolean; + templatingExtensions?: boolean; }; }; From 9e32f053338c16c7f3cf440662913b25ee41e4c2 Mon Sep 17 00:00:00 2001 From: deepthi-ajith_infosys Date: Mon, 8 Sep 2025 13:06:26 +0530 Subject: [PATCH 004/177] Minor documentation changes Signed-off-by: deepthi-ajith_infosys --- docs/backend-system/building-backends/08-migrating.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/backend-system/building-backends/08-migrating.md b/docs/backend-system/building-backends/08-migrating.md index c07862cc3c..a638516165 100644 --- a/docs/backend-system/building-backends/08-migrating.md +++ b/docs/backend-system/building-backends/08-migrating.md @@ -211,7 +211,7 @@ argument of `createBackend`. ## Removing `@backstage/backend-common` -The `@backstage/backend-common` package has been deprecated as part of moving to the new backend system, an you will need to replace existing usage of it. All exports from the package have been marked as deprecated in the last few releases of the package, and each export has its own deprecation message that explains how to replace that particular export. +The `@backstage/backend-common` package has been deprecated as part of moving to the new backend system, and you will need to replace existing usage of it. All exports from the package have been marked as deprecated in the last few releases of the package, and each export has its own deprecation message that explains how to replace that particular export. These are the deprecation messages for the most common replacements: From 8b7351f3dff72cdab67157d7626b116d11e7f533 Mon Sep 17 00:00:00 2001 From: secustor Date: Tue, 9 Sep 2025 14:48:48 +0200 Subject: [PATCH 005/177] feat(plugins/org): add overwrites to membership and ownership cards Signed-off-by: secustor --- .changeset/giant-weeks-jump.md | 5 +++ packages/app-next/app-config.yaml | 5 +++ plugins/org/report-alpha.api.md | 40 +++++++++++++++++--- plugins/org/src/alpha.tsx | 61 ++++++++++++++++++++++++------- 4 files changed, 91 insertions(+), 20 deletions(-) create mode 100644 .changeset/giant-weeks-jump.md diff --git a/.changeset/giant-weeks-jump.md b/.changeset/giant-weeks-jump.md new file mode 100644 index 0000000000..1b11bd1490 --- /dev/null +++ b/.changeset/giant-weeks-jump.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': patch +--- + +Add `initialRelationAggregation` and `showAggregateMembersToggle` options to `EntityMembersListCard` as well to `EntityOwnershipCard` diff --git a/packages/app-next/app-config.yaml b/packages/app-next/app-config.yaml index f83e4d4ba0..59fecf7e64 100644 --- a/packages/app-next/app-config.yaml +++ b/packages/app-next/app-config.yaml @@ -22,6 +22,11 @@ app: ownerEntityRefs: [cubic-belugas] extensions: + - entity-card:org/members-list: + config: + showAggregateMembersToggle: true + initialRelationAggregation: aggregated + # - apis.plugin.graphiql.browse.gitlab: true # - graphiql-endpoint:graphiql/gitlab: true diff --git a/plugins/org/report-alpha.api.md b/plugins/org/report-alpha.api.md index 3cebe00d33..3f8fdca05d 100644 --- a/plugins/org/report-alpha.api.md +++ b/plugins/org/report-alpha.api.md @@ -63,13 +63,17 @@ const _default: OverridableFrontendPlugin< }; }>; 'entity-card:org/members-list': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'members-list'; config: { + initialRelationAggregation: 'direct' | 'aggregated' | undefined; + showAggregateMembersToggle: boolean | undefined; + } & { filter: EntityPredicate | undefined; type: 'content' | 'summary' | 'info' | undefined; }; configInput: { + showAggregateMembersToggle?: boolean | undefined; + initialRelationAggregation?: 'direct' | 'aggregated' | undefined; + } & { filter?: EntityPredicate | undefined; type?: 'content' | 'summary' | 'info' | undefined; }; @@ -96,7 +100,17 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: {}; + inputs: { + [x: string]: ExtensionInput< + ExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'entity-card'; + name: 'members-list'; params: { loader: () => Promise; filter?: string | EntityPredicate | ((entity: Entity) => boolean); @@ -104,13 +118,17 @@ const _default: OverridableFrontendPlugin< }; }>; 'entity-card:org/ownership': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'ownership'; config: { + initialRelationAggregation: 'direct' | 'aggregated' | undefined; + showAggregateMembersToggle: boolean | undefined; + } & { filter: EntityPredicate | undefined; type: 'content' | 'summary' | 'info' | undefined; }; configInput: { + showAggregateMembersToggle?: boolean | undefined; + initialRelationAggregation?: 'direct' | 'aggregated' | undefined; + } & { filter?: EntityPredicate | undefined; type?: 'content' | 'summary' | 'info' | undefined; }; @@ -137,7 +155,17 @@ const _default: OverridableFrontendPlugin< optional: true; } >; - inputs: {}; + inputs: { + [x: string]: ExtensionInput< + ExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'entity-card'; + name: 'ownership'; params: { loader: () => Promise; filter?: string | EntityPredicate | ((entity: Entity) => boolean); diff --git a/plugins/org/src/alpha.tsx b/plugins/org/src/alpha.tsx index 92ae7d8801..ddb8094688 100644 --- a/plugins/org/src/alpha.tsx +++ b/plugins/org/src/alpha.tsx @@ -36,26 +36,59 @@ const EntityGroupProfileCard = EntityCardBlueprint.make({ }); /** @alpha */ -const EntityMembersListCard = EntityCardBlueprint.make({ +const EntityMembersListCard = EntityCardBlueprint.makeWithOverrides({ name: 'members-list', - params: { - filter: { kind: 'group' }, - loader: async () => - import('./components/Cards/Group/MembersList/MembersListCard').then(m => - compatWrapper(), - ), + config: { + schema: { + initialRelationAggregation: z => + z.enum(['direct', 'aggregated']).optional(), + showAggregateMembersToggle: z => z.boolean().optional(), + }, + }, + factory(originalFactory, { config }) { + return originalFactory({ + filter: { kind: 'group' }, + loader: async () => + import('./components/Cards/Group/MembersList/MembersListCard').then(m => + compatWrapper( + , + ), + ), + }); }, }); /** @alpha */ -const EntityOwnershipCard = EntityCardBlueprint.make({ +const EntityOwnershipCard = EntityCardBlueprint.makeWithOverrides({ name: 'ownership', - params: { - filter: { kind: { $in: ['group', 'user'] } }, - loader: async () => - import('./components/Cards/OwnershipCard/OwnershipCard').then(m => - compatWrapper(), - ), + config: { + schema: { + initialRelationAggregation: z => + z.enum(['direct', 'aggregated']).optional(), + showAggregateMembersToggle: z => z.boolean().optional(), + }, + }, + factory(originalFactory, { config }) { + return originalFactory({ + filter: { kind: { $in: ['group', 'user'] } }, + loader: async () => + import('./components/Cards/OwnershipCard/OwnershipCard').then(m => + compatWrapper( + , + ), + ), + }); }, }); From 555d43996d5d95fc0edb20d0541bc1dfcbacc269 Mon Sep 17 00:00:00 2001 From: secustor Date: Tue, 9 Sep 2025 15:14:33 +0200 Subject: [PATCH 006/177] fix prettier Signed-off-by: secustor --- packages/app-next/app-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-next/app-config.yaml b/packages/app-next/app-config.yaml index 59fecf7e64..704cc8d8a8 100644 --- a/packages/app-next/app-config.yaml +++ b/packages/app-next/app-config.yaml @@ -26,7 +26,7 @@ app: config: showAggregateMembersToggle: true initialRelationAggregation: aggregated - + # - apis.plugin.graphiql.browse.gitlab: true # - graphiql-endpoint:graphiql/gitlab: true From f7a414425d94bca21d40b1d1af921a4500b6dbd1 Mon Sep 17 00:00:00 2001 From: Adam Letizia Date: Thu, 4 Sep 2025 13:39:11 -0500 Subject: [PATCH 007/177] fix(kubernetes): fixes calculation of pod cpu utilization Signed-off-by: Adam Letizia --- .changeset/twelve-guests-sit.md | 5 +++++ .../src/components/Pods/PodsTable.test.tsx | 2 +- plugins/kubernetes-react/src/utils/pod.test.tsx | 2 +- plugins/kubernetes-react/src/utils/pod.tsx | 12 ++---------- 4 files changed, 9 insertions(+), 12 deletions(-) create mode 100644 .changeset/twelve-guests-sit.md diff --git a/.changeset/twelve-guests-sit.md b/.changeset/twelve-guests-sit.md new file mode 100644 index 0000000000..0d75e07f0c --- /dev/null +++ b/.changeset/twelve-guests-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': patch +--- + +Fixes calculation of CPU utilization in the PodTable diff --git a/plugins/kubernetes-react/src/components/Pods/PodsTable.test.tsx b/plugins/kubernetes-react/src/components/Pods/PodsTable.test.tsx index fb90d17e2b..76136641af 100644 --- a/plugins/kubernetes-react/src/components/Pods/PodsTable.test.tsx +++ b/plugins/kubernetes-react/src/components/Pods/PodsTable.test.tsx @@ -74,7 +74,7 @@ describe('PodsTable', () => { limitTotal: '134217728', }, cpu: { - currentUsage: 0.4966115, + currentUsage: 0.0496, requestTotal: 0.05, limitTotal: 0.05, }, diff --git a/plugins/kubernetes-react/src/utils/pod.test.tsx b/plugins/kubernetes-react/src/utils/pod.test.tsx index 3f82c14f86..a75039ceea 100644 --- a/plugins/kubernetes-react/src/utils/pod.test.tsx +++ b/plugins/kubernetes-react/src/utils/pod.test.tsx @@ -42,7 +42,7 @@ describe('pod', () => { const result = podStatusToCpuUtil({ cpu: { // ~50m - currentUsage: 0.4966115, + currentUsage: 0.0496, // 50m requestTotal: 0.05, // 100m diff --git a/plugins/kubernetes-react/src/utils/pod.tsx b/plugins/kubernetes-react/src/utils/pod.tsx index 97b44d4d24..e033b7c3b8 100644 --- a/plugins/kubernetes-react/src/utils/pod.tsx +++ b/plugins/kubernetes-react/src/utils/pod.tsx @@ -139,22 +139,14 @@ export const currentToDeclaredResourceToPerc = ( export const podStatusToCpuUtil = (podStatus: ClientPodStatus): ReactNode => { const cpuUtil = podStatus.cpu; - let currentUsage: number | string = cpuUtil.currentUsage; - - // current usage number for CPU is a different unit than request/limit total - // this might be a bug in the k8s library - if (typeof cpuUtil.currentUsage === 'number') { - currentUsage = cpuUtil.currentUsage / 10; - } - return ( From 7a40a90c6488a8ed04c046cc39069ba827e071fd Mon Sep 17 00:00:00 2001 From: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:10:38 +0530 Subject: [PATCH 008/177] Update addons.md Signed-off-by: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> --- docs/features/techdocs/addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index f67f1c5660..435239794b 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -1,5 +1,5 @@ --- -id: addons--old +id: addons title: TechDocs Addons description: How to find, use, or create TechDocs Addons. --- From a4d3260567cb6a1aa54b5c379159e768f5ff0efd Mon Sep 17 00:00:00 2001 From: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> Date: Mon, 15 Sep 2025 15:11:43 +0530 Subject: [PATCH 009/177] Update addons--new.md Signed-off-by: Aditya Kumar <136452216+AdityaK60@users.noreply.github.com> --- docs/features/techdocs/addons--new.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/techdocs/addons--new.md b/docs/features/techdocs/addons--new.md index a552ad1ace..8c58eb892c 100644 --- a/docs/features/techdocs/addons--new.md +++ b/docs/features/techdocs/addons--new.md @@ -1,5 +1,5 @@ --- -id: addons +id: addons--new title: TechDocs Addons description: How to find, use, or create TechDocs Addons. --- From 8495b18507b3dca141abacd543db6ca6ce7b25fe Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Thu, 20 Mar 2025 12:00:23 +0100 Subject: [PATCH 010/177] feat: add external token decorator service Signed-off-by: Juan Pablo Garcia Ripa --- .changeset/thirty-rules-press.md | 5 + docs/auth/service-to-service-auth.md | 31 +++- packages/backend-defaults/report-auth.api.md | 20 +++ .../auth/authServiceFactory.test.ts | 63 +++++++- .../entrypoints/auth/authServiceFactory.ts | 26 +++- .../external/ExternalTokenHandler.test.ts | 144 ++++++++++++++++++ .../auth/external/ExternalTokenHandler.ts | 26 +++- .../src/entrypoints/auth/index.ts | 3 + .../auth/plugin/PluginTokenHandler.ts | 2 +- 9 files changed, 309 insertions(+), 11 deletions(-) create mode 100644 .changeset/thirty-rules-press.md diff --git a/.changeset/thirty-rules-press.md b/.changeset/thirty-rules-press.md new file mode 100644 index 0000000000..f4758da67b --- /dev/null +++ b/.changeset/thirty-rules-press.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': minor +--- + +Add a new `externalTokenHandlerDecoratorServiceRef` to allow custom external token validations diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md index d35aed364d..e821aeb0c7 100644 --- a/docs/auth/service-to-service-auth.md +++ b/docs/auth/service-to-service-auth.md @@ -414,9 +414,13 @@ Each entry has one or more of the following fields: ## Adding custom or logic for validation and issuing of tokens -The `pluginTokenHandlerDecoratorServiceRef` can be used to decorate the existing token handler without having to re-implement the entire `AuthService` implementation. +The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenHandlerDecoratorServiceRef` can be used to decorate the existing token handler without having to re-implement the entire `AuthService` implementation. This is particularly useful when you want to add additional logic to the handler, such as logging or metrics or custom token validation. +### PluginTokenHandler decoration + +The `pluginTokenHandlerDecoratorServiceRef` can be used to decorate the default PluginTokenHandler used for create and verify tokens from plugins. + The `PluginTokenHandler` interface has two methods: - `issueToken`: This method is used to issue a token for a plugin. It takes in the `pluginId` and `targetPluginId` as arguments, and an optional `limitedUserToken` object which can be used to issue a token on behalf of another user. The method returns a promise that resolves to an object containing the issued token. @@ -439,3 +443,28 @@ const decoratedPluginTokenHandler = createServiceFactory({ }, }); ``` + +### ExternalTokenHandler decoration + +The `externalTokenHandlerDecoratorServiceRef` can be used to decorate the default ExternalTokenHandler used for verify tokens from external callers. + +The `ExternalTokenHandler` interface has one methods: + +- `verifyToken`: This method is used to verify a token. It takes in the token as an argument and returns a promise that resolves to an object containing the subject of the token and an optional limited user token. + +```ts +import { + ExternalTokenHandler, + externalTokenHandlerDecoratorServiceRef, +} from '@backstage/backend-defaults/auth'; +import { createServiceFactory } from '@backstage/backend-plugin-api'; + +const decoratedPluginTokenHandler = createServiceFactory({ + service: externalTokenHandlerDecoratorServiceRef, + deps: {}, + async factory() { + return (defaultImplementation: ExternalTokenHandler) => + new CustomTokenHandler(defaultImplementation); + }, +}); +``` diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index 1883e65a6a..56a973813d 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -4,6 +4,7 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; +import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; @@ -14,6 +15,25 @@ export const authServiceFactory: ServiceFactory< 'singleton' >; +// @public +export interface ExternalTokenHandler { + // (undocumented) + verifyToken(token: string): Promise< + | { + subject: string; + accessRestrictions?: BackstagePrincipalAccessRestrictions; + } + | undefined + >; +} + +// @public +export const externalTokenHandlerDecoratorServiceRef: ServiceRef< + (defaultImplementation: ExternalTokenHandler) => ExternalTokenHandler, + 'plugin', + 'singleton' +>; + // @public export interface PluginTokenHandler { // (undocumented) diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index a244614135..990668083f 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -21,6 +21,8 @@ import { } from '@backstage/backend-test-utils'; import { authServiceFactory, + externalTokenHandlersServiceRef, + // externalTokenHandlersServiceRef, pluginTokenHandlerDecoratorServiceRef, } from './authServiceFactory'; import { base64url, decodeJwt } from 'jose'; @@ -30,6 +32,11 @@ import { setupServer } from 'msw/node'; import { toInternalBackstageCredentials } from './helpers'; import { PluginTokenHandler } from './plugin/PluginTokenHandler'; import { createServiceFactory } from '@backstage/backend-plugin-api'; +import { AccessRestriptionsMap, TokenHandler } from './external/types'; +import { Config } from '@backstage/config'; +import { x } from 'tar'; +// import { ExternalTokenHandler } from './external/ExternalTokenHandler'; +// import { TokenHandler } from './external/types'; const server = setupServer(); @@ -58,6 +65,13 @@ const mockDeps = [ subject: 'unlimited-static-subject', }, }, + { + type: 'custom', + options: { + [`custom-config`]: 'custom-config', + foo: 'bar', + }, + }, ], }, }, @@ -450,8 +464,55 @@ describe('authServiceFactory', () => { dependencies: [...mockDeps, customPluginTokenHandler], }); const searchAuth = await tester.getSubject('search'); - searchAuth.authenticate('unlimited-static-token'); + await searchAuth.authenticate('unlimited-static-token'); expect(customLogic).toHaveBeenCalledWith('unlimited-static-token'); }); }); + describe('add custom ExternalTokenHandler', () => { + it('should allow custom logic to be injected into the plugin token handler', async () => { + const customLogic = jest.fn(); + const customAddEntry = jest.fn(); + const customPluginTokenHandler = createServiceFactory({ + service: externalTokenHandlersServiceRef, + deps: {}, + async factory() { + return { + custom: new (class CustomHandler implements TokenHandler { + add(options: Config): void { + customAddEntry(options); + } + async verifyToken(token: string): Promise< + | { + subject: string; + allAccessRestrictions?: AccessRestriptionsMap; + } + | undefined + > { + customLogic(token); + return { + subject: 'foo', + }; + } + })(), + }; + }, + }); + const tester = ServiceFactoryTester.from(authServiceFactory, { + dependencies: [...mockDeps, customPluginTokenHandler], + }); + const searchAuth = await tester.getSubject('search'); + await searchAuth.authenticate('custom-token'); + expect(customAddEntry).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ + options: expect.objectContaining({ + [`custom-config`]: 'custom-config', + foo: 'bar', + }), + }), + }), + ); + expect(customLogic).toHaveBeenCalledWith('custom-token'); + }); + }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index 91910292e6..48f0941b12 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -20,13 +20,18 @@ import { createServiceRef, } from '@backstage/backend-plugin-api'; import { DefaultAuthService } from './DefaultAuthService'; -import { ExternalTokenHandler } from './external/ExternalTokenHandler'; +import { + // DefaultExternalTokenHandler, + ExternalTokenHandler, +} from './external/ExternalTokenHandler'; import { DefaultPluginTokenHandler, PluginTokenHandler, } from './plugin/PluginTokenHandler'; import { createPluginKeySource } from './plugin/keys/createPluginKeySource'; import { UserTokenHandler } from './user/UserTokenHandler'; +import { TokenHandler } from './external/types'; +import { Config } from '@backstage/config'; /** * @public @@ -45,6 +50,22 @@ export const pluginTokenHandlerDecoratorServiceRef = createServiceRef< }, }), }); +/** + * @public + * This service is used to decorate the default plugin token handler with custom logic. + */ +export const externalTokenHandlersServiceRef = createServiceRef<{ + [configKey: string]: (config: Config) => TokenHandler; +}>({ + id: 'core.auth.externalTokenHandlers', + multiton: true, + // defaultFactory: async service => + // createServiceFactory({ + // service, + // deps: {}, + // factory: async () => {}, + // }), +}); /** * Handles token authentication and credentials management. @@ -64,6 +85,7 @@ export const authServiceFactory = createServiceFactory({ plugin: coreServices.pluginMetadata, database: coreServices.database, pluginTokenHandlerDecorator: pluginTokenHandlerDecoratorServiceRef, + externalTokenHandlers: externalTokenHandlersServiceRef, }, async factory({ config, @@ -72,6 +94,7 @@ export const authServiceFactory = createServiceFactory({ logger, database, pluginTokenHandlerDecorator, + externalTokenHandlers, }) { const disableDefaultAuthPolicy = config.getOptionalBoolean( @@ -106,6 +129,7 @@ export const authServiceFactory = createServiceFactory({ ownPluginId: plugin.getId(), config, logger, + externalTokenHandlers, }); return new DefaultAuthService( diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts index 39b01c46b6..de9c9e162b 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts @@ -208,4 +208,148 @@ describe('ExternalTokenHandler', () => { accessRestrictions: { permissionNames: ['catalog.entity.read'] }, }); }); + it('successfully uses custom token handlers', async () => { + const factory = new FakeTokenFactory({ + issuer: 'my-company', + keyDurationSeconds: 100, + }); + + server.use( + rest.get( + 'https://example.com/.well-known/jwks.json', + async (_, res, ctx) => { + const keys = await factory.listPublicKeys(); + return res(ctx.json(keys)); + }, + ), + ); + + const customHandler: TokenHandler = { + add: jest.fn(), + verifyToken: jest.fn(), + }; + + const handler = ExternalTokenHandler.create({ + ownPluginId: 'catalog', + logger: mockServices.logger.mock(), + config: mockServices.rootConfig({ + data: { + backend: { + auth: { + externalAccess: [ + { + type: 'internal-custom', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + ], + }, + }, + }, + }), + externalTokenHandlers: [{ ['internal-custom']: customHandler }], + }); + + expect(customHandler.add).toHaveBeenCalledWith( + expect.objectContaining({ + data: { + type: 'internal-custom', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + }), + ); + + const customToken = await factory.issueToken({ + claims: { sub: 'internal-subject' }, + }); + + await handler.verifyToken(customToken); + + expect(customHandler.verifyToken).toHaveBeenCalled(); + }); + it('should fail if config contains types not declared', async () => { + const createHandler = () => + ExternalTokenHandler.create({ + ownPluginId: 'catalog', + logger: mockServices.logger.mock(), + config: mockServices.rootConfig({ + data: { + backend: { + auth: { + externalAccess: [ + { + type: 'internal-custom', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + ], + }, + }, + }, + }), + }); + + expect(createHandler).toThrowErrorMatchingInlineSnapshot( + `"Unknown type 'internal-custom' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks'"`, + ); + }); + it('should show valid custom types in errors', async () => { + const createHandler = () => + ExternalTokenHandler.create({ + ownPluginId: 'catalog', + logger: mockServices.logger.mock(), + config: mockServices.rootConfig({ + data: { + backend: { + auth: { + externalAccess: [ + { + type: 'internal-custom-invalid', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + ], + }, + }, + }, + }), + externalTokenHandlers: [ + { + ['internal-custom']: { + add: jest.fn(), + verifyToken: jest.fn(), + }, + }, + ], + }); + + expect(createHandler).toThrowErrorMatchingInlineSnapshot( + `"Unknown type 'internal-custom-invalid' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, + ); + }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts index 72eeae6fcf..a4c55810c3 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts @@ -24,6 +24,7 @@ import { LegacyTokenHandler } from './legacy'; import { StaticTokenHandler } from './static'; import { JWKSHandler } from './jwks'; import { TokenHandler } from './types'; +import { Config } from '@backstage/config'; const NEW_CONFIG_KEY = 'backend.auth.externalAccess'; const OLD_CONFIG_KEY = 'backend.auth.keys'; @@ -40,17 +41,27 @@ export class ExternalTokenHandler { ownPluginId: string; config: RootConfigService; logger: LoggerService; + externalTokenHandlers?: { + [key: string]: (config: Config) => TokenHandler; + }[]; }): ExternalTokenHandler { - const { ownPluginId, config, logger } = options; + const { + ownPluginId, + config, + logger, + externalTokenHandlers: customHandlers, + } = options; const staticHandler = new StaticTokenHandler(); const legacyHandler = new LegacyTokenHandler(); const jwksHandler = new JWKSHandler(); - const handlers: Record = { - static: staticHandler, - legacy: legacyHandler, - jwks: jwksHandler, + const handlers: Record TokenHandler> = { + static: (handlerConfig: Config) => staticHandler.add(handlerConfig), + legacy: (handlerConfig: Config) => legacyHandler.add(handlerConfig), + jwks: (handlerConfig: Config) => jwksHandler.add(handlerConfig), + ...Object.assign({}, ...(customHandlers ?? [])), }; + const configuredHandlers = []; // Load the new-style handlers const handlerConfigs = config.getOptionalConfigArray(NEW_CONFIG_KEY) ?? []; @@ -65,7 +76,8 @@ export class ExternalTokenHandler { `Unknown type '${type}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`, ); } - handler.add(handlerConfig); + configuredHandlers.push(handler(handlerConfig)); + // handler.add(handlerConfig); } // Load the old keys too @@ -80,7 +92,7 @@ export class ExternalTokenHandler { legacyHandler.addOld(handlerConfig); } - return new ExternalTokenHandler(ownPluginId, Object.values(handlers)); + return new ExternalTokenHandler(ownPluginId, configuredHandlers); } constructor( diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts index e48926f0ce..51fe982891 100644 --- a/packages/backend-defaults/src/entrypoints/auth/index.ts +++ b/packages/backend-defaults/src/entrypoints/auth/index.ts @@ -17,6 +17,9 @@ export { authServiceFactory, pluginTokenHandlerDecoratorServiceRef, + externalTokenHandlerDecoratorServiceRef, } from './authServiceFactory'; +export type { ExternalTokenHandler } from './external/ExternalTokenHandler'; + export type { PluginTokenHandler } from './plugin/PluginTokenHandler'; diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts index 9aec52bc08..b692cd2b87 100644 --- a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts @@ -46,7 +46,7 @@ type Options = { /** * @public - * Issues and verifies {@link https://backstage.iceio/docs/auth/service-to-service-auth | service-to-service tokens}. + * Issues and verifies {@link https://backstage.io/docs/auth/service-to-service-auth | service-to-service tokens}. */ export interface PluginTokenHandler { verifyToken( From 7d96f52c41cf9bca8d4ea2ab32468368c0645d40 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Mon, 24 Mar 2025 09:08:19 +0100 Subject: [PATCH 011/177] fix some test and types Signed-off-by: Juan Pablo Garcia Ripa --- .../auth/authServiceFactory.test.ts | 103 +++++++++++++----- .../external/ExternalTokenHandler.test.ts | 9 +- .../src/entrypoints/auth/external/jwks.ts | 1 + .../src/entrypoints/auth/external/legacy.ts | 1 + .../src/entrypoints/auth/external/static.ts | 1 + .../src/entrypoints/auth/external/types.ts | 2 +- 6 files changed, 85 insertions(+), 32 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index 990668083f..51df123555 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -22,7 +22,6 @@ import { import { authServiceFactory, externalTokenHandlersServiceRef, - // externalTokenHandlersServiceRef, pluginTokenHandlerDecoratorServiceRef, } from './authServiceFactory'; import { base64url, decodeJwt } from 'jose'; @@ -34,7 +33,6 @@ import { PluginTokenHandler } from './plugin/PluginTokenHandler'; import { createServiceFactory } from '@backstage/backend-plugin-api'; import { AccessRestriptionsMap, TokenHandler } from './external/types'; import { Config } from '@backstage/config'; -import { x } from 'tar'; // import { ExternalTokenHandler } from './external/ExternalTokenHandler'; // import { TokenHandler } from './external/types'; @@ -65,13 +63,6 @@ const mockDeps = [ subject: 'unlimited-static-subject', }, }, - { - type: 'custom', - options: { - [`custom-config`]: 'custom-config', - foo: 'bar', - }, - }, ], }, }, @@ -472,36 +463,84 @@ describe('authServiceFactory', () => { it('should allow custom logic to be injected into the plugin token handler', async () => { const customLogic = jest.fn(); const customAddEntry = jest.fn(); + const customConfig = jest.fn(); + const deps = [ + discoveryServiceFactory, + mockServices.rootConfig.factory({ + data: { + backend: { + baseUrl: 'http://localhost', + auth: { + keys: [{ secret: 'abc' }], + externalAccess: [ + { + type: 'static', + options: { + token: 'limited-static-token', + subject: 'limited-static-subject', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'do.it' }, + ], + }, + { + type: 'static', + options: { + token: 'unlimited-static-token', + subject: 'unlimited-static-subject', + }, + }, + { + type: 'custom', + options: { + [`custom-config`]: 'custom-config', + foo: 'bar', + }, + }, + ], + }, + }, + }, + }), + ]; + + const customHandler = new (class CustomHandler implements TokenHandler { + add(options: Config): TokenHandler { + customAddEntry(options); + return this; + } + async verifyToken(token: string): Promise< + | { + subject: string; + allAccessRestrictions?: AccessRestriptionsMap; + } + | undefined + > { + customLogic(token); + return { + subject: 'foo', + }; + } + })(); + const customPluginTokenHandler = createServiceFactory({ service: externalTokenHandlersServiceRef, deps: {}, async factory() { return { - custom: new (class CustomHandler implements TokenHandler { - add(options: Config): void { - customAddEntry(options); - } - async verifyToken(token: string): Promise< - | { - subject: string; - allAccessRestrictions?: AccessRestriptionsMap; - } - | undefined - > { - customLogic(token); - return { - subject: 'foo', - }; - } - })(), + custom: (options: Config) => { + customConfig(options); + return customHandler.add(options); + }, }; }, }); const tester = ServiceFactoryTester.from(authServiceFactory, { - dependencies: [...mockDeps, customPluginTokenHandler], + dependencies: [...deps, customPluginTokenHandler], }); const searchAuth = await tester.getSubject('search'); await searchAuth.authenticate('custom-token'); + expect(customAddEntry).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -513,6 +552,16 @@ describe('authServiceFactory', () => { }), ); expect(customLogic).toHaveBeenCalledWith('custom-token'); + expect(customConfig).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ + options: expect.objectContaining({ + [`custom-config`]: 'custom-config', + foo: 'bar', + }), + }), + }), + ); }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts index de9c9e162b..3567061f03 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts @@ -228,6 +228,7 @@ describe('ExternalTokenHandler', () => { add: jest.fn(), verifyToken: jest.fn(), }; + const customHandlerCreator = jest.fn(() => customHandler); const handler = ExternalTokenHandler.create({ ownPluginId: 'catalog', @@ -253,10 +254,10 @@ describe('ExternalTokenHandler', () => { }, }, }), - externalTokenHandlers: [{ ['internal-custom']: customHandler }], + externalTokenHandlers: [{ ['internal-custom']: customHandlerCreator }], }); - expect(customHandler.add).toHaveBeenCalledWith( + expect(customHandlerCreator).toHaveBeenCalledWith( expect.objectContaining({ data: { type: 'internal-custom', @@ -340,10 +341,10 @@ describe('ExternalTokenHandler', () => { }), externalTokenHandlers: [ { - ['internal-custom']: { + ['internal-custom']: () => ({ add: jest.fn(), verifyToken: jest.fn(), - }, + }), }, ], }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts index d88dc62a47..32271972fb 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts @@ -68,6 +68,7 @@ export class JWKSHandler implements TokenHandler { url, allAccessRestrictions, }); + return this; } async verifyToken(token: string) { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts index 9c60e70707..fbd96aafd7 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts @@ -40,6 +40,7 @@ export class LegacyTokenHandler implements TokenHandler { config.getString('options.subject'), allAccessRestrictions, ); + return this; } // used only for the old backend.auth.keys array diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.ts index 1e89d8c6a1..b335b89e58 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.ts @@ -54,6 +54,7 @@ export class StaticTokenHandler implements TokenHandler { } this.#entries.set(token, { subject, allAccessRestrictions }); + return this; } async verifyToken(token: string) { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/types.ts b/packages/backend-defaults/src/entrypoints/auth/external/types.ts index 6a1fd084ed..e3cad90e17 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/types.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/types.ts @@ -23,7 +23,7 @@ export type AccessRestriptionsMap = Map< >; export interface TokenHandler { - add(options: Config): void; + add?(options: Config): TokenHandler; verifyToken(token: string): Promise< | { subject: string; From 9377fbfb0f2449e03289f566a5ad0d3b18874a8b Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Mon, 24 Mar 2025 10:22:43 +0100 Subject: [PATCH 012/177] feat(docs): add multiton docs and fix the custom handler service Signed-off-by: Juan Pablo Garcia Ripa --- .changeset/thirty-rules-press.md | 2 +- docs/auth/service-to-service-auth.md | 22 +++++----- .../architecture/03-services.md | 29 +++++++++++++ packages/backend-defaults/report-auth.api.md | 41 ++++++++++++------- .../auth/authServiceFactory.test.ts | 4 +- .../entrypoints/auth/authServiceFactory.ts | 6 --- .../src/entrypoints/auth/external/helpers.ts | 6 +-- .../src/entrypoints/auth/external/jwks.ts | 4 +- .../src/entrypoints/auth/external/legacy.ts | 6 +-- .../src/entrypoints/auth/external/static.ts | 4 +- .../src/entrypoints/auth/external/types.ts | 12 +++++- .../src/entrypoints/auth/index.ts | 5 ++- 12 files changed, 93 insertions(+), 48 deletions(-) diff --git a/.changeset/thirty-rules-press.md b/.changeset/thirty-rules-press.md index f4758da67b..d9968317cb 100644 --- a/.changeset/thirty-rules-press.md +++ b/.changeset/thirty-rules-press.md @@ -2,4 +2,4 @@ '@backstage/backend-defaults': minor --- -Add a new `externalTokenHandlerDecoratorServiceRef` to allow custom external token validations +Add a new `externalTokenHandlersServiceRef` to allow custom external token validations diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md index e821aeb0c7..8e8ef6a183 100644 --- a/docs/auth/service-to-service-auth.md +++ b/docs/auth/service-to-service-auth.md @@ -414,7 +414,7 @@ Each entry has one or more of the following fields: ## Adding custom or logic for validation and issuing of tokens -The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenHandlerDecoratorServiceRef` can be used to decorate the existing token handler without having to re-implement the entire `AuthService` implementation. +The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenHandlersServiceRef` can be used to extend the existing token handler without having to re-implement the entire `AuthService` implementation. This is particularly useful when you want to add additional logic to the handler, such as logging or metrics or custom token validation. ### PluginTokenHandler decoration @@ -446,25 +446,27 @@ const decoratedPluginTokenHandler = createServiceFactory({ ### ExternalTokenHandler decoration -The `externalTokenHandlerDecoratorServiceRef` can be used to decorate the default ExternalTokenHandler used for verify tokens from external callers. +The `externalTokenHandlersServiceRef` can be used to add custom external token handlers to the default implementation. -The `ExternalTokenHandler` interface has one methods: +The returned object should be a map of token custom types and their handler factories. The object keys will be matched to the configured `externalAccess` type in the app-config, calling the factory function with the config object for that type. Custom token handlers should implement the `TokenHandler` interface, which provides methods for verifying tokens. -- `verifyToken`: This method is used to verify a token. It takes in the token as an argument and returns a promise that resolves to an object containing the subject of the token and an optional limited user token. +For example, to add a custom token handler for a type called 'custom': ```ts import { - ExternalTokenHandler, - externalTokenHandlerDecoratorServiceRef, + TokenHandler, + externalTokenHandlersServiceRef, } from '@backstage/backend-defaults/auth'; +import { Config } from '@backstage/config'; import { createServiceFactory } from '@backstage/backend-plugin-api'; -const decoratedPluginTokenHandler = createServiceFactory({ - service: externalTokenHandlerDecoratorServiceRef, +const customExternalTokenHandlers = createServiceFactory({ + service: externalTokenHandlersServiceRef, deps: {}, async factory() { - return (defaultImplementation: ExternalTokenHandler) => - new CustomTokenHandler(defaultImplementation); + return { + custom: (config: Config) => new CustomTokenHandler(config); + }; }, }); ``` diff --git a/docs/backend-system/architecture/03-services.md b/docs/backend-system/architecture/03-services.md index cfcd606d92..3b168b81e3 100644 --- a/docs/backend-system/architecture/03-services.md +++ b/docs/backend-system/architecture/03-services.md @@ -223,6 +223,35 @@ export const customFooServiceFactory = createServiceFactory({ This allows you to provide more advanced options for the service implementation that couldn't be expressed through static configuration. It also gives users of the service implementation access to other services through dependency injection, which can be useful for their customizations. +## Multiton + +By default the service reference will point to a singleton instance of the service. This meand if a new service factory uses this reference will override the previous one. This is the most common use-case, but in some cases you may want to have multiple instances of the same service. +For some services, is desirable to extend the functionality instead of overriding it. For example, some services could have many handler to address a specific event, and you may want to add a new handler instead of overriding the previous one. In this case, you can use the `multiton` option when creating the service reference: + +```ts +// example-service-ref.ts +import { createServiceRef } from '@backstage/backend-plugin-api'; + +export interface FooService { + foo(options: FooOptions): Promise; +} + +export const fooServiceRef = createServiceRef({ + id: 'example.foo', + multiton: true, // this service ref will be an array of instances +}); +``` + +When adding this serviceRef ad dependency to a factory, the factory will receive an array of instances instead of a single instance: + +```ts +deps: {fooServices: fooServiceRef}, + factory(fooServices) { + // fooServices is an array of instances + return new Bar(fooServices); + }, +``` + ## Service Factory Options Pattern :::note Note diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index 56a973813d..9b7a56cff5 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -5,9 +5,16 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; +import { Config } from '@backstage/config'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; +// @public (undocumented) +export type AccessRestrictionsMap = Map< + string, // plugin ID + BackstagePrincipalAccessRestrictions +>; + // @public export const authServiceFactory: ServiceFactory< AuthService, @@ -16,22 +23,12 @@ export const authServiceFactory: ServiceFactory< >; // @public -export interface ExternalTokenHandler { - // (undocumented) - verifyToken(token: string): Promise< - | { - subject: string; - accessRestrictions?: BackstagePrincipalAccessRestrictions; - } - | undefined - >; -} - -// @public -export const externalTokenHandlerDecoratorServiceRef: ServiceRef< - (defaultImplementation: ExternalTokenHandler) => ExternalTokenHandler, +export const externalTokenHandlersServiceRef: ServiceRef< + { + [configKey: string]: (config: Config) => TokenHandler; + }, 'plugin', - 'singleton' + 'multiton' >; // @public @@ -64,5 +61,19 @@ export const pluginTokenHandlerDecoratorServiceRef: ServiceRef< 'singleton' >; +// @public +export interface TokenHandler { + // (undocumented) + add?(options: Config): TokenHandler; + // (undocumented) + verifyToken(token: string): Promise< + | { + subject: string; + allAccessRestrictions?: AccessRestrictionsMap; + } + | undefined + >; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index 51df123555..d6cc0023a8 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -31,7 +31,7 @@ import { setupServer } from 'msw/node'; import { toInternalBackstageCredentials } from './helpers'; import { PluginTokenHandler } from './plugin/PluginTokenHandler'; import { createServiceFactory } from '@backstage/backend-plugin-api'; -import { AccessRestriptionsMap, TokenHandler } from './external/types'; +import { AccessRestrictionsMap, TokenHandler } from './external/types'; import { Config } from '@backstage/config'; // import { ExternalTokenHandler } from './external/ExternalTokenHandler'; // import { TokenHandler } from './external/types'; @@ -512,7 +512,7 @@ describe('authServiceFactory', () => { async verifyToken(token: string): Promise< | { subject: string; - allAccessRestrictions?: AccessRestriptionsMap; + allAccessRestrictions?: AccessRestrictionsMap; } | undefined > { diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index 48f0941b12..ae8ad205b7 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -59,12 +59,6 @@ export const externalTokenHandlersServiceRef = createServiceRef<{ }>({ id: 'core.auth.externalTokenHandlers', multiton: true, - // defaultFactory: async service => - // createServiceFactory({ - // service, - // deps: {}, - // factory: async () => {}, - // }), }); /** diff --git a/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts b/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts index d6aa0a01ff..4a01117e28 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts @@ -15,7 +15,7 @@ */ import { Config } from '@backstage/config'; -import { AccessRestriptionsMap } from './types'; +import { AccessRestrictionsMap } from './types'; /** * Parses and returns the `accessRestrictions` configuration from an @@ -25,12 +25,12 @@ import { AccessRestriptionsMap } from './types'; */ export function readAccessRestrictionsFromConfig( externalAccessEntryConfig: Config, -): AccessRestriptionsMap | undefined { +): AccessRestrictionsMap | undefined { const configs = externalAccessEntryConfig.getOptionalConfigArray('accessRestrictions') ?? []; - const result: AccessRestriptionsMap = new Map(); + const result: AccessRestrictionsMap = new Map(); for (const config of configs) { const validKeys = ['plugin', 'permission', 'permissionAttribute']; for (const key of config.keys()) { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts index 32271972fb..49167bcd35 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts @@ -20,7 +20,7 @@ import { readAccessRestrictionsFromConfig, readStringOrStringArrayFromConfig, } from './helpers'; -import { AccessRestriptionsMap, TokenHandler } from './types'; +import { AccessRestrictionsMap, TokenHandler } from './types'; /** * Handles `type: jwks` access. @@ -35,7 +35,7 @@ export class JWKSHandler implements TokenHandler { subjectPrefix?: string; url: URL; jwks: JWTVerifyGetKey; - allAccessRestrictions?: AccessRestriptionsMap; + allAccessRestrictions?: AccessRestrictionsMap; }> = []; add(config: Config) { diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts index fbd96aafd7..09d759a09e 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts @@ -17,7 +17,7 @@ import { Config } from '@backstage/config'; import { base64url, decodeJwt, decodeProtectedHeader, jwtVerify } from 'jose'; import { readAccessRestrictionsFromConfig } from './helpers'; -import { AccessRestriptionsMap, TokenHandler } from './types'; +import { AccessRestrictionsMap, TokenHandler } from './types'; /** * Handles `type: legacy` access. @@ -29,7 +29,7 @@ export class LegacyTokenHandler implements TokenHandler { key: Uint8Array; result: { subject: string; - allAccessRestrictions?: AccessRestriptionsMap; + allAccessRestrictions?: AccessRestrictionsMap; }; }>(); @@ -52,7 +52,7 @@ export class LegacyTokenHandler implements TokenHandler { #doAdd( secret: string, subject: string, - allAccessRestrictions?: AccessRestriptionsMap, + allAccessRestrictions?: AccessRestrictionsMap, ) { if (!secret.match(/^\S+$/)) { throw new Error('Illegal secret, must be a valid base64 string'); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.ts index b335b89e58..e003f0530b 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.ts @@ -16,7 +16,7 @@ import { Config } from '@backstage/config'; import { readAccessRestrictionsFromConfig } from './helpers'; -import { AccessRestriptionsMap, TokenHandler } from './types'; +import { AccessRestrictionsMap, TokenHandler } from './types'; const MIN_TOKEN_LENGTH = 8; @@ -30,7 +30,7 @@ export class StaticTokenHandler implements TokenHandler { string, { subject: string; - allAccessRestrictions?: AccessRestriptionsMap; + allAccessRestrictions?: AccessRestrictionsMap; } >(); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/types.ts b/packages/backend-defaults/src/entrypoints/auth/external/types.ts index e3cad90e17..6b882ef16b 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/types.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/types.ts @@ -17,17 +17,25 @@ import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; -export type AccessRestriptionsMap = Map< +/** + * @public + */ +export type AccessRestrictionsMap = Map< string, // plugin ID BackstagePrincipalAccessRestrictions >; +/** + * @public + * This interface is used to handle external tokens. + * It is used by the auth service to verify tokens and extract the subject. + */ export interface TokenHandler { add?(options: Config): TokenHandler; verifyToken(token: string): Promise< | { subject: string; - allAccessRestrictions?: AccessRestriptionsMap; + allAccessRestrictions?: AccessRestrictionsMap; } | undefined >; diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts index 51fe982891..96db6c0535 100644 --- a/packages/backend-defaults/src/entrypoints/auth/index.ts +++ b/packages/backend-defaults/src/entrypoints/auth/index.ts @@ -17,9 +17,10 @@ export { authServiceFactory, pluginTokenHandlerDecoratorServiceRef, - externalTokenHandlerDecoratorServiceRef, + externalTokenHandlersServiceRef, } from './authServiceFactory'; -export type { ExternalTokenHandler } from './external/ExternalTokenHandler'; +export type { TokenHandler } from './external/types'; +export type { AccessRestrictionsMap } from './external/types'; export type { PluginTokenHandler } from './plugin/PluginTokenHandler'; From 410b81afd70627923e795a43269a2daec265a62d Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Fri, 25 Apr 2025 08:46:55 +0200 Subject: [PATCH 013/177] feat: use multiple Config factory Signed-off-by: Juan Pablo Garcia Ripa --- packages/backend-defaults/report-auth.api.md | 7 +- .../auth/authServiceFactory.test.ts | 38 ++--- .../entrypoints/auth/authServiceFactory.ts | 16 +- .../external/ExternalTokenHandler.test.ts | 100 +++++++++--- .../auth/external/ExternalTokenHandler.ts | 117 ++++++++++---- .../entrypoints/auth/external/jwks.test.ts | 45 +++--- .../src/entrypoints/auth/external/jwks.ts | 7 +- .../entrypoints/auth/external/legacy.test.ts | 143 ++++++++++-------- .../src/entrypoints/auth/external/legacy.ts | 20 +++ .../entrypoints/auth/external/static.test.ts | 129 ++++++++-------- .../src/entrypoints/auth/external/static.ts | 7 +- .../src/entrypoints/auth/external/types.ts | 2 - .../src/entrypoints/auth/index.ts | 3 +- 13 files changed, 392 insertions(+), 242 deletions(-) diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index 9b7a56cff5..bcc5c4a073 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -23,9 +23,10 @@ export const authServiceFactory: ServiceFactory< >; // @public -export const externalTokenHandlersServiceRef: ServiceRef< +export const externalTokenTypeHandlersRef: ServiceRef< { - [configKey: string]: (config: Config) => TokenHandler; + type: string; + factory: (config: Config[]) => TokenHandler; }, 'plugin', 'multiton' @@ -63,8 +64,6 @@ export const pluginTokenHandlerDecoratorServiceRef: ServiceRef< // @public export interface TokenHandler { - // (undocumented) - add?(options: Config): TokenHandler; // (undocumented) verifyToken(token: string): Promise< | { diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index d6cc0023a8..b808973016 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -21,7 +21,6 @@ import { } from '@backstage/backend-test-utils'; import { authServiceFactory, - externalTokenHandlersServiceRef, pluginTokenHandlerDecoratorServiceRef, } from './authServiceFactory'; import { base64url, decodeJwt } from 'jose'; @@ -33,8 +32,7 @@ import { PluginTokenHandler } from './plugin/PluginTokenHandler'; import { createServiceFactory } from '@backstage/backend-plugin-api'; import { AccessRestrictionsMap, TokenHandler } from './external/types'; import { Config } from '@backstage/config'; -// import { ExternalTokenHandler } from './external/ExternalTokenHandler'; -// import { TokenHandler } from './external/types'; +import { externalTokenTypeHandlersRef } from './external/ExternalTokenHandler'; const server = setupServer(); @@ -504,10 +502,11 @@ describe('authServiceFactory', () => { }), ]; - const customHandler = new (class CustomHandler implements TokenHandler { - add(options: Config): TokenHandler { - customAddEntry(options); - return this; + class CustomHandler implements TokenHandler { + constructor(options: Config[]) { + for (const option of options) { + customAddEntry(option); + } } async verifyToken(token: string): Promise< | { @@ -521,16 +520,17 @@ describe('authServiceFactory', () => { subject: 'foo', }; } - })(); + } const customPluginTokenHandler = createServiceFactory({ - service: externalTokenHandlersServiceRef, + service: externalTokenTypeHandlersRef, deps: {}, async factory() { return { - custom: (options: Config) => { - customConfig(options); - return customHandler.add(options); + type: 'custom', + factory: (configs: Config[]) => { + customConfig(configs); + return new CustomHandler(configs); }, }; }, @@ -553,14 +553,16 @@ describe('authServiceFactory', () => { ); expect(customLogic).toHaveBeenCalledWith('custom-token'); expect(customConfig).toHaveBeenCalledWith( - expect.objectContaining({ - data: expect.objectContaining({ - options: expect.objectContaining({ - [`custom-config`]: 'custom-config', - foo: 'bar', + expect.arrayContaining([ + expect.objectContaining({ + data: expect.objectContaining({ + options: expect.objectContaining({ + [`custom-config`]: 'custom-config', + foo: 'bar', + }), }), }), - }), + ]), ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index ae8ad205b7..43a3c9da50 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -21,8 +21,8 @@ import { } from '@backstage/backend-plugin-api'; import { DefaultAuthService } from './DefaultAuthService'; import { - // DefaultExternalTokenHandler, ExternalTokenHandler, + externalTokenTypeHandlersRef, } from './external/ExternalTokenHandler'; import { DefaultPluginTokenHandler, @@ -30,8 +30,6 @@ import { } from './plugin/PluginTokenHandler'; import { createPluginKeySource } from './plugin/keys/createPluginKeySource'; import { UserTokenHandler } from './user/UserTokenHandler'; -import { TokenHandler } from './external/types'; -import { Config } from '@backstage/config'; /** * @public @@ -50,16 +48,6 @@ export const pluginTokenHandlerDecoratorServiceRef = createServiceRef< }, }), }); -/** - * @public - * This service is used to decorate the default plugin token handler with custom logic. - */ -export const externalTokenHandlersServiceRef = createServiceRef<{ - [configKey: string]: (config: Config) => TokenHandler; -}>({ - id: 'core.auth.externalTokenHandlers', - multiton: true, -}); /** * Handles token authentication and credentials management. @@ -79,7 +67,7 @@ export const authServiceFactory = createServiceFactory({ plugin: coreServices.pluginMetadata, database: coreServices.database, pluginTokenHandlerDecorator: pluginTokenHandlerDecoratorServiceRef, - externalTokenHandlers: externalTokenHandlersServiceRef, + externalTokenHandlers: externalTokenTypeHandlersRef, }, async factory({ config, diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts index 3567061f03..3348d84e93 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts @@ -85,12 +85,10 @@ describe('ExternalTokenHandler', () => { it('skips over inner handlers that do not match, and applies plugin restrictions', async () => { const handler1: TokenHandler = { - add: jest.fn(), verifyToken: jest.fn().mockResolvedValue(undefined), }; const handler2: TokenHandler = { - add: jest.fn(), verifyToken: jest.fn().mockResolvedValue({ subject: 'sub', allAccessRestrictions: new Map( @@ -225,10 +223,9 @@ describe('ExternalTokenHandler', () => { ); const customHandler: TokenHandler = { - add: jest.fn(), verifyToken: jest.fn(), }; - const customHandlerCreator = jest.fn(() => customHandler); + const customHandlerFactory = jest.fn(() => customHandler); const handler = ExternalTokenHandler.create({ ownPluginId: 'catalog', @@ -254,23 +251,30 @@ describe('ExternalTokenHandler', () => { }, }, }), - externalTokenHandlers: [{ ['internal-custom']: customHandlerCreator }], + externalTokenHandlers: [ + { + type: 'internal-custom', + factory: customHandlerFactory, + }, + ], }); - expect(customHandlerCreator).toHaveBeenCalledWith( - expect.objectContaining({ - data: { - type: 'internal-custom', - options: { - issuer: 'my-company', - subject: 'internal-subject', - audience: 'backstage', + expect(customHandlerFactory).toHaveBeenCalledWith( + expect.arrayContaining([ + expect.objectContaining({ + data: { + type: 'internal-custom', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], }, - accessRestrictions: [ - { plugin: 'catalog', permission: 'catalog.entity.read' }, - ], - }, - }), + }), + ]), ); const customToken = await factory.issueToken({ @@ -310,9 +314,10 @@ describe('ExternalTokenHandler', () => { }); expect(createHandler).toThrowErrorMatchingInlineSnapshot( - `"Unknown type 'internal-custom' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks'"`, + `"Unknown type(s) 'internal-custom' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks'"`, ); }); + it('should show valid custom types in errors', async () => { const createHandler = () => ExternalTokenHandler.create({ @@ -341,8 +346,8 @@ describe('ExternalTokenHandler', () => { }), externalTokenHandlers: [ { - ['internal-custom']: () => ({ - add: jest.fn(), + type: 'internal-custom', + factory: () => ({ verifyToken: jest.fn(), }), }, @@ -350,7 +355,58 @@ describe('ExternalTokenHandler', () => { }); expect(createHandler).toThrowErrorMatchingInlineSnapshot( - `"Unknown type 'internal-custom-invalid' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, + `"Unknown type(s) 'internal-custom-invalid' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, + ); + }); + it('should show all invalid config types', async () => { + const createHandler = () => + ExternalTokenHandler.create({ + ownPluginId: 'catalog', + logger: mockServices.logger.mock(), + config: mockServices.rootConfig({ + data: { + backend: { + auth: { + externalAccess: [ + { + type: 'internal-custom-invalid', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + { + type: 'internal-custom-invalid-2', + options: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + ], + }, + }, + }, + }), + externalTokenHandlers: [ + { + type: 'internal-custom', + factory: () => ({ + verifyToken: jest.fn(), + }), + }, + ], + }); + + expect(createHandler).toThrowErrorMatchingInlineSnapshot( + `"Unknown type(s) 'internal-custom-invalid, internal-custom-invalid-2' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts index a4c55810c3..cc93b7b182 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts @@ -16,20 +16,70 @@ import { BackstagePrincipalAccessRestrictions, + createServiceRef, LoggerService, RootConfigService, } from '@backstage/backend-plugin-api'; import { NotAllowedError } from '@backstage/errors'; -import { LegacyTokenHandler } from './legacy'; +import { LegacyConfigWrapper, LegacyTokenHandler } from './legacy'; import { StaticTokenHandler } from './static'; import { JWKSHandler } from './jwks'; import { TokenHandler } from './types'; import { Config } from '@backstage/config'; +import { groupBy } from 'lodash'; const NEW_CONFIG_KEY = 'backend.auth.externalAccess'; const OLD_CONFIG_KEY = 'backend.auth.keys'; let loggedDeprecationWarning = false; +/** + * @public + * This service is used to decorate the default plugin token handler with custom logic. + */ +export const externalTokenTypeHandlersRef = createServiceRef<{ + type: string; + factory: (config: Config[]) => TokenHandler; +}>({ + id: 'core.auth.externalTokenHandlers', + multiton: true, + // defaultFactory // :pepe-think: seems like is not possible to use defaultFactory with multiton +}); + +type TokenTypeHandler = { + type: string; + /** + * A factory function that takes all token configuration for a given type + * and returns a TokenHandler or an array of TokenHandlers. + */ + factory: (config: Config[]) => TokenHandler | TokenHandler[]; +}; +type LegacyTokenTypeHandler = { + type: 'legacy'; + /** + * A factory function that takes all token configuration for a given type + * and returns a TokenHandler or an array of TokenHandlers. + */ + factory: ( + config: (Config | LegacyConfigWrapper)[], + ) => TokenHandler | TokenHandler[]; +}; + +const defaultHandlers: (TokenTypeHandler | LegacyTokenTypeHandler)[] = [ + { + type: 'static', + factory: configs => new StaticTokenHandler(configs), + }, + { + type: 'legacy', + factory: (configs: (Config | { legacy: true; config: Config })[]) => + new LegacyTokenHandler(configs), + }, + { + type: 'jwks', + factory: configs => new JWKSHandler(configs), + }, +]; + /** * Handles all types of external caller token types (i.e. not Backstage user * tokens, nor Backstage backend plugin tokens). @@ -41,9 +91,7 @@ export class ExternalTokenHandler { ownPluginId: string; config: RootConfigService; logger: LoggerService; - externalTokenHandlers?: { - [key: string]: (config: Config) => TokenHandler; - }[]; + externalTokenHandlers?: TokenTypeHandler[]; }): ExternalTokenHandler { const { ownPluginId, @@ -52,36 +100,18 @@ export class ExternalTokenHandler { externalTokenHandlers: customHandlers, } = options; - const staticHandler = new StaticTokenHandler(); - const legacyHandler = new LegacyTokenHandler(); - const jwksHandler = new JWKSHandler(); - const handlers: Record TokenHandler> = { - static: (handlerConfig: Config) => staticHandler.add(handlerConfig), - legacy: (handlerConfig: Config) => legacyHandler.add(handlerConfig), - jwks: (handlerConfig: Config) => jwksHandler.add(handlerConfig), - ...Object.assign({}, ...(customHandlers ?? [])), - }; - const configuredHandlers = []; + const handlersTypes = [...defaultHandlers, ...(customHandlers ?? [])]; - // Load the new-style handlers const handlerConfigs = config.getOptionalConfigArray(NEW_CONFIG_KEY) ?? []; - for (const handlerConfig of handlerConfigs) { - const type = handlerConfig.getString('type'); - const handler = handlers[type]; - if (!handler) { - const valid = Object.keys(handlers) - .map(k => `'${k}'`) - .join(', '); - throw new Error( - `Unknown type '${type}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`, - ); - } - configuredHandlers.push(handler(handlerConfig)); - // handler.add(handlerConfig); - } + const handlerConfigByType: Record & { + legacy?: (Config | LegacyConfigWrapper)[]; + } = groupBy(handlerConfigs, (handlerConfig: Config) => + handlerConfig.getString('type'), + ); // Load the old keys too const legacyConfigs = config.getOptionalConfigArray(OLD_CONFIG_KEY) ?? []; + if (legacyConfigs.length && !loggedDeprecationWarning) { loggedDeprecationWarning = true; logger.warn( @@ -89,10 +119,35 @@ export class ExternalTokenHandler { ); } for (const handlerConfig of legacyConfigs) { - legacyHandler.addOld(handlerConfig); + handlerConfigByType.legacy ??= []; + handlerConfigByType.legacy.push({ legacy: true, config: handlerConfig }); } - return new ExternalTokenHandler(ownPluginId, configuredHandlers); + const invalidTypes = Object.keys(handlerConfigByType).filter( + type => !handlersTypes.some(handler => handler.type === type), + ); + + if (invalidTypes.length > 0) { + const valid = handlersTypes + .map(handler => `'${handler.type}'`) + .join(', '); + throw new Error( + `Unknown type(s) '${invalidTypes.join( + ', ', + )}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`, + ); + } + + const handlers = handlersTypes.flatMap(handler => { + const configs = handlerConfigByType[handler.type] ?? []; + const handlerInstances = handler.factory(configs); + if (Array.isArray(handlerInstances)) { + return handlerInstances; + } + return [handlerInstances]; + }); + + return new ExternalTokenHandler(ownPluginId, handlers); } constructor( diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts index 321e1823aa..eefbce5093 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts @@ -108,9 +108,7 @@ describe('JWKSHandler', () => { audience: 'backstage', }, }; - const jwksHandler = new JWKSHandler(); - - jwksHandler.add(new ConfigReader(validEntry)); + const jwksHandler = new JWKSHandler([new ConfigReader(validEntry)]); const token = await factory.issueToken({ claims: { sub: mockSubject }, @@ -139,10 +137,10 @@ describe('JWKSHandler', () => { audience: ['multiple-audiences', 'backstage'], }, }; - const jwksHandler = new JWKSHandler(); - - jwksHandler.add(new ConfigReader(invalidEntry)); - jwksHandler.add(new ConfigReader(validEntry)); + const jwksHandler = new JWKSHandler([ + new ConfigReader(invalidEntry), + new ConfigReader(validEntry), + ]); const token = await factory.issueToken({ claims: { sub: mockSubject }, @@ -169,10 +167,10 @@ describe('JWKSHandler', () => { audience: 'wrong', }, }; - const jwksHandler = new JWKSHandler(); - - jwksHandler.add(new ConfigReader(invalidEntry1)); - jwksHandler.add(new ConfigReader(invalidEntry2)); + const jwksHandler = new JWKSHandler([ + new ConfigReader(invalidEntry1), + new ConfigReader(invalidEntry2), + ]); const token = await factory.issueToken({ claims: { sub: mockSubject }, @@ -184,30 +182,26 @@ describe('JWKSHandler', () => { }); it('rejects bad config', () => { - const jwksHandler = new JWKSHandler(); - expect(() => { - jwksHandler.add( + return new JWKSHandler([ new ConfigReader({ - options: { - url: 'https://exampl e.com/jwks', - }, + options: { url: 'https://exampl e.com/jwks' }, }), - ); + ]); }).toThrow('Illegal JWKS URL, must be a set of non-space characters'); expect(() => { - jwksHandler.add( + return new JWKSHandler([ new ConfigReader({ options: { url: 'https://example.com/jwks\n', }, }), - ); + ]); }).toThrow('Illegal JWKS URL, must be a set of non-space characters'); }); it('gracefully handles no added tokens', async () => { - const handler = new JWKSHandler(); + const handler = new JWKSHandler([]); await expect(handler.verifyToken('ghi')).resolves.toBeUndefined(); }); @@ -221,9 +215,7 @@ describe('JWKSHandler', () => { subjectPrefix: 'custom-prefix', }, }; - const jwksHandler = new JWKSHandler(); - - jwksHandler.add(new ConfigReader(validEntry)); + const jwksHandler = new JWKSHandler([new ConfigReader(validEntry)]); const token = await factory.issueToken({ claims: { sub: mockSubject }, @@ -237,15 +229,14 @@ describe('JWKSHandler', () => { }); it('carries over access restrictions', async () => { - const jwksHandler = new JWKSHandler(); - jwksHandler.add( + const jwksHandler = new JWKSHandler([ new ConfigReader({ options: { url: `${mockBaseUrl}/.well-known/jwks.json`, }, accessRestrictions: [{ plugin: 'scaffolder', permission: 'do.it' }], }), - ); + ]); const token = await factory.issueToken({ claims: { sub: mockSubject } }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts index 49167bcd35..5f7fcb4127 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts @@ -38,7 +38,12 @@ export class JWKSHandler implements TokenHandler { allAccessRestrictions?: AccessRestrictionsMap; }> = []; - add(config: Config) { + constructor(configs: Config[]) { + for (const config of configs) { + this.add(config); + } + } + private add(config: Config) { if (!config.getString('options.url').match(/^\S+$/)) { throw new Error( 'Illegal JWKS URL, must be a set of non-space characters', diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts index c674e46ec9..4892d0a21a 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts @@ -21,7 +21,6 @@ import { DateTime } from 'luxon'; import { LegacyTokenHandler } from './legacy'; describe('LegacyTokenHandler', () => { - const tokenHandler = new LegacyTokenHandler(); const key1 = randomBytes(24); const key2 = randomBytes(24); const key3 = randomBytes(24); @@ -36,7 +35,7 @@ describe('LegacyTokenHandler', () => { }), ); - tokenHandler.add( + const configs = [ new ConfigReader({ options: { secret: key1.toString('base64'), @@ -44,8 +43,7 @@ describe('LegacyTokenHandler', () => { }, accessRestrictions: [{ plugin: 'scaffolder' }], }), - ); - tokenHandler.add( + new ConfigReader({ options: { secret: key2.toString('base64'), @@ -55,12 +53,14 @@ describe('LegacyTokenHandler', () => { { plugin: 'catalog', permission: 'catalog.entity.read' }, ], }), - ); - tokenHandler.addOld( - new ConfigReader({ - secret: key3.toString('base64'), - }), - ); + { + legacy: true, + config: new ConfigReader({ + secret: key3.toString('base64'), + }), + }, + ]; + const tokenHandler = new LegacyTokenHandler(configs); it('should verify valid tokens', async () => { const token1 = await new SignJWT({ @@ -163,94 +163,113 @@ describe('LegacyTokenHandler', () => { }); it('rejects bad config', () => { - const handler = new LegacyTokenHandler(); + const handler = new LegacyTokenHandler([]); // new style add, bad secrets - expect(() => - handler.add( - new ConfigReader({ options: { _missingsecret: true, subject: 'ok' } }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { _missingsecret: true, subject: 'ok' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Missing required config value at 'options.secret' in 'mock-config'"`, ); - expect(() => - handler.add(new ConfigReader({ options: { secret: '', subject: 'ok' } })), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ options: { secret: '', subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.secret' in 'mock-config', got empty-string, wanted string"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { secret: 'has spaces', subject: 'ok' } }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { secret: 'has spaces', subject: 'ok' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal secret, must be a valid base64 string"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { secret: 'hasnewline\n', subject: 'ok' }, - }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { secret: 'hasnewline\n', subject: 'ok' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal secret, must be a valid base64 string"`, ); - expect(() => - handler.add(new ConfigReader({ options: { secret: 3, subject: 'ok' } })), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ options: { secret: 3, subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.secret' in 'mock-config', got number, wanted string"`, ); // new style add, bad subjects - expect(() => - handler.add( - new ConfigReader({ - options: { secret: 'b2s=', _missingsubject: true }, - }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { secret: 'b2s=', _missingsubject: true }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Missing required config value at 'options.subject' in 'mock-config'"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { secret: 'b2s=', subject: '' } }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ options: { secret: 'b2s=', subject: '' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.subject' in 'mock-config', got empty-string, wanted string"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { secret: 'b2s=', subject: 'has spaces' }, - }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { secret: 'b2s=', subject: 'has spaces' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal subject, must be a set of non-space characters"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { secret: 'b2s=', subject: 'hasnewline\n' }, - }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { secret: 'b2s=', subject: 'hasnewline\n' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal subject, must be a set of non-space characters"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { secret: 'b2s=', subject: 3 } }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ options: { secret: 'b2s=', subject: 3 } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.subject' in 'mock-config', got number, wanted string"`, ); // new style add, bad access restrictions - expect(() => - handler.add( - new ConfigReader({ - options: { secret: 'b2s=', subject: 'subject' }, - accessRestrictions: [{ plugin: ['a'] }], - }), - ), + expect( + () => + new LegacyTokenHandler([ + new ConfigReader({ + options: { secret: 'b2s=', subject: 'subject' }, + accessRestrictions: [{ plugin: ['a'] }], + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'accessRestrictions[0].plugin' in 'mock-config', got array, wanted string"`, ); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts index 09d759a09e..8be0de19e4 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts @@ -19,6 +19,10 @@ import { base64url, decodeJwt, decodeProtectedHeader, jwtVerify } from 'jose'; import { readAccessRestrictionsFromConfig } from './helpers'; import { AccessRestrictionsMap, TokenHandler } from './types'; +export type LegacyConfigWrapper = { + legacy: boolean; + config: Config; +}; /** * Handles `type: legacy` access. * @@ -33,6 +37,16 @@ export class LegacyTokenHandler implements TokenHandler { }; }>(); + constructor(configs: (Config | LegacyConfigWrapper)[]) { + for (const config of configs) { + if (isLegacy(config)) { + this.addOld(config.config); + continue; + } + this.add(config); + } + } + add(config: Config) { const allAccessRestrictions = readAccessRestrictionsFromConfig(config); this.#doAdd( @@ -119,3 +133,9 @@ export class LegacyTokenHandler implements TokenHandler { return undefined; } } + +function isLegacy( + config: Config | LegacyConfigWrapper, +): config is LegacyConfigWrapper { + return (config as LegacyConfigWrapper).legacy === true; +} diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts index a5945daba9..cf1c1a46ac 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts @@ -19,21 +19,19 @@ import { StaticTokenHandler } from './static'; describe('StaticTokenHandler', () => { it('accepts any of the added list of tokens', async () => { - const handler = new StaticTokenHandler(); - handler.add( + const configs = [ new ConfigReader({ options: { token: 'abcabcabc', subject: 'one' }, accessRestrictions: [{ plugin: 'scaffolder' }], }), - ); - handler.add( new ConfigReader({ options: { token: 'defdefdef', subject: 'two' }, accessRestrictions: [ { plugin: 'catalog', permission: 'catalog.entity.read' }, ], }), - ); + ]; + const handler = new StaticTokenHandler(configs); const accessRestrictionsOne = new Map(Object.entries({ scaffolder: {} })); const accessRestrictionsTwo = new Map( Object.entries({ @@ -55,95 +53,108 @@ describe('StaticTokenHandler', () => { }); it('gracefully handles no added tokens', async () => { - const handler = new StaticTokenHandler(); + const handler = new StaticTokenHandler([]); await expect(handler.verifyToken('ghi')).resolves.toBeUndefined(); }); it('rejects bad config', () => { - const handler = new StaticTokenHandler(); - - expect(() => - handler.add( - new ConfigReader({ options: { _missingtoken: true, subject: 'ok' } }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { _missingtoken: true, subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Missing required config value at 'options.token' in 'mock-config'"`, ); - expect(() => - handler.add(new ConfigReader({ options: { token: '', subject: 'ok' } })), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { token: '', subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.token' in 'mock-config', got empty-string, wanted string"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { token: 'has spaces', subject: 'ok' } }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { token: 'has spaces', subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal token, must be a set of non-space characters"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { - token: 'hasnewlinebutislongenough\n', - subject: 'ok', - }, - }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ + options: { + token: 'hasnewlinebutislongenough\n', + subject: 'ok', + }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal token, must be a set of non-space characters"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { token: 'short', subject: 'ok' } }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { token: 'short', subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal token, must be at least 8 characters length"`, ); - expect(() => - handler.add(new ConfigReader({ options: { token: 3, subject: 'ok' } })), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { token: 3, subject: 'ok' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.token' in 'mock-config', got number, wanted string"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { token: 'validtoken', _missingsubject: true }, - }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ + options: { token: 'validtoken', _missingsubject: true }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Missing required config value at 'options.subject' in 'mock-config'"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { token: 'validtoken', subject: '' } }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { token: 'validtoken', subject: '' } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.subject' in 'mock-config', got empty-string, wanted string"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { token: 'validtoken', subject: 'has spaces' }, - }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ + options: { token: 'validtoken', subject: 'has spaces' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal subject, must be a set of non-space characters"`, ); - expect(() => - handler.add( - new ConfigReader({ - options: { token: 'validtoken', subject: 'hasnewline\n' }, - }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ + options: { token: 'validtoken', subject: 'hasnewline\n' }, + }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Illegal subject, must be a set of non-space characters"`, ); - expect(() => - handler.add( - new ConfigReader({ options: { token: 'validtoken', subject: 3 } }), - ), + expect( + () => + new StaticTokenHandler([ + new ConfigReader({ options: { token: 'validtoken', subject: 3 } }), + ]), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'options.subject' in 'mock-config', got number, wanted string"`, ); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.ts index e003f0530b..7764569aca 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.ts @@ -34,7 +34,12 @@ export class StaticTokenHandler implements TokenHandler { } >(); - add(config: Config) { + constructor(configs: Config[]) { + for (const config of configs) { + this.add(config); + } + } + private add(config: Config) { const token = config.getString('options.token'); const subject = config.getString('options.subject'); const allAccessRestrictions = readAccessRestrictionsFromConfig(config); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/types.ts b/packages/backend-defaults/src/entrypoints/auth/external/types.ts index 6b882ef16b..c3d45fd0d7 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/types.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/types.ts @@ -15,7 +15,6 @@ */ import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; /** * @public @@ -31,7 +30,6 @@ export type AccessRestrictionsMap = Map< * It is used by the auth service to verify tokens and extract the subject. */ export interface TokenHandler { - add?(options: Config): TokenHandler; verifyToken(token: string): Promise< | { subject: string; diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts index 96db6c0535..1b1a29a247 100644 --- a/packages/backend-defaults/src/entrypoints/auth/index.ts +++ b/packages/backend-defaults/src/entrypoints/auth/index.ts @@ -17,9 +17,10 @@ export { authServiceFactory, pluginTokenHandlerDecoratorServiceRef, - externalTokenHandlersServiceRef, } from './authServiceFactory'; +export { externalTokenTypeHandlersRef } from './external/ExternalTokenHandler'; + export type { TokenHandler } from './external/types'; export type { AccessRestrictionsMap } from './external/types'; From 65d382e272f66896623a5d611caf77d9fe772b52 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Thu, 15 May 2025 22:58:35 +0200 Subject: [PATCH 014/177] fix: update docs with new approach and export types Signed-off-by: Juan Pablo Garcia Ripa --- docs/auth/service-to-service-auth.md | 35 ++++++++++++++---- packages/backend-defaults/report-auth.api.md | 12 ++++-- .../auth/external/ExternalTokenHandler.ts | 37 ++++++++----------- .../src/entrypoints/auth/external/types.ts | 15 ++++++++ .../src/entrypoints/auth/index.ts | 2 +- 5 files changed, 67 insertions(+), 34 deletions(-) diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md index 8e8ef6a183..4d8829d91d 100644 --- a/docs/auth/service-to-service-auth.md +++ b/docs/auth/service-to-service-auth.md @@ -414,7 +414,7 @@ Each entry has one or more of the following fields: ## Adding custom or logic for validation and issuing of tokens -The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenHandlersServiceRef` can be used to extend the existing token handler without having to re-implement the entire `AuthService` implementation. +The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenTypeHandlersRef` can be used to extend the existing token handler without having to re-implement the entire `AuthService` implementation. This is particularly useful when you want to add additional logic to the handler, such as logging or metrics or custom token validation. ### PluginTokenHandler decoration @@ -446,26 +446,47 @@ const decoratedPluginTokenHandler = createServiceFactory({ ### ExternalTokenHandler decoration -The `externalTokenHandlersServiceRef` can be used to add custom external token handlers to the default implementation. +The `externalTokenTypeHandlersRef` can be used to add custom external token handlers to the default implementation. -The returned object should be a map of token custom types and their handler factories. The object keys will be matched to the configured `externalAccess` type in the app-config, calling the factory function with the config object for that type. Custom token handlers should implement the `TokenHandler` interface, which provides methods for verifying tokens. +The returned object from the factory function must have a `type` property which is used to identify the handler. The `factory` method is called with an array of `Config` objects, for the given type. The factory method can return a single handler or an array of handlers. The handlers are then used to handle the token for the given type. -For example, to add a custom token handler for a type called 'custom': +For example, if we whant to add a custom external token handler for the `custom` type: + +our config would look like this: + +```yaml title="in e.g. app-config.production.yaml" +backend: + auth: + externalAccess: + - type: custom + options: + customOptions: additional-value + accessRestrictions: + - plugin: events + - type: custom + options: + customOptions: another-value + accessRestrictions: + - plugin: events +``` + +And we can implement the custom token handler like this: ```ts import { TokenHandler, - externalTokenHandlersServiceRef, + externalTokenTypeHandlersRef, } from '@backstage/backend-defaults/auth'; import { Config } from '@backstage/config'; import { createServiceFactory } from '@backstage/backend-plugin-api'; const customExternalTokenHandlers = createServiceFactory({ - service: externalTokenHandlersServiceRef, + service: externalTokenTypeHandlersRef, deps: {}, async factory() { return { - custom: (config: Config) => new CustomTokenHandler(config); + type: 'custom', + factory: (configs: Config[]) => new CustomTokenHandler(configs), // can return a simple handler or an array of handlers }; }, }); diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index bcc5c4a073..2a80a59d2d 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -24,10 +24,7 @@ export const authServiceFactory: ServiceFactory< // @public export const externalTokenTypeHandlersRef: ServiceRef< - { - type: string; - factory: (config: Config[]) => TokenHandler; - }, + TokenTypeHandler, 'plugin', 'multiton' >; @@ -74,5 +71,12 @@ export interface TokenHandler { >; } +// @public +export interface TokenTypeHandler { + factory: (configs: Config[]) => TokenHandler | TokenHandler[]; + // (undocumented) + type: string; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts index cc93b7b182..c3fab70026 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts @@ -27,32 +27,12 @@ import { JWKSHandler } from './jwks'; import { TokenHandler } from './types'; import { Config } from '@backstage/config'; import { groupBy } from 'lodash'; +import { TokenTypeHandler } from './types'; const NEW_CONFIG_KEY = 'backend.auth.externalAccess'; const OLD_CONFIG_KEY = 'backend.auth.keys'; let loggedDeprecationWarning = false; -/** - * @public - * This service is used to decorate the default plugin token handler with custom logic. - */ -export const externalTokenTypeHandlersRef = createServiceRef<{ - type: string; - factory: (config: Config[]) => TokenHandler; -}>({ - id: 'core.auth.externalTokenHandlers', - multiton: true, - // defaultFactory // :pepe-think: seems like is not possible to use defaultFactory with multiton -}); - -type TokenTypeHandler = { - type: string; - /** - * A factory function that takes all token configuration for a given type - * and returns a TokenHandler or an array of TokenHandlers. - */ - factory: (config: Config[]) => TokenHandler | TokenHandler[]; -}; type LegacyTokenTypeHandler = { type: 'legacy'; /** @@ -60,10 +40,23 @@ type LegacyTokenTypeHandler = { * and returns a TokenHandler or an array of TokenHandlers. */ factory: ( - config: (Config | LegacyConfigWrapper)[], + configs: ( + | import('@backstage/config').Config + | { legacy: true; config: import('@backstage/config').Config } + )[], ) => TokenHandler | TokenHandler[]; }; +/** + * @public + * This service is used to decorate the default plugin token handler with custom logic. + */ +export const externalTokenTypeHandlersRef = createServiceRef({ + id: 'core.auth.externalTokenHandlers', + multiton: true, + // defaultFactory // :pepe-think: seems like is not possible to use defaultFactory with multiton +}); + const defaultHandlers: (TokenTypeHandler | LegacyTokenTypeHandler)[] = [ { type: 'static', diff --git a/packages/backend-defaults/src/entrypoints/auth/external/types.ts b/packages/backend-defaults/src/entrypoints/auth/external/types.ts index c3d45fd0d7..5e26b66da5 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/types.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/types.ts @@ -38,3 +38,18 @@ export interface TokenHandler { | undefined >; } + +/** + * @public + * This interface is used to handle external tokens. + */ +export interface TokenTypeHandler { + type: string; + /** + * A factory function that takes all token configuration for a given type + * and returns a TokenHandler or an array of TokenHandlers. + */ + factory: ( + configs: import('@backstage/config').Config[], + ) => TokenHandler | TokenHandler[]; +} diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts index 1b1a29a247..335fc2f62c 100644 --- a/packages/backend-defaults/src/entrypoints/auth/index.ts +++ b/packages/backend-defaults/src/entrypoints/auth/index.ts @@ -21,7 +21,7 @@ export { export { externalTokenTypeHandlersRef } from './external/ExternalTokenHandler'; -export type { TokenHandler } from './external/types'; +export type { TokenHandler, TokenTypeHandler } from './external/types'; export type { AccessRestrictionsMap } from './external/types'; export type { PluginTokenHandler } from './plugin/PluginTokenHandler'; From 79336700729da563bbdf6798a602a3c42e1609ad Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Wed, 9 Jul 2025 22:41:36 +0200 Subject: [PATCH 015/177] fix typos in docs Signed-off-by: Juan Pablo Garcia Ripa --- docs/auth/service-to-service-auth.md | 4 ++-- docs/backend-system/architecture/03-services.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md index 4d8829d91d..322edbe6b6 100644 --- a/docs/auth/service-to-service-auth.md +++ b/docs/auth/service-to-service-auth.md @@ -444,13 +444,13 @@ const decoratedPluginTokenHandler = createServiceFactory({ }); ``` -### ExternalTokenHandler decoration +### Custom ExternalTokenHandler The `externalTokenTypeHandlersRef` can be used to add custom external token handlers to the default implementation. The returned object from the factory function must have a `type` property which is used to identify the handler. The `factory` method is called with an array of `Config` objects, for the given type. The factory method can return a single handler or an array of handlers. The handlers are then used to handle the token for the given type. -For example, if we whant to add a custom external token handler for the `custom` type: +For example, if we want to add a custom external token handler for the `custom` type: our config would look like this: diff --git a/docs/backend-system/architecture/03-services.md b/docs/backend-system/architecture/03-services.md index 3b168b81e3..f6722496e5 100644 --- a/docs/backend-system/architecture/03-services.md +++ b/docs/backend-system/architecture/03-services.md @@ -225,7 +225,7 @@ This allows you to provide more advanced options for the service implementation ## Multiton -By default the service reference will point to a singleton instance of the service. This meand if a new service factory uses this reference will override the previous one. This is the most common use-case, but in some cases you may want to have multiple instances of the same service. +By default the service reference will point to a singleton instance of the service. This mean if a new service factory uses this reference will override the previous one. This is the most common use-case, but in some cases you may want to have multiple instances of the same service. For some services, is desirable to extend the functionality instead of overriding it. For example, some services could have many handler to address a specific event, and you may want to add a new handler instead of overriding the previous one. In this case, you can use the `multiton` option when creating the service reference: ```ts @@ -242,7 +242,7 @@ export const fooServiceRef = createServiceRef({ }); ``` -When adding this serviceRef ad dependency to a factory, the factory will receive an array of instances instead of a single instance: +When adding this `serviceRef` as a dependency to a factory, the factory will receive an array of instances instead of a single instance: ```ts deps: {fooServices: fooServiceRef}, From 445baebdedc78a8983853c13f55f56766e09df23 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Sat, 6 Sep 2025 19:02:05 +0200 Subject: [PATCH 016/177] refactor: rename ExternalTokenHandler to ExternalAuthTokenHandler Signed-off-by: Juan Pablo Garcia Ripa --- ...ernalTokenHandler.test.ts => ExternalAuthTokenHandler.test.ts} | 0 .../{ExternalTokenHandler.ts => ExternalAuthTokenHandler.ts} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename packages/backend-defaults/src/entrypoints/auth/external/{ExternalTokenHandler.test.ts => ExternalAuthTokenHandler.test.ts} (100%) rename packages/backend-defaults/src/entrypoints/auth/external/{ExternalTokenHandler.ts => ExternalAuthTokenHandler.ts} (100%) diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts similarity index 100% rename from packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.test.ts rename to packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts similarity index 100% rename from packages/backend-defaults/src/entrypoints/auth/external/ExternalTokenHandler.ts rename to packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts From 95396a44f9b6ae7c12f2886751a4ec1049993e3b Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Sat, 6 Sep 2025 19:03:36 +0200 Subject: [PATCH 017/177] feat: simplify external token handler API - Remove accessRestrictions from individual handlers (now managed by framework) - Change API to evaluate configs individually for better performance Signed-off-by: Juan Pablo Garcia Ripa --- .changeset/thirty-rules-press.md | 21 ++ docs/auth/service-to-service-auth.md | 100 +++++- packages/backend-defaults/report-auth.api.md | 2 +- .../entrypoints/auth/DefaultAuthService.ts | 4 +- .../auth/authServiceFactory.test.ts | 73 ++-- .../entrypoints/auth/authServiceFactory.ts | 6 +- .../external/ExternalAuthTokenHandler.test.ts | 174 ++++------ .../auth/external/ExternalAuthTokenHandler.ts | 133 +++----- .../src/entrypoints/auth/external/helpers.ts | 8 +- .../entrypoints/auth/external/jwks.test.ts | 131 ++------ .../src/entrypoints/auth/external/jwks.ts | 109 +++--- .../entrypoints/auth/external/legacy.test.ts | 314 ++++++++---------- .../src/entrypoints/auth/external/legacy.ts | 174 ++++------ .../entrypoints/auth/external/static.test.ts | 196 ++++++----- .../src/entrypoints/auth/external/static.ts | 103 ++++-- .../src/entrypoints/auth/external/types.ts | 42 ++- .../src/entrypoints/auth/index.ts | 6 +- 17 files changed, 728 insertions(+), 868 deletions(-) diff --git a/.changeset/thirty-rules-press.md b/.changeset/thirty-rules-press.md index d9968317cb..760780eb84 100644 --- a/.changeset/thirty-rules-press.md +++ b/.changeset/thirty-rules-press.md @@ -3,3 +3,24 @@ --- Add a new `externalTokenHandlersServiceRef` to allow custom external token validations + +BREAKING CHANGE: The `backend.auth.keys` config has been removed. Please migrate to the new `backend.auth.externalAccess` config as described in the documentation: https://backstage.io/docs/auth/service-to-service-auth + +**Migration Example:** + +```yaml +# ❌ Old format (no longer supported) +backend: + auth: + keys: + - secret: your-secret-key + +# ✅ New format +backend: + auth: + externalAccess: + - type: static + options: + token: your-secret-key + subject: external:backstage-plugin # this is the current default for old keys +``` diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md index 322edbe6b6..4ba094068e 100644 --- a/docs/auth/service-to-service-auth.md +++ b/docs/auth/service-to-service-auth.md @@ -255,10 +255,16 @@ backend: subject: legacy-scaffolder ``` -The old style keys config is also supported as an alternative, but please -consider using the new style above instead: +:::warning +The old style `backend.auth.keys` config is **no longer supported** and has been removed. +If you are still using this configuration, you must migrate to the new `backend.auth.externalAccess` format above. -```yaml title="in e.g. app-config.production.yaml" +You'll see an error like `"Unknown key 'backend.auth.keys'"` during Backstage startup if you haven't migrated yet. +::: + +To migrate from the old config format: + +```yaml title="❌ Old format (no longer supported)" backend: auth: keys: @@ -266,6 +272,22 @@ backend: - secret: my-secret-key-scaffolder ``` +Convert to: + +```yaml title="✅ New format" +backend: + auth: + externalAccess: + - type: legacy + options: + secret: my-secret-key-catalog + subject: external:backstage-plugin + - type: legacy + options: + secret: my-secret-key-scaffolder + subject: external:backstage-plugin +``` + The secrets must be any base64-encoded random data, but for security reasons should be sufficiently long so as not to be easy to guess by brute force. You can for example generate them on the command line: @@ -444,11 +466,17 @@ const decoratedPluginTokenHandler = createServiceFactory({ }); ``` -### Custom ExternalTokenHandler +### Adding custom ExternalTokenHandler The `externalTokenTypeHandlersRef` can be used to add custom external token handlers to the default implementation. -The returned object from the factory function must have a `type` property which is used to identify the handler. The `factory` method is called with an array of `Config` objects, for the given type. The factory method can return a single handler or an array of handlers. The handlers are then used to handle the token for the given type. +Your service factory must return an object with a `type` property that matches the token type in your configuration (e.g., 'custom', 'api-key'). When Backstage encounters tokens of this type, it calls your `initialize` method with all the configuration entries that match this type. Your factory can return either a single token handler or an array of handlers to process and validate these tokens. + +:::note Note + +During token verification, all the token handlers are tested. Consider this when adding many token handlers, as it may impact performance. + +::: For example, if we want to add a custom external token handler for the `custom` type: @@ -474,20 +502,72 @@ And we can implement the custom token handler like this: ```ts import { - TokenHandler, + ExternalTokenHandler, externalTokenTypeHandlersRef, + createExternalTokenHandler, } from '@backstage/backend-defaults/auth'; -import { Config } from '@backstage/config'; import { createServiceFactory } from '@backstage/backend-plugin-api'; const customExternalTokenHandlers = createServiceFactory({ service: externalTokenTypeHandlersRef, deps: {}, async factory() { - return { + return createExternalTokenHandler({ type: 'custom', - factory: (configs: Config[]) => new CustomTokenHandler(configs), // can return a simple handler or an array of handlers - }; + initialize({ options }) { + // Initialize your handler context from config + const customOptions = options.getString('customOptions'); + return { customOptions }; + }, + async verifyToken(token, context) { + // Your custom token validation logic here + // Return undefined if token is invalid + // Return { subject: 'your-subject' } if token is valid + + if (token === 'valid-token') { + return { subject: `custom:${context.customOptions}` }; + } + return undefined; + }, + }); + }, +}); +``` + +The `createExternalTokenHandler` helper simplifies creating external token handlers with the new API: + +- **`type`**: A string identifier for your token handler type that matches the config +- **`initialize`**: Called once for each config entry of this type, receives the config options and returns a context object that will be passed to `verifyToken` +- **`verifyToken`**: Called for each token verification with the token and context, returns the subject if valid or `undefined` if not + +```ts +// Example of a more complex handler with external API call +const apiTokenHandler = createExternalTokenHandler({ + type: 'api-validation', + initialize({ options }) { + const apiBaseUrl = options.getString('apiBaseUrl'); + const apiKey = options.getString('apiKey'); + return { apiBaseUrl, apiKey }; + }, + async verifyToken(token, { apiBaseUrl, apiKey }) { + try { + const response = await fetch(`${apiBaseUrl}/validate-token`, { + method: 'POST', + headers: { + Authorization: `Bearer ${apiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ token }), + }); + + if (response.ok) { + const { userId } = await response.json(); + return { subject: `api:${userId}` }; + } + } catch (error) { + // Log error but don't throw - return undefined for invalid tokens + } + return undefined; }, }); ``` diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index 2a80a59d2d..176bdd16de 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -60,7 +60,7 @@ export const pluginTokenHandlerDecoratorServiceRef: ServiceRef< >; // @public -export interface TokenHandler { +export interface ExternalTokenHandler { // (undocumented) verifyToken(token: string): Promise< | { diff --git a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts index d8cb60e8b5..c2c4a064a3 100644 --- a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts +++ b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts @@ -25,7 +25,7 @@ import { import { AuthenticationError } from '@backstage/errors'; import { JsonObject } from '@backstage/types'; import { decodeJwt } from 'jose'; -import { ExternalTokenHandler } from './external/ExternalTokenHandler'; +import { ExternalAuthTokenManager } from './external/export class ExternalAuthTokenManager {'; import { createCredentialsWithNonePrincipal, createCredentialsWithServicePrincipal, @@ -41,7 +41,7 @@ export class DefaultAuthService implements AuthService { constructor( private readonly userTokenHandler: UserTokenHandler, private readonly pluginTokenHandler: PluginTokenHandler, - private readonly externalTokenHandler: ExternalTokenHandler, + private readonly externalTokenHandler: ExternalAuthTokenManager, private readonly pluginId: string, private readonly disableDefaultAuthPolicy: boolean, private readonly pluginKeySource: PluginKeySource, diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index b808973016..b6d5beefa2 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -30,9 +30,9 @@ import { setupServer } from 'msw/node'; import { toInternalBackstageCredentials } from './helpers'; import { PluginTokenHandler } from './plugin/PluginTokenHandler'; import { createServiceFactory } from '@backstage/backend-plugin-api'; -import { AccessRestrictionsMap, TokenHandler } from './external/types'; -import { Config } from '@backstage/config'; -import { externalTokenTypeHandlersRef } from './external/ExternalTokenHandler'; + +import { externalTokenTypeHandlersRef } from './external/ExternalAuthTokenHandler'; +import { createExternalTokenHandler } from './external/helpers'; const server = setupServer(); @@ -44,7 +44,7 @@ const mockDeps = [ backend: { baseUrl: 'http://localhost', auth: { - keys: [{ secret: 'abc' }], + // keys: [{ secret: 'abc' }], externalAccess: [ { type: 'static', @@ -460,7 +460,6 @@ describe('authServiceFactory', () => { describe('add custom ExternalTokenHandler', () => { it('should allow custom logic to be injected into the plugin token handler', async () => { const customLogic = jest.fn(); - const customAddEntry = jest.fn(); const customConfig = jest.fn(); const deps = [ discoveryServiceFactory, @@ -469,7 +468,7 @@ describe('authServiceFactory', () => { backend: { baseUrl: 'http://localhost', auth: { - keys: [{ secret: 'abc' }], + // keys: [{ secret: 'abc' }w], externalAccess: [ { type: 'static', @@ -502,37 +501,30 @@ describe('authServiceFactory', () => { }), ]; - class CustomHandler implements TokenHandler { - constructor(options: Config[]) { - for (const option of options) { - customAddEntry(option); - } - } - async verifyToken(token: string): Promise< - | { - subject: string; - allAccessRestrictions?: AccessRestrictionsMap; - } - | undefined - > { + const customExternalTokenHandler = createExternalTokenHandler<{ + [`custom-config`]: string; + foo: string; + }>({ + type: 'custom', + initialize({ options }) { + const customConfigValue = options.getString('custom-config'); + const foo = options.getString('foo'); + customConfig(customConfigValue); + return { [`custom-config`]: customConfigValue, foo }; + }, + async verifyToken(token, ctx) { customLogic(token); return { - subject: 'foo', + subject: ctx.foo, }; - } - } + }, + }); const customPluginTokenHandler = createServiceFactory({ service: externalTokenTypeHandlersRef, deps: {}, async factory() { - return { - type: 'custom', - factory: (configs: Config[]) => { - customConfig(configs); - return new CustomHandler(configs); - }, - }; + return customExternalTokenHandler; }, }); const tester = ServiceFactoryTester.from(authServiceFactory, { @@ -541,29 +533,8 @@ describe('authServiceFactory', () => { const searchAuth = await tester.getSubject('search'); await searchAuth.authenticate('custom-token'); - expect(customAddEntry).toHaveBeenCalledWith( - expect.objectContaining({ - data: expect.objectContaining({ - options: expect.objectContaining({ - [`custom-config`]: 'custom-config', - foo: 'bar', - }), - }), - }), - ); expect(customLogic).toHaveBeenCalledWith('custom-token'); - expect(customConfig).toHaveBeenCalledWith( - expect.arrayContaining([ - expect.objectContaining({ - data: expect.objectContaining({ - options: expect.objectContaining({ - [`custom-config`]: 'custom-config', - foo: 'bar', - }), - }), - }), - ]), - ); + expect(customConfig).toHaveBeenCalledWith('custom-config'); }); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index 43a3c9da50..34fc3b51ef 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -21,9 +21,9 @@ import { } from '@backstage/backend-plugin-api'; import { DefaultAuthService } from './DefaultAuthService'; import { - ExternalTokenHandler, + ExternalAuthTokenManager, externalTokenTypeHandlersRef, -} from './external/ExternalTokenHandler'; +} from './external/ExternalAuthTokenHandler'; import { DefaultPluginTokenHandler, PluginTokenHandler, @@ -107,7 +107,7 @@ export const authServiceFactory = createServiceFactory({ }), ); - const externalTokens = ExternalTokenHandler.create({ + const externalTokens = ExternalAuthTokenManager.create({ ownPluginId: plugin.getId(), config, logger, diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index 3348d84e93..d97875d228 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -15,8 +15,9 @@ */ import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; -import { ExternalTokenHandler } from './ExternalTokenHandler'; -import { TokenHandler } from './types'; +import { ExternalAuthTokenManager } from './ExternalAuthTokenHandler'; +import { createExternalTokenHandler } from './helpers'; +import { AccessRestrictionsMap, ExternalTokenHandler } from './types'; import { mockServices, registerMswTestHooks, @@ -84,25 +85,51 @@ describe('ExternalTokenHandler', () => { registerMswTestHooks(server); it('skips over inner handlers that do not match, and applies plugin restrictions', async () => { - const handler1: TokenHandler = { + const handler1: ExternalTokenHandler = createExternalTokenHandler({ + type: 'type1', + initialize: jest.fn().mockResolvedValue(undefined), verifyToken: jest.fn().mockResolvedValue(undefined), - }; + }); - const handler2: TokenHandler = { - verifyToken: jest.fn().mockResolvedValue({ - subject: 'sub', - allAccessRestrictions: new Map( - Object.entries({ - plugin1: { - permissionNames: ['do.it'], - } satisfies BackstagePrincipalAccessRestrictions, - }), - ), + const handler2: ExternalTokenHandler = + createExternalTokenHandler({ + type: 'type2', + initialize: jest.fn().mockResolvedValue(undefined), + verifyToken: jest.fn().mockResolvedValue({ + subject: 'sub', + }), + }); + + const accessRestrictions: AccessRestrictionsMap = new Map( + Object.entries({ + plugin1: { + permissionNames: ['do.it'], + } satisfies BackstagePrincipalAccessRestrictions, }), - }; + ); - const plugin1 = new ExternalTokenHandler('plugin1', [handler1, handler2]); - const plugin2 = new ExternalTokenHandler('plugin2', [handler1, handler2]); + const plugin1 = new ExternalAuthTokenManager('plugin1', [ + { + context: undefined, + handler: handler1, + }, + { + context: undefined, + handler: handler2, + allAccessRestrictions: accessRestrictions, + }, + ]); + const plugin2 = new ExternalAuthTokenManager('plugin2', [ + { + context: undefined, + handler: handler1, + }, + { + context: undefined, + handler: handler2, + allAccessRestrictions: accessRestrictions, + }, + ]); await expect(plugin1.verifyToken('token')).resolves.toEqual({ subject: 'sub', @@ -133,7 +160,7 @@ describe('ExternalTokenHandler', () => { ), ); - const handler = ExternalTokenHandler.create({ + const handler = ExternalAuthTokenManager.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -222,12 +249,10 @@ describe('ExternalTokenHandler', () => { ), ); - const customHandler: TokenHandler = { - verifyToken: jest.fn(), - }; - const customHandlerFactory = jest.fn(() => customHandler); + const verifyMock = jest.fn().mockResolvedValue({}); + const initializeMock = jest.fn().mockReturnValue({ context: 'a' }); - const handler = ExternalTokenHandler.create({ + const handler = ExternalAuthTokenManager.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -252,30 +277,23 @@ describe('ExternalTokenHandler', () => { }, }), externalTokenHandlers: [ - { + createExternalTokenHandler({ type: 'internal-custom', - factory: customHandlerFactory, - }, + initialize: initializeMock, + verifyToken: verifyMock, + }), ], }); - expect(customHandlerFactory).toHaveBeenCalledWith( - expect.arrayContaining([ - expect.objectContaining({ - data: { - type: 'internal-custom', - options: { - issuer: 'my-company', - subject: 'internal-subject', - audience: 'backstage', - }, - accessRestrictions: [ - { plugin: 'catalog', permission: 'catalog.entity.read' }, - ], - }, - }), - ]), - ); + expect(initializeMock).toHaveBeenCalledWith({ + options: expect.objectContaining({ + data: { + issuer: 'my-company', + subject: 'internal-subject', + audience: 'backstage', + }, + }), + }); const customToken = await factory.issueToken({ claims: { sub: 'internal-subject' }, @@ -283,11 +301,11 @@ describe('ExternalTokenHandler', () => { await handler.verifyToken(customToken); - expect(customHandler.verifyToken).toHaveBeenCalled(); + expect(verifyMock).toHaveBeenCalledWith(customToken, { context: 'a' }); }); it('should fail if config contains types not declared', async () => { const createHandler = () => - ExternalTokenHandler.create({ + ExternalAuthTokenManager.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -314,13 +332,13 @@ describe('ExternalTokenHandler', () => { }); expect(createHandler).toThrowErrorMatchingInlineSnapshot( - `"Unknown type(s) 'internal-custom' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks'"`, + `"Unknown type 'internal-custom' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks'"`, ); }); it('should show valid custom types in errors', async () => { const createHandler = () => - ExternalTokenHandler.create({ + ExternalAuthTokenManager.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -345,68 +363,18 @@ describe('ExternalTokenHandler', () => { }, }), externalTokenHandlers: [ - { + createExternalTokenHandler({ type: 'internal-custom', - factory: () => ({ - verifyToken: jest.fn(), + initialize: jest.fn().mockResolvedValue(undefined), + verifyToken: jest.fn().mockResolvedValue({ + subject: 'sub', }), - }, + }), ], }); expect(createHandler).toThrowErrorMatchingInlineSnapshot( - `"Unknown type(s) 'internal-custom-invalid' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, - ); - }); - it('should show all invalid config types', async () => { - const createHandler = () => - ExternalTokenHandler.create({ - ownPluginId: 'catalog', - logger: mockServices.logger.mock(), - config: mockServices.rootConfig({ - data: { - backend: { - auth: { - externalAccess: [ - { - type: 'internal-custom-invalid', - options: { - issuer: 'my-company', - subject: 'internal-subject', - audience: 'backstage', - }, - accessRestrictions: [ - { plugin: 'catalog', permission: 'catalog.entity.read' }, - ], - }, - { - type: 'internal-custom-invalid-2', - options: { - issuer: 'my-company', - subject: 'internal-subject', - audience: 'backstage', - }, - accessRestrictions: [ - { plugin: 'catalog', permission: 'catalog.entity.read' }, - ], - }, - ], - }, - }, - }, - }), - externalTokenHandlers: [ - { - type: 'internal-custom', - factory: () => ({ - verifyToken: jest.fn(), - }), - }, - ], - }); - - expect(createHandler).toThrowErrorMatchingInlineSnapshot( - `"Unknown type(s) 'internal-custom-invalid, internal-custom-invalid-2' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, + `"Unknown type 'internal-custom-invalid' in backend.auth.externalAccess, expected one of 'static', 'legacy', 'jwks', 'internal-custom'"`, ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts index c3fab70026..bf57ad42f4 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts @@ -21,85 +21,82 @@ import { RootConfigService, } from '@backstage/backend-plugin-api'; import { NotAllowedError } from '@backstage/errors'; -import { LegacyConfigWrapper, LegacyTokenHandler } from './legacy'; -import { StaticTokenHandler } from './static'; -import { JWKSHandler } from './jwks'; -import { TokenHandler } from './types'; -import { Config } from '@backstage/config'; -import { groupBy } from 'lodash'; -import { TokenTypeHandler } from './types'; +import { legacyTokenHandler } from './legacy'; +import { staticTokenHandler } from './static'; +import { jwksTokenHandler } from './jwks'; +import { AccessRestrictionsMap, ExternalTokenHandler } from './types'; +import { readAccessRestrictionsFromConfig } from './helpers'; const NEW_CONFIG_KEY = 'backend.auth.externalAccess'; const OLD_CONFIG_KEY = 'backend.auth.keys'; let loggedDeprecationWarning = false; -type LegacyTokenTypeHandler = { - type: 'legacy'; - /** - * A factory function that takes all token configuration for a given type - * and returns a TokenHandler or an array of TokenHandlers. - */ - factory: ( - configs: ( - | import('@backstage/config').Config - | { legacy: true; config: import('@backstage/config').Config } - )[], - ) => TokenHandler | TokenHandler[]; -}; - /** * @public * This service is used to decorate the default plugin token handler with custom logic. */ -export const externalTokenTypeHandlersRef = createServiceRef({ +export const externalTokenTypeHandlersRef = createServiceRef< + ExternalTokenHandler +>({ id: 'core.auth.externalTokenHandlers', multiton: true, // defaultFactory // :pepe-think: seems like is not possible to use defaultFactory with multiton }); -const defaultHandlers: (TokenTypeHandler | LegacyTokenTypeHandler)[] = [ - { - type: 'static', - factory: configs => new StaticTokenHandler(configs), - }, - { - type: 'legacy', - factory: (configs: (Config | { legacy: true; config: Config })[]) => - new LegacyTokenHandler(configs), - }, - { - type: 'jwks', - factory: configs => new JWKSHandler(configs), - }, +const defaultHandlers: ExternalTokenHandler[] = [ + staticTokenHandler, + legacyTokenHandler, + jwksTokenHandler, ]; +type ContextMapEntry = { + context: T; + handler: ExternalTokenHandler; + allAccessRestrictions?: AccessRestrictionsMap; +}; /** * Handles all types of external caller token types (i.e. not Backstage user * tokens, nor Backstage backend plugin tokens). * * @internal */ -export class ExternalTokenHandler { +export class ExternalAuthTokenManager { static create(options: { ownPluginId: string; config: RootConfigService; logger: LoggerService; - externalTokenHandlers?: TokenTypeHandler[]; - }): ExternalTokenHandler { + externalTokenHandlers?: ExternalTokenHandler[]; + }): ExternalAuthTokenManager { const { ownPluginId, config, - logger, externalTokenHandlers: customHandlers, } = options; const handlersTypes = [...defaultHandlers, ...(customHandlers ?? [])]; const handlerConfigs = config.getOptionalConfigArray(NEW_CONFIG_KEY) ?? []; - const handlerConfigByType: Record & { - legacy?: (Config | LegacyConfigWrapper)[]; - } = groupBy(handlerConfigs, (handlerConfig: Config) => - handlerConfig.getString('type'), + const contexts: ContextMapEntry[] = handlerConfigs.map( + handlerConfig => { + const type = handlerConfig.getString('type'); + + const handler = handlersTypes.find(h => h.type === type); + if (!handler) { + const valid = handlersTypes.map(h => `'${h.type}'`).join(', '); + throw new Error( + `Unknown type '${type}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`, + ); + } + return { + context: handler.initialize({ + options: handlerConfig.getConfig('options'), + }), + handler, + allAccessRestrictions: handlerConfig + ? readAccessRestrictionsFromConfig(handlerConfig) + : undefined, + }; + }, ); // Load the old keys too @@ -107,45 +104,22 @@ export class ExternalTokenHandler { if (legacyConfigs.length && !loggedDeprecationWarning) { loggedDeprecationWarning = true; - logger.warn( - `DEPRECATION WARNING: The ${OLD_CONFIG_KEY} config has been replaced by ${NEW_CONFIG_KEY}, see https://backstage.io/docs/auth/service-to-service-auth`, - ); - } - for (const handlerConfig of legacyConfigs) { - handlerConfigByType.legacy ??= []; - handlerConfigByType.legacy.push({ legacy: true, config: handlerConfig }); - } - - const invalidTypes = Object.keys(handlerConfigByType).filter( - type => !handlersTypes.some(handler => handler.type === type), - ); - - if (invalidTypes.length > 0) { - const valid = handlersTypes - .map(handler => `'${handler.type}'`) - .join(', '); + // :pepe-think: this message was here for more than a year, and replacing this simplifies things a lot throw new Error( - `Unknown type(s) '${invalidTypes.join( - ', ', - )}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`, + `The ${OLD_CONFIG_KEY} config has been replaced by ${NEW_CONFIG_KEY}, see https://backstage.io/docs/auth/service-to-service-auth`, ); } - const handlers = handlersTypes.flatMap(handler => { - const configs = handlerConfigByType[handler.type] ?? []; - const handlerInstances = handler.factory(configs); - if (Array.isArray(handlerInstances)) { - return handlerInstances; - } - return [handlerInstances]; - }); - - return new ExternalTokenHandler(ownPluginId, handlers); + return new ExternalAuthTokenManager(ownPluginId, contexts); } constructor( private readonly ownPluginId: string, - private readonly handlers: TokenHandler[], + private readonly contexts: { + context: unknown; + handler: ExternalTokenHandler; + allAccessRestrictions?: AccessRestrictionsMap; + }[], ) {} async verifyToken(token: string): Promise< @@ -155,10 +129,9 @@ export class ExternalTokenHandler { } | undefined > { - for (const handler of this.handlers) { - const result = await handler.verifyToken(token); + for (const { handler, allAccessRestrictions, context } of this.contexts) { + const result = await handler.verifyToken(token, context); if (result) { - const { allAccessRestrictions, ...rest } = result; if (allAccessRestrictions) { const accessRestrictions = allAccessRestrictions.get( this.ownPluginId, @@ -173,12 +146,12 @@ export class ExternalTokenHandler { } return { - ...rest, + ...result, accessRestrictions, }; } - return rest; + return result; } } diff --git a/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts b/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts index 4a01117e28..296ec2e72b 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts @@ -15,7 +15,7 @@ */ import { Config } from '@backstage/config'; -import { AccessRestrictionsMap } from './types'; +import { AccessRestrictionsMap, ExternalTokenHandler } from './types'; /** * Parses and returns the `accessRestrictions` configuration from an @@ -147,3 +147,9 @@ function readPermissionAttributes(externalAccessEntryConfig: Config) { return Object.keys(result).length ? result : undefined; } + +export function createExternalTokenHandler( + handler: ExternalTokenHandler, +): ExternalTokenHandler { + return handler; +} diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts index eefbce5093..778e5090bf 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.test.ts @@ -20,7 +20,7 @@ import { SignJWT, exportJWK, generateKeyPair } from 'jose'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { v4 as uuid } from 'uuid'; -import { JWKSHandler } from './jwks'; +import { jwksTokenHandler } from './jwks'; // Simplified copy of TokenFactory in @backstage/plugin-auth-backend interface AnyJWK extends Record { @@ -101,108 +101,45 @@ describe('JWKSHandler', () => { it('verifies token with valid entry', async () => { const validEntry = { - options: { - url: `${mockBaseUrl}/.well-known/jwks.json`, - algorithm: 'RS256', - issuer: mockBaseUrl, - audience: 'backstage', - }, + url: `${mockBaseUrl}/.well-known/jwks.json`, + algorithm: 'RS256', + issuer: mockBaseUrl, + audience: 'backstage', }; - const jwksHandler = new JWKSHandler([new ConfigReader(validEntry)]); + const context = jwksTokenHandler.initialize({ + options: new ConfigReader(validEntry), + }); const token = await factory.issueToken({ claims: { sub: mockSubject }, }); - const result = await jwksHandler.verifyToken(token); + const result = await jwksTokenHandler.verifyToken(token, context); expect(result).toEqual({ subject: `external:${mockSubject}` }); }); - it('skips invalid entry and continues verification', async () => { - const invalidEntry = { - options: { - url: `${mockBaseUrl}/.well-known/jwks.json`, - algorithm: 'RS256', - issuer: ['fakeIssuer'], - audience: ['fakeAud'], - }, - }; - - const validEntry = { - options: { - url: `${mockBaseUrl}/.well-known/jwks.json`, - algorithm: 'RS256', - issuer: ['multiple-issuers', mockBaseUrl], - audience: ['multiple-audiences', 'backstage'], - }, - }; - const jwksHandler = new JWKSHandler([ - new ConfigReader(invalidEntry), - new ConfigReader(validEntry), - ]); - - const token = await factory.issueToken({ - claims: { sub: mockSubject }, - }); - - const result = await jwksHandler.verifyToken(token); - - expect(result).toEqual({ subject: `external:${mockSubject}` }); - }); - - it('returns undefined if no valid entry found', async () => { - const invalidEntry1 = { - options: { - url: `${mockBaseUrl}/.well-known/jwks.json`, - algorithm: 'RS256', - issuer: 'wrong', - }, - }; - - const invalidEntry2 = { - options: { - url: `${mockBaseUrl}/.well-known/jwks.json`, - algorithm: ['HS256'], - audience: 'wrong', - }, - }; - const jwksHandler = new JWKSHandler([ - new ConfigReader(invalidEntry1), - new ConfigReader(invalidEntry2), - ]); - - const token = await factory.issueToken({ - claims: { sub: mockSubject }, - }); - - const result = await jwksHandler.verifyToken(token); - - expect(result).toBeUndefined(); - }); - it('rejects bad config', () => { expect(() => { - return new JWKSHandler([ - new ConfigReader({ - options: { url: 'https://exampl e.com/jwks' }, + return jwksTokenHandler.initialize({ + options: new ConfigReader({ + url: 'https://exampl e.com/jwks', }), - ]); + }); }).toThrow('Illegal JWKS URL, must be a set of non-space characters'); expect(() => { - return new JWKSHandler([ - new ConfigReader({ - options: { - url: 'https://example.com/jwks\n', - }, + return jwksTokenHandler.initialize({ + options: new ConfigReader({ + url: 'https://example.com/jwks\n', }), - ]); + }); }).toThrow('Illegal JWKS URL, must be a set of non-space characters'); }); it('gracefully handles no added tokens', async () => { - const handler = new JWKSHandler([]); - await expect(handler.verifyToken('ghi')).resolves.toBeUndefined(); + await expect( + jwksTokenHandler.verifyToken('ghi', {} as any), + ).resolves.toBeUndefined(); }); it('uses custom subject prefix if provided', async () => { @@ -215,38 +152,18 @@ describe('JWKSHandler', () => { subjectPrefix: 'custom-prefix', }, }; - const jwksHandler = new JWKSHandler([new ConfigReader(validEntry)]); + const context = jwksTokenHandler.initialize({ + options: new ConfigReader(validEntry.options), + }); const token = await factory.issueToken({ claims: { sub: mockSubject }, }); - const result = await jwksHandler.verifyToken(token); + const result = await jwksTokenHandler.verifyToken(token, context); expect(result).toEqual({ subject: `external:${validEntry.options.subjectPrefix}:${mockSubject}`, }); }); - - it('carries over access restrictions', async () => { - const jwksHandler = new JWKSHandler([ - new ConfigReader({ - options: { - url: `${mockBaseUrl}/.well-known/jwks.json`, - }, - accessRestrictions: [{ plugin: 'scaffolder', permission: 'do.it' }], - }), - ]); - - const token = await factory.issueToken({ claims: { sub: mockSubject } }); - - await expect(jwksHandler.verifyToken(token)).resolves.toEqual({ - subject: `external:${mockSubject}`, - allAccessRestrictions: new Map( - Object.entries({ - scaffolder: { permissionNames: ['do.it'] }, - }), - ), - }); - }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts index 5f7fcb4127..892fcf2181 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts @@ -15,56 +15,40 @@ */ import { jwtVerify, createRemoteJWKSet, JWTVerifyGetKey } from 'jose'; -import { Config } from '@backstage/config'; import { + createExternalTokenHandler, readAccessRestrictionsFromConfig, readStringOrStringArrayFromConfig, } from './helpers'; -import { AccessRestrictionsMap, TokenHandler } from './types'; +import { AccessRestrictionsMap } from './types'; -/** - * Handles `type: jwks` access. - * - * @internal - */ -export class JWKSHandler implements TokenHandler { - #entries: Array<{ - algorithms?: string[]; - audiences?: string[]; - issuers?: string[]; - subjectPrefix?: string; - url: URL; - jwks: JWTVerifyGetKey; - allAccessRestrictions?: AccessRestrictionsMap; - }> = []; +type JWKSTokenContext = { + algorithms?: string[]; + audiences?: string[]; + issuers?: string[]; + subjectPrefix?: string; + url: URL; + jwks: JWTVerifyGetKey; + allAccessRestrictions?: AccessRestrictionsMap; +}; - constructor(configs: Config[]) { - for (const config of configs) { - this.add(config); - } - } - private add(config: Config) { - if (!config.getString('options.url').match(/^\S+$/)) { +export const jwksTokenHandler = createExternalTokenHandler({ + type: 'jwks', + initialize({ options }): JWKSTokenContext { + if (!options.getString('url').match(/^\S+$/)) { throw new Error( 'Illegal JWKS URL, must be a set of non-space characters', ); } - const algorithms = readStringOrStringArrayFromConfig( - config, - 'options.algorithm', - ); - const issuers = readStringOrStringArrayFromConfig(config, 'options.issuer'); - const audiences = readStringOrStringArrayFromConfig( - config, - 'options.audience', - ); - const subjectPrefix = config.getOptionalString('options.subjectPrefix'); - const url = new URL(config.getString('options.url')); + const algorithms = readStringOrStringArrayFromConfig(options, 'algorithm'); + const issuers = readStringOrStringArrayFromConfig(options, 'issuer'); + const audiences = readStringOrStringArrayFromConfig(options, 'audience'); + const subjectPrefix = options.getOptionalString('subjectPrefix'); + const url = new URL(options.getString('url')); const jwks = createRemoteJWKSet(url); - const allAccessRestrictions = readAccessRestrictionsFromConfig(config); - - this.#entries.push({ + const allAccessRestrictions = readAccessRestrictionsFromConfig(options); + return { algorithms, audiences, issuers, @@ -72,34 +56,31 @@ export class JWKSHandler implements TokenHandler { subjectPrefix, url, allAccessRestrictions, - }); - return this; - } + }; + }, - async verifyToken(token: string) { - for (const entry of this.#entries) { - try { - const { - payload: { sub }, - } = await jwtVerify(token, entry.jwks, { - algorithms: entry.algorithms, - issuer: entry.issuers, - audience: entry.audiences, - }); + async verifyToken(token: string, context: JWKSTokenContext) { + try { + const { + payload: { sub }, + } = await jwtVerify(token, context.jwks, { + algorithms: context.algorithms, + issuer: context.issuers, + audience: context.audiences, + }); - if (sub) { - const prefix = entry.subjectPrefix - ? `external:${entry.subjectPrefix}:` - : 'external:'; - return { - subject: `${prefix}${sub}`, - allAccessRestrictions: entry.allAccessRestrictions, - }; - } - } catch { - continue; + if (sub) { + const prefix = context.subjectPrefix + ? `external:${context.subjectPrefix}:` + : 'external:'; + return { + subject: `${prefix}${sub}`, + allAccessRestrictions: context.allAccessRestrictions, + }; } + } catch { + return undefined; } return undefined; - } -} + }, +}); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts index 4892d0a21a..43160b46da 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts @@ -18,49 +18,27 @@ import { ConfigReader } from '@backstage/config'; import { randomBytes } from 'crypto'; import { SignJWT, importJWK } from 'jose'; import { DateTime } from 'luxon'; -import { LegacyTokenHandler } from './legacy'; +import { legacyTokenHandler } from './legacy'; describe('LegacyTokenHandler', () => { const key1 = randomBytes(24); const key2 = randomBytes(24); - const key3 = randomBytes(24); - const accessRestrictions1 = new Map( - Object.entries({ - scaffolder: {}, - }), - ); - const accessRestrictions2 = new Map( - Object.entries({ - catalog: { permissionNames: ['catalog.entity.read'] }, - }), - ); - const configs = [ - new ConfigReader({ - options: { - secret: key1.toString('base64'), - subject: 'key1', - }, - accessRestrictions: [{ plugin: 'scaffolder' }], - }), + const tokenHandler = legacyTokenHandler; - new ConfigReader({ - options: { - secret: key2.toString('base64'), - subject: 'key2', - }, - accessRestrictions: [ - { plugin: 'catalog', permission: 'catalog.entity.read' }, - ], + const context1 = tokenHandler.initialize({ + options: new ConfigReader({ + secret: key1.toString('base64'), + subject: 'key1', }), - { - legacy: true, - config: new ConfigReader({ - secret: key3.toString('base64'), - }), - }, - ]; - const tokenHandler = new LegacyTokenHandler(configs); + }); + + const context2 = tokenHandler.initialize({ + options: new ConfigReader({ + secret: key2.toString('base64'), + subject: 'key2', + }), + }); it('should verify valid tokens', async () => { const token1 = await new SignJWT({ @@ -70,9 +48,8 @@ describe('LegacyTokenHandler', () => { .setProtectedHeader({ alg: 'HS256' }) .sign(key1); - await expect(tokenHandler.verifyToken(token1)).resolves.toEqual({ + await expect(tokenHandler.verifyToken(token1, context1)).resolves.toEqual({ subject: 'key1', - allAccessRestrictions: accessRestrictions1, }); const token2 = await new SignJWT({ @@ -82,20 +59,8 @@ describe('LegacyTokenHandler', () => { .setProtectedHeader({ alg: 'HS256' }) .sign(key2); - await expect(tokenHandler.verifyToken(token2)).resolves.toEqual({ + await expect(tokenHandler.verifyToken(token2, context2)).resolves.toEqual({ subject: 'key2', - allAccessRestrictions: accessRestrictions2, - }); - - const token3 = await new SignJWT({ - sub: 'backstage-server', - exp: DateTime.now().plus({ minutes: 1 }).toUnixInteger(), - }) - .setProtectedHeader({ alg: 'HS256' }) - .sign(key3); - - await expect(tokenHandler.verifyToken(token3)).resolves.toEqual({ - subject: 'external:backstage-plugin', }); }); @@ -107,10 +72,18 @@ describe('LegacyTokenHandler', () => { .setProtectedHeader({ alg: 'HS256' }) .sign(key1); - await expect(tokenHandler.verifyToken(validToken)).resolves.toBeUndefined(); + await expect( + tokenHandler.verifyToken(validToken, context1), + ).resolves.toBeUndefined(); + await expect( + tokenHandler.verifyToken(validToken, context2), + ).resolves.toBeUndefined(); await expect( - tokenHandler.verifyToken('statickeyblaaa'), + tokenHandler.verifyToken('statickeyblaaa', context1), + ).resolves.toBeUndefined(); + await expect( + tokenHandler.verifyToken('statickeyblaaa', context2), ).resolves.toBeUndefined(); const randomToken = await new SignJWT({ @@ -120,7 +93,10 @@ describe('LegacyTokenHandler', () => { .setProtectedHeader({ alg: 'HS256' }) .sign(randomBytes(24)); await expect( - tokenHandler.verifyToken(randomToken), + tokenHandler.verifyToken(randomToken, context1), + ).resolves.toBeUndefined(); + await expect( + tokenHandler.verifyToken(randomToken, context2), ).resolves.toBeUndefined(); const mockPublicKey = { @@ -144,7 +120,10 @@ describe('LegacyTokenHandler', () => { .sign(await importJWK(mockPrivateKey)); await expect( - tokenHandler.verifyToken(keyWithWrongAlg), + tokenHandler.verifyToken(keyWithWrongAlg, context1), + ).resolves.toBeUndefined(); + await expect( + tokenHandler.verifyToken(keyWithWrongAlg, context2), ).resolves.toBeUndefined(); }); @@ -157,151 +136,134 @@ describe('LegacyTokenHandler', () => { .setProtectedHeader({ alg: 'HS256' }) .sign(key1); - await expect(tokenHandler.verifyToken(keyWithWrongExp)).rejects.toThrow( - /\"exp\" claim must be a number/, - ); + await expect( + tokenHandler.verifyToken(keyWithWrongExp, context1), + ).rejects.toThrow(/\"exp\" claim must be a number/); }); it('rejects bad config', () => { - const handler = new LegacyTokenHandler([]); + const handler = legacyTokenHandler; // new style add, bad secrets - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { _missingsecret: true, subject: 'ok' }, - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Missing required config value at 'options.secret' in 'mock-config'"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ options: { secret: '', subject: 'ok' } }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.secret' in 'mock-config', got empty-string, wanted string"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { secret: 'has spaces', subject: 'ok' }, - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Illegal secret, must be a valid base64 string"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { secret: 'hasnewline\n', subject: 'ok' }, - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Illegal secret, must be a valid base64 string"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ options: { secret: 3, subject: 'ok' } }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.secret' in 'mock-config', got number, wanted string"`, - ); - - // new style add, bad subjects - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { secret: 'b2s=', _missingsubject: true }, - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Missing required config value at 'options.subject' in 'mock-config'"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ options: { secret: 'b2s=', subject: '' } }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.subject' in 'mock-config', got empty-string, wanted string"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { secret: 'b2s=', subject: 'has spaces' }, - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Illegal subject, must be a set of non-space characters"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { secret: 'b2s=', subject: 'hasnewline\n' }, - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Illegal subject, must be a set of non-space characters"`, - ); - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ options: { secret: 'b2s=', subject: 3 } }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.subject' in 'mock-config', got number, wanted string"`, - ); - - // new style add, bad access restrictions - expect( - () => - new LegacyTokenHandler([ - new ConfigReader({ - options: { secret: 'b2s=', subject: 'subject' }, - accessRestrictions: [{ plugin: ['a'] }], - }), - ]), - ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'accessRestrictions[0].plugin' in 'mock-config', got array, wanted string"`, - ); - - // old style add expect(() => - handler.addOld(new ConfigReader({ secret: 'b2s=' })), - ).not.toThrow(); - expect(() => - handler.addOld(new ConfigReader({ _missingsecret: true })), + handler.initialize({ + options: new ConfigReader({ + _missingsecret: true, + subject: 'ok', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Missing required config value at 'secret' in 'mock-config'"`, ); expect(() => - handler.addOld(new ConfigReader({ secret: '' })), + handler.initialize({ + options: new ConfigReader({ secret: '', subject: 'ok' }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'secret' in 'mock-config', got empty-string, wanted string"`, ); expect(() => - handler.addOld(new ConfigReader({ secret: 'has spaces' })), + handler.initialize({ + options: new ConfigReader({ + secret: 'has spaces', + subject: 'ok', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal secret, must be a valid base64 string"`, ); expect(() => - handler.addOld(new ConfigReader({ secret: 'hasnewline\n' })), + handler.initialize({ + options: new ConfigReader({ + secret: 'hasnewline\n', + subject: 'ok', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal secret, must be a valid base64 string"`, ); expect(() => - handler.addOld(new ConfigReader({ secret: 3 })), + handler.initialize({ + options: new ConfigReader({ secret: 3, subject: 'ok' }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'secret' in 'mock-config', got number, wanted string"`, ); + + // new style add, bad subjects + expect(() => + handler.initialize({ + options: new ConfigReader({ + secret: 'b2s=', + _missingsubject: true, + }), + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Missing required config value at 'subject' in 'mock-config'"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: 'b2s=', subject: '' }), + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Invalid type in config for key 'subject' in 'mock-config', got empty-string, wanted string"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ + secret: 'b2s=', + subject: 'has spaces', + }), + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Illegal subject, must be a set of non-space characters"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ + secret: 'b2s=', + subject: 'hasnewline\n', + }), + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Illegal subject, must be a set of non-space characters"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: 'b2s=', subject: 3 }), + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Invalid type in config for key 'subject' in 'mock-config', got number, wanted string"`, + ); + + // // old style add + // expect(() => + // handler.addOld(new ConfigReader({ secret: 'b2s=' })), + // ).not.toThrow(); + // expect(() => + // handler.addOld(new ConfigReader({ _missingsecret: true })), + // ).toThrowErrorMatchingInlineSnapshot( + // `"Missing required config value at 'secret' in 'mock-config'"`, + // ); + // expect(() => + // handler.addOld(new ConfigReader({ secret: '' })), + // ).toThrowErrorMatchingInlineSnapshot( + // `"Invalid type in config for key 'secret' in 'mock-config', got empty-string, wanted string"`, + // ); + // expect(() => + // handler.addOld(new ConfigReader({ secret: 'has spaces' })), + // ).toThrowErrorMatchingInlineSnapshot( + // `"Illegal secret, must be a valid base64 string"`, + // ); + // expect(() => + // handler.addOld(new ConfigReader({ secret: 'hasnewline\n' })), + // ).toThrowErrorMatchingInlineSnapshot( + // `"Illegal secret, must be a valid base64 string"`, + // ); + // expect(() => + // handler.addOld(new ConfigReader({ secret: 3 })), + // ).toThrowErrorMatchingInlineSnapshot( + // `"Invalid type in config for key 'secret' in 'mock-config', got number, wanted string"`, + // ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts index 8be0de19e4..f9932a8735 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts @@ -16,126 +16,78 @@ import { Config } from '@backstage/config'; import { base64url, decodeJwt, decodeProtectedHeader, jwtVerify } from 'jose'; -import { readAccessRestrictionsFromConfig } from './helpers'; -import { AccessRestrictionsMap, TokenHandler } from './types'; + +import { createExternalTokenHandler } from './helpers'; export type LegacyConfigWrapper = { legacy: boolean; config: Config; }; -/** - * Handles `type: legacy` access. - * - * @internal - */ -export class LegacyTokenHandler implements TokenHandler { - #entries = new Array<{ - key: Uint8Array; - result: { - subject: string; - allAccessRestrictions?: AccessRestrictionsMap; - }; - }>(); - constructor(configs: (Config | LegacyConfigWrapper)[]) { - for (const config of configs) { - if (isLegacy(config)) { - this.addOld(config.config); - continue; +type LegacyTokenHandlerContext = { + key: Uint8Array; + + subject: string; +}; + +export const legacyTokenHandler = + createExternalTokenHandler({ + type: 'legacy', + initialize(ctx: { options: Config }): LegacyTokenHandlerContext { + const secret = ctx.options.getString('secret'); + const subject = ctx.options.getString('subject'); + + if (!secret.match(/^\S+$/)) { + throw new Error('Illegal secret, must be a valid base64 string'); + } else if (!subject.match(/^\S+$/)) { + throw new Error( + 'Illegal subject, must be a set of non-space characters', + ); } - this.add(config); - } - } - add(config: Config) { - const allAccessRestrictions = readAccessRestrictionsFromConfig(config); - this.#doAdd( - config.getString('options.secret'), - config.getString('options.subject'), - allAccessRestrictions, - ); - return this; - } - - // used only for the old backend.auth.keys array - addOld(config: Config) { - // This choice of subject is for compatibility reasons - this.#doAdd(config.getString('secret'), 'external:backstage-plugin'); - } - - #doAdd( - secret: string, - subject: string, - allAccessRestrictions?: AccessRestrictionsMap, - ) { - if (!secret.match(/^\S+$/)) { - throw new Error('Illegal secret, must be a valid base64 string'); - } else if (!subject.match(/^\S+$/)) { - throw new Error('Illegal subject, must be a set of non-space characters'); - } - - let key: Uint8Array; - try { - key = base64url.decode(secret); - } catch { - throw new Error('Illegal secret, must be a valid base64 string'); - } - - if (this.#entries.some(e => e.key === key)) { - throw new Error( - 'Legacy externalAccess token was declared more than once', - ); - } - - this.#entries.push({ - key, - result: { - subject, - allAccessRestrictions, - }, - }); - } - - async verifyToken(token: string) { - // First do a duck typing check to see if it remotely looks like a legacy token - try { - // We do a fair amount of checking upfront here. Since we aren't certain - // that it's even the right type of key that we're looking at, we can't - // defer eg the alg check to jwtVerify, because it won't be possible to - // discern different reasons for key verification failures from each other - // easily - const { alg } = decodeProtectedHeader(token); - if (alg !== 'HS256') { - return undefined; - } - const { sub, aud } = decodeJwt(token); - if (sub !== 'backstage-server' || aud) { - return undefined; - } - } catch (e) { - // Doesn't look like a jwt at all - return undefined; - } - - for (const { key, result } of this.#entries) { try { - await jwtVerify(token, key); - return result; - } catch (e) { - if (e.code !== 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED') { - throw e; - } - // Otherwise continue to try the next key + return { + key: base64url.decode(secret), + subject, + }; + } catch { + throw new Error('Illegal secret, must be a valid base64 string'); } - } + }, - // None of the signing keys matched - return undefined; - } -} + async verifyToken(token: string, context: LegacyTokenHandlerContext) { + // First do a duck typing check to see if it remotely looks like a legacy token + try { + // We do a fair amount of checking upfront here. Since we aren't certain + // that it's even the right type of key that we're looking at, we can't + // defer eg the alg check to jwtVerify, because it won't be possible to + // discern different reasons for key verification failures from each other + // easily + const { alg } = decodeProtectedHeader(token); + if (alg !== 'HS256') { + return undefined; + } + const { sub, aud } = decodeJwt(token); + if (sub !== 'backstage-server' || aud) { + return undefined; + } + } catch (e) { + // Doesn't look like a jwt at all + return undefined; + } -function isLegacy( - config: Config | LegacyConfigWrapper, -): config is LegacyConfigWrapper { - return (config as LegacyConfigWrapper).legacy === true; -} + try { + await jwtVerify(token, context.key); + return { + subject: context.subject, + }; + } catch (error) { + if (error.code !== 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED') { + throw error; + } + } + + // None of the signing keys matched + return undefined; + }, + }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts index cf1c1a46ac..10e78d2dbf 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.test.ts @@ -15,148 +15,146 @@ */ import { ConfigReader } from '@backstage/config'; -import { StaticTokenHandler } from './static'; +import { staticTokenHandler } from './static'; describe('StaticTokenHandler', () => { it('accepts any of the added list of tokens', async () => { - const configs = [ - new ConfigReader({ - options: { token: 'abcabcabc', subject: 'one' }, - accessRestrictions: [{ plugin: 'scaffolder' }], + const context1 = staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'abcabcabc', + subject: 'one', }), - new ConfigReader({ - options: { token: 'defdefdef', subject: 'two' }, - accessRestrictions: [ - { plugin: 'catalog', permission: 'catalog.entity.read' }, - ], + }); + const context2 = staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'defdefdef', + subject: 'two', }), - ]; - const handler = new StaticTokenHandler(configs); - const accessRestrictionsOne = new Map(Object.entries({ scaffolder: {} })); - const accessRestrictionsTwo = new Map( - Object.entries({ - catalog: { - permissionNames: ['catalog.entity.read'], - }, - }), - ); + }); - await expect(handler.verifyToken('abcabcabc')).resolves.toEqual({ + await expect( + staticTokenHandler.verifyToken('abcabcabc', context1), + ).resolves.toEqual({ subject: 'one', - allAccessRestrictions: accessRestrictionsOne, }); - await expect(handler.verifyToken('defdefdef')).resolves.toEqual({ + await expect( + staticTokenHandler.verifyToken('defdefdef', context2), + ).resolves.toEqual({ subject: 'two', - allAccessRestrictions: accessRestrictionsTwo, }); - await expect(handler.verifyToken('ghighighi')).resolves.toBeUndefined(); + await expect( + staticTokenHandler.verifyToken('ghighighi', context1), + ).resolves.toBeUndefined(); }); it('gracefully handles no added tokens', async () => { - const handler = new StaticTokenHandler([]); - await expect(handler.verifyToken('ghi')).resolves.toBeUndefined(); + await expect( + staticTokenHandler.verifyToken('ghi', {} as any), + ).resolves.toBeUndefined(); }); it('rejects bad config', () => { - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { _missingtoken: true, subject: 'ok' } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ _missingtoken: true, subject: 'ok' }), + }), ).toThrowErrorMatchingInlineSnapshot( - `"Missing required config value at 'options.token' in 'mock-config'"`, + `"Missing required config value at 'token' in 'mock-config'"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { token: '', subject: 'ok' } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ token: '', subject: 'ok' }), + }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.token' in 'mock-config', got empty-string, wanted string"`, + `"Invalid type in config for key 'token' in 'mock-config', got empty-string, wanted string"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { token: 'has spaces', subject: 'ok' } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'has spaces', + subject: 'ok', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal token, must be a set of non-space characters"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ - options: { - token: 'hasnewlinebutislongenough\n', - subject: 'ok', - }, - }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'hasnewlinebutislongenough\n', + subject: 'ok', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal token, must be a set of non-space characters"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { token: 'short', subject: 'ok' } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'short', + subject: 'ok', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal token, must be at least 8 characters length"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { token: 3, subject: 'ok' } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ token: 3, subject: 'ok' }), + }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.token' in 'mock-config', got number, wanted string"`, + `"Invalid type in config for key 'token' in 'mock-config', got number, wanted string"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ - options: { token: 'validtoken', _missingsubject: true }, - }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'validtoken', + _missingsubject: true, + }), + }), ).toThrowErrorMatchingInlineSnapshot( - `"Missing required config value at 'options.subject' in 'mock-config'"`, + `"Missing required config value at 'subject' in 'mock-config'"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { token: 'validtoken', subject: '' } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'validtoken', + subject: '', + }), + }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.subject' in 'mock-config', got empty-string, wanted string"`, + `"Invalid type in config for key 'subject' in 'mock-config', got empty-string, wanted string"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ - options: { token: 'validtoken', subject: 'has spaces' }, - }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'validtoken', + subject: 'has spaces', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal subject, must be a set of non-space characters"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ - options: { token: 'validtoken', subject: 'hasnewline\n' }, - }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'validtoken', + subject: 'hasnewline\n', + }), + }), ).toThrowErrorMatchingInlineSnapshot( `"Illegal subject, must be a set of non-space characters"`, ); - expect( - () => - new StaticTokenHandler([ - new ConfigReader({ options: { token: 'validtoken', subject: 3 } }), - ]), + expect(() => + staticTokenHandler.initialize({ + options: new ConfigReader({ + token: 'validtoken', + subject: 3, + }), + }), ).toThrowErrorMatchingInlineSnapshot( - `"Invalid type in config for key 'options.subject' in 'mock-config', got number, wanted string"`, + `"Invalid type in config for key 'subject' in 'mock-config', got number, wanted string"`, ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.ts index 7764569aca..fe7b9995a4 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.ts @@ -15,34 +15,18 @@ */ import { Config } from '@backstage/config'; -import { readAccessRestrictionsFromConfig } from './helpers'; -import { AccessRestrictionsMap, TokenHandler } from './types'; +import { createExternalTokenHandler } from './helpers'; const MIN_TOKEN_LENGTH = 8; -/** - * Handles `type: static` access. - * - * @internal - */ -export class StaticTokenHandler implements TokenHandler { - #entries = new Map< - string, - { - subject: string; - allAccessRestrictions?: AccessRestrictionsMap; - } - >(); - - constructor(configs: Config[]) { - for (const config of configs) { - this.add(config); - } - } - private add(config: Config) { - const token = config.getString('options.token'); - const subject = config.getString('options.subject'); - const allAccessRestrictions = readAccessRestrictionsFromConfig(config); +export const staticTokenHandler = createExternalTokenHandler<{ + token: string; + subject: string; +}>({ + type: 'static', + initialize(ctx: { options: Config }): { token: string; subject: string } { + const token = ctx.options.getString('token'); + const subject = ctx.options.getString('subject'); if (!token.match(/^\S+$/)) { throw new Error('Illegal token, must be a set of non-space characters'); @@ -52,17 +36,64 @@ export class StaticTokenHandler implements TokenHandler { ); } else if (!subject.match(/^\S+$/)) { throw new Error('Illegal subject, must be a set of non-space characters'); - } else if (this.#entries.has(token)) { - throw new Error( - 'Static externalAccess token was declared more than once', - ); } - this.#entries.set(token, { subject, allAccessRestrictions }); - return this; - } + return { token, subject }; + }, + async verifyToken( + token: string, + context: { token: string; subject: string }, + ) { + if (token === context.token) { + return { subject: context.subject }; + } + return undefined; + }, +}); - async verifyToken(token: string) { - return this.#entries.get(token); - } -} +/** + * Handles `type: static` access. + * + * @internal + */ +// export class StaticTokenHandler implements TokenHandler { +// #entries = new Map< +// string, +// { +// subject: string; +// allAccessRestrictions?: AccessRestrictionsMap; +// } +// >(); + +// constructor(configs: Config[]) { +// for (const config of configs) { +// this.add(config); +// } +// } +// private add(config: Config) { +// const token = config.getString('options.token'); +// const subject = config.getString('options.subject'); +// const allAccessRestrictions = readAccessRestrictionsFromConfig(config); + +// if (!token.match(/^\S+$/)) { +// throw new Error('Illegal token, must be a set of non-space characters'); +// } else if (token.length < MIN_TOKEN_LENGTH) { +// throw new Error( +// `Illegal token, must be at least ${MIN_TOKEN_LENGTH} characters length`, +// ); +// } else if (!subject.match(/^\S+$/)) { +// throw new Error('Illegal subject, must be a set of non-space characters'); +// } else if (this.#entries.has(token)) { +// throw new Error( +// 'Static externalAccess token was declared more than once', +// ); +// } + +// this.#entries.set(token, { subject, allAccessRestrictions }); +// return this; +// } + +// async verifyToken(token: string) { +// return this.#entries.get(token); +// } +// } diff --git a/packages/backend-defaults/src/entrypoints/auth/external/types.ts b/packages/backend-defaults/src/entrypoints/auth/external/types.ts index 5e26b66da5..6ce1ca13b6 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/types.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/types.ts @@ -15,6 +15,7 @@ */ import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; +import type { Config } from '@backstage/config'; /** * @public @@ -29,27 +30,24 @@ export type AccessRestrictionsMap = Map< * This interface is used to handle external tokens. * It is used by the auth service to verify tokens and extract the subject. */ -export interface TokenHandler { - verifyToken(token: string): Promise< - | { - subject: string; - allAccessRestrictions?: AccessRestrictionsMap; - } - | undefined - >; +export interface ExternalTokenHandler { + type: string; + initialize(ctx: { options: Config }): TContext; + verifyToken( + token: string, + ctx: TContext, + ): Promise<{ subject: string } | undefined>; } -/** - * @public - * This interface is used to handle external tokens. - */ -export interface TokenTypeHandler { - type: string; - /** - * A factory function that takes all token configuration for a given type - * and returns a TokenHandler or an array of TokenHandlers. - */ - factory: ( - configs: import('@backstage/config').Config[], - ) => TokenHandler | TokenHandler[]; -} +// /** +// * @public +// * This interface is used to handle external tokens. +// */ +// export interface TokenTypeHandler { +// type: string; +// /** +// * A factory function that takes all token configuration for a given type +// * and returns a TokenHandler or an array of TokenHandlers. +// */ +// factory: (configs: Config[]) => TokenHandler | TokenHandler[]; +// } diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts index 335fc2f62c..e205c8b566 100644 --- a/packages/backend-defaults/src/entrypoints/auth/index.ts +++ b/packages/backend-defaults/src/entrypoints/auth/index.ts @@ -19,9 +19,11 @@ export { pluginTokenHandlerDecoratorServiceRef, } from './authServiceFactory'; -export { externalTokenTypeHandlersRef } from './external/ExternalTokenHandler'; +export { createExternalTokenHandler } from './external/helpers'; -export type { TokenHandler, TokenTypeHandler } from './external/types'; +export { externalTokenTypeHandlersRef } from './external/ExternalAuthTokenHandler'; + +export type { ExternalTokenHandler } from './external/types'; export type { AccessRestrictionsMap } from './external/types'; export type { PluginTokenHandler } from './plugin/PluginTokenHandler'; From 6361c0c00fe8716c5b9c2635dbd366aa49f8fb86 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Sat, 6 Sep 2025 19:11:23 +0200 Subject: [PATCH 018/177] fix: rename the Internal token handler Signed-off-by: Juan Pablo Garcia Ripa --- .../src/entrypoints/auth/DefaultAuthService.ts | 4 ++-- .../src/entrypoints/auth/authServiceFactory.ts | 4 ++-- .../auth/external/ExternalAuthTokenHandler.test.ts | 14 +++++++------- .../auth/external/ExternalAuthTokenHandler.ts | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts index c2c4a064a3..dba4f70dec 100644 --- a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts +++ b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts @@ -25,7 +25,7 @@ import { import { AuthenticationError } from '@backstage/errors'; import { JsonObject } from '@backstage/types'; import { decodeJwt } from 'jose'; -import { ExternalAuthTokenManager } from './external/export class ExternalAuthTokenManager {'; +import { ExternalAuthTokenHandler } from './external/ExternalAuthTokenHandler'; import { createCredentialsWithNonePrincipal, createCredentialsWithServicePrincipal, @@ -41,7 +41,7 @@ export class DefaultAuthService implements AuthService { constructor( private readonly userTokenHandler: UserTokenHandler, private readonly pluginTokenHandler: PluginTokenHandler, - private readonly externalTokenHandler: ExternalAuthTokenManager, + private readonly externalTokenHandler: ExternalAuthTokenHandler, private readonly pluginId: string, private readonly disableDefaultAuthPolicy: boolean, private readonly pluginKeySource: PluginKeySource, diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index 34fc3b51ef..0f8c5ff75d 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -21,7 +21,7 @@ import { } from '@backstage/backend-plugin-api'; import { DefaultAuthService } from './DefaultAuthService'; import { - ExternalAuthTokenManager, + ExternalAuthTokenHandler, externalTokenTypeHandlersRef, } from './external/ExternalAuthTokenHandler'; import { @@ -107,7 +107,7 @@ export const authServiceFactory = createServiceFactory({ }), ); - const externalTokens = ExternalAuthTokenManager.create({ + const externalTokens = ExternalAuthTokenHandler.create({ ownPluginId: plugin.getId(), config, logger, diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index d97875d228..491de30ac4 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -15,7 +15,7 @@ */ import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; -import { ExternalAuthTokenManager } from './ExternalAuthTokenHandler'; +import { ExternalAuthTokenHandler } from './ExternalAuthTokenHandler'; import { createExternalTokenHandler } from './helpers'; import { AccessRestrictionsMap, ExternalTokenHandler } from './types'; import { @@ -108,7 +108,7 @@ describe('ExternalTokenHandler', () => { }), ); - const plugin1 = new ExternalAuthTokenManager('plugin1', [ + const plugin1 = new ExternalAuthTokenHandler('plugin1', [ { context: undefined, handler: handler1, @@ -119,7 +119,7 @@ describe('ExternalTokenHandler', () => { allAccessRestrictions: accessRestrictions, }, ]); - const plugin2 = new ExternalAuthTokenManager('plugin2', [ + const plugin2 = new ExternalAuthTokenHandler('plugin2', [ { context: undefined, handler: handler1, @@ -160,7 +160,7 @@ describe('ExternalTokenHandler', () => { ), ); - const handler = ExternalAuthTokenManager.create({ + const handler = ExternalAuthTokenHandler.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -252,7 +252,7 @@ describe('ExternalTokenHandler', () => { const verifyMock = jest.fn().mockResolvedValue({}); const initializeMock = jest.fn().mockReturnValue({ context: 'a' }); - const handler = ExternalAuthTokenManager.create({ + const handler = ExternalAuthTokenHandler.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -305,7 +305,7 @@ describe('ExternalTokenHandler', () => { }); it('should fail if config contains types not declared', async () => { const createHandler = () => - ExternalAuthTokenManager.create({ + ExternalAuthTokenHandler.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ @@ -338,7 +338,7 @@ describe('ExternalTokenHandler', () => { it('should show valid custom types in errors', async () => { const createHandler = () => - ExternalAuthTokenManager.create({ + ExternalAuthTokenHandler.create({ ownPluginId: 'catalog', logger: mockServices.logger.mock(), config: mockServices.rootConfig({ diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts index bf57ad42f4..17541ff384 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts @@ -60,13 +60,13 @@ type ContextMapEntry = { * * @internal */ -export class ExternalAuthTokenManager { +export class ExternalAuthTokenHandler { static create(options: { ownPluginId: string; config: RootConfigService; logger: LoggerService; externalTokenHandlers?: ExternalTokenHandler[]; - }): ExternalAuthTokenManager { + }): ExternalAuthTokenHandler { const { ownPluginId, config, @@ -110,7 +110,7 @@ export class ExternalAuthTokenManager { ); } - return new ExternalAuthTokenManager(ownPluginId, contexts); + return new ExternalAuthTokenHandler(ownPluginId, contexts); } constructor( From 968b2f606ed3062f4bb08fd37b51c07e83019aea Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Sat, 6 Sep 2025 19:48:23 +0200 Subject: [PATCH 019/177] fix: api-reports Signed-off-by: Juan Pablo Garcia Ripa --- packages/backend-defaults/report-auth.api.md | 46 ++++++++++--------- .../src/entrypoints/auth/external/helpers.ts | 28 +++++++++++ 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index 176bdd16de..0164fa13c1 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -5,7 +5,7 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; +import type { Config } from '@backstage/config'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; @@ -22,9 +22,32 @@ export const authServiceFactory: ServiceFactory< 'singleton' >; +// @public +export function createExternalTokenHandler( + handler: ExternalTokenHandler, +): ExternalTokenHandler; + +// @public +export interface ExternalTokenHandler { + // (undocumented) + initialize(ctx: { options: Config }): TContext; + // (undocumented) + type: string; + // (undocumented) + verifyToken( + token: string, + ctx: TContext, + ): Promise< + | { + subject: string; + } + | undefined + >; +} + // @public export const externalTokenTypeHandlersRef: ServiceRef< - TokenTypeHandler, + ExternalTokenHandler, 'plugin', 'multiton' >; @@ -59,24 +82,5 @@ export const pluginTokenHandlerDecoratorServiceRef: ServiceRef< 'singleton' >; -// @public -export interface ExternalTokenHandler { - // (undocumented) - verifyToken(token: string): Promise< - | { - subject: string; - allAccessRestrictions?: AccessRestrictionsMap; - } - | undefined - >; -} - -// @public -export interface TokenTypeHandler { - factory: (configs: Config[]) => TokenHandler | TokenHandler[]; - // (undocumented) - type: string; -} - // (No @packageDocumentation comment for this package) ``` diff --git a/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts b/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts index 296ec2e72b..94d289bd7c 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/helpers.ts @@ -148,6 +148,34 @@ function readPermissionAttributes(externalAccessEntryConfig: Config) { return Object.keys(result).length ? result : undefined; } +/** + * Creates an external token handler with the provided implementation. + * + * This helper function simplifies the creation of external token handlers by + * providing type safety and a consistent API. External token handlers are used + * to validate tokens from external systems that need to authenticate with Backstage. + * + * See {@link https://backstage.io/docs/auth/service-to-service-auth#adding-custom-externaltokenhandler | the service-to-service auth docs} + * for more information about implementing custom external token handlers. + * + * @public + * @param handler - The external token handler implementation with type, initialize, and verifyToken methods + * @returns The same handler instance, typed as ExternalTokenHandler + * + * @example + * ```ts + * const customHandler = createExternalTokenHandler({ + * type: 'custom', + * initialize({ options }) { + * return { apiKey: options.getString('apiKey') }; + * }, + * async verifyToken(token, context) { + * // Custom validation logic here + * return { subject: 'custom:user' }; + * }, + * }); + * ``` + */ export function createExternalTokenHandler( handler: ExternalTokenHandler, ): ExternalTokenHandler { From 6ff5452d3c37b21a9390c06bb38a6f03707e5b41 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Mon, 8 Sep 2025 09:52:12 +0200 Subject: [PATCH 020/177] fix: correct grammar Co-authored-by: Peter Macdonald Signed-off-by: Juan Pablo Garcia Ripa --- docs/backend-system/architecture/03-services.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/backend-system/architecture/03-services.md b/docs/backend-system/architecture/03-services.md index f6722496e5..022aab202b 100644 --- a/docs/backend-system/architecture/03-services.md +++ b/docs/backend-system/architecture/03-services.md @@ -225,8 +225,8 @@ This allows you to provide more advanced options for the service implementation ## Multiton -By default the service reference will point to a singleton instance of the service. This mean if a new service factory uses this reference will override the previous one. This is the most common use-case, but in some cases you may want to have multiple instances of the same service. -For some services, is desirable to extend the functionality instead of overriding it. For example, some services could have many handler to address a specific event, and you may want to add a new handler instead of overriding the previous one. In this case, you can use the `multiton` option when creating the service reference: +By default the service reference will point to a singleton instance of the service. This mean if a new service factory uses this reference it will override the previous one. This is the most common use-case, but in some cases you may want to have multiple instances of the same service. +For some services, it is desirable to extend the functionality instead of overriding it. For example, some services could have many handlers to address specific events, and you may want to add a new handler instead of overriding the previous one. In this case, you can use the `multiton` option when creating the service reference: ```ts // example-service-ref.ts From 823ed49a43b7b6f22344f28ce729f8b16c373809 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Thu, 11 Sep 2025 16:33:45 +0200 Subject: [PATCH 021/177] clean up Signed-off-by: Juan Pablo Garcia Ripa --- .../entrypoints/auth/external/legacy.test.ts | 30 ------------ .../src/entrypoints/auth/external/static.ts | 47 ------------------- 2 files changed, 77 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts index 43160b46da..a278e5766c 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts @@ -235,35 +235,5 @@ describe('LegacyTokenHandler', () => { ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'subject' in 'mock-config', got number, wanted string"`, ); - - // // old style add - // expect(() => - // handler.addOld(new ConfigReader({ secret: 'b2s=' })), - // ).not.toThrow(); - // expect(() => - // handler.addOld(new ConfigReader({ _missingsecret: true })), - // ).toThrowErrorMatchingInlineSnapshot( - // `"Missing required config value at 'secret' in 'mock-config'"`, - // ); - // expect(() => - // handler.addOld(new ConfigReader({ secret: '' })), - // ).toThrowErrorMatchingInlineSnapshot( - // `"Invalid type in config for key 'secret' in 'mock-config', got empty-string, wanted string"`, - // ); - // expect(() => - // handler.addOld(new ConfigReader({ secret: 'has spaces' })), - // ).toThrowErrorMatchingInlineSnapshot( - // `"Illegal secret, must be a valid base64 string"`, - // ); - // expect(() => - // handler.addOld(new ConfigReader({ secret: 'hasnewline\n' })), - // ).toThrowErrorMatchingInlineSnapshot( - // `"Illegal secret, must be a valid base64 string"`, - // ); - // expect(() => - // handler.addOld(new ConfigReader({ secret: 3 })), - // ).toThrowErrorMatchingInlineSnapshot( - // `"Invalid type in config for key 'secret' in 'mock-config', got number, wanted string"`, - // ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/static.ts b/packages/backend-defaults/src/entrypoints/auth/external/static.ts index fe7b9995a4..502150d5a8 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/static.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/static.ts @@ -50,50 +50,3 @@ export const staticTokenHandler = createExternalTokenHandler<{ return undefined; }, }); - -/** - * Handles `type: static` access. - * - * @internal - */ -// export class StaticTokenHandler implements TokenHandler { -// #entries = new Map< -// string, -// { -// subject: string; -// allAccessRestrictions?: AccessRestrictionsMap; -// } -// >(); - -// constructor(configs: Config[]) { -// for (const config of configs) { -// this.add(config); -// } -// } -// private add(config: Config) { -// const token = config.getString('options.token'); -// const subject = config.getString('options.subject'); -// const allAccessRestrictions = readAccessRestrictionsFromConfig(config); - -// if (!token.match(/^\S+$/)) { -// throw new Error('Illegal token, must be a set of non-space characters'); -// } else if (token.length < MIN_TOKEN_LENGTH) { -// throw new Error( -// `Illegal token, must be at least ${MIN_TOKEN_LENGTH} characters length`, -// ); -// } else if (!subject.match(/^\S+$/)) { -// throw new Error('Illegal subject, must be a set of non-space characters'); -// } else if (this.#entries.has(token)) { -// throw new Error( -// 'Static externalAccess token was declared more than once', -// ); -// } - -// this.#entries.set(token, { subject, allAccessRestrictions }); -// return this; -// } - -// async verifyToken(token: string) { -// return this.#entries.get(token); -// } -// } From 818c835a10e54e1889edcb450c9a11311367139d Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Mon, 15 Sep 2025 22:40:23 +0200 Subject: [PATCH 022/177] bring the legacy config back Signed-off-by: Juan Pablo Garcia Ripa --- .changeset/thirty-rules-press.md | 21 --- docs/auth/service-to-service-auth.md | 36 +----- packages/backend-defaults/report-auth.api.md | 9 +- .../auth/authServiceFactory.test.ts | 8 +- .../entrypoints/auth/authServiceFactory.ts | 4 +- .../external/ExternalAuthTokenHandler.test.ts | 51 ++++++++ .../auth/external/ExternalAuthTokenHandler.ts | 24 +++- .../entrypoints/auth/external/legacy.test.ts | 70 ++++++++++ .../src/entrypoints/auth/external/legacy.ts | 120 ++++++++++-------- .../src/entrypoints/auth/external/types.ts | 16 --- .../src/entrypoints/auth/index.ts | 3 +- 11 files changed, 219 insertions(+), 143 deletions(-) diff --git a/.changeset/thirty-rules-press.md b/.changeset/thirty-rules-press.md index 760780eb84..d9968317cb 100644 --- a/.changeset/thirty-rules-press.md +++ b/.changeset/thirty-rules-press.md @@ -3,24 +3,3 @@ --- Add a new `externalTokenHandlersServiceRef` to allow custom external token validations - -BREAKING CHANGE: The `backend.auth.keys` config has been removed. Please migrate to the new `backend.auth.externalAccess` config as described in the documentation: https://backstage.io/docs/auth/service-to-service-auth - -**Migration Example:** - -```yaml -# ❌ Old format (no longer supported) -backend: - auth: - keys: - - secret: your-secret-key - -# ✅ New format -backend: - auth: - externalAccess: - - type: static - options: - token: your-secret-key - subject: external:backstage-plugin # this is the current default for old keys -``` diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md index 4ba094068e..1423fa92f7 100644 --- a/docs/auth/service-to-service-auth.md +++ b/docs/auth/service-to-service-auth.md @@ -255,16 +255,10 @@ backend: subject: legacy-scaffolder ``` -:::warning -The old style `backend.auth.keys` config is **no longer supported** and has been removed. -If you are still using this configuration, you must migrate to the new `backend.auth.externalAccess` format above. +The old style keys config is also supported as an alternative, but please +consider using the new style above instead: -You'll see an error like `"Unknown key 'backend.auth.keys'"` during Backstage startup if you haven't migrated yet. -::: - -To migrate from the old config format: - -```yaml title="❌ Old format (no longer supported)" +```yaml title="in e.g. app-config.production.yaml" backend: auth: keys: @@ -272,22 +266,6 @@ backend: - secret: my-secret-key-scaffolder ``` -Convert to: - -```yaml title="✅ New format" -backend: - auth: - externalAccess: - - type: legacy - options: - secret: my-secret-key-catalog - subject: external:backstage-plugin - - type: legacy - options: - secret: my-secret-key-scaffolder - subject: external:backstage-plugin -``` - The secrets must be any base64-encoded random data, but for security reasons should be sufficiently long so as not to be easy to guess by brute force. You can for example generate them on the command line: @@ -436,7 +414,7 @@ Each entry has one or more of the following fields: ## Adding custom or logic for validation and issuing of tokens -The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenTypeHandlersRef` can be used to extend the existing token handler without having to re-implement the entire `AuthService` implementation. +The `pluginTokenHandlerDecoratorServiceRef` and `externalTokenHandlersServiceRef` can be used to extend the existing token handler without having to re-implement the entire `AuthService` implementation. This is particularly useful when you want to add additional logic to the handler, such as logging or metrics or custom token validation. ### PluginTokenHandler decoration @@ -468,7 +446,7 @@ const decoratedPluginTokenHandler = createServiceFactory({ ### Adding custom ExternalTokenHandler -The `externalTokenTypeHandlersRef` can be used to add custom external token handlers to the default implementation. +The `externalTokenHandlersServiceRef` can be used to add custom external token handlers to the default implementation. Your service factory must return an object with a `type` property that matches the token type in your configuration (e.g., 'custom', 'api-key'). When Backstage encounters tokens of this type, it calls your `initialize` method with all the configuration entries that match this type. Your factory can return either a single token handler or an array of handlers to process and validate these tokens. @@ -503,13 +481,13 @@ And we can implement the custom token handler like this: ```ts import { ExternalTokenHandler, - externalTokenTypeHandlersRef, + externalTokenHandlersServiceRef, createExternalTokenHandler, } from '@backstage/backend-defaults/auth'; import { createServiceFactory } from '@backstage/backend-plugin-api'; const customExternalTokenHandlers = createServiceFactory({ - service: externalTokenTypeHandlersRef, + service: externalTokenHandlersServiceRef, deps: {}, async factory() { return createExternalTokenHandler({ diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md index 0164fa13c1..2fc0f16452 100644 --- a/packages/backend-defaults/report-auth.api.md +++ b/packages/backend-defaults/report-auth.api.md @@ -4,17 +4,10 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; -import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; import type { Config } from '@backstage/config'; import { ServiceFactory } from '@backstage/backend-plugin-api'; import { ServiceRef } from '@backstage/backend-plugin-api'; -// @public (undocumented) -export type AccessRestrictionsMap = Map< - string, // plugin ID - BackstagePrincipalAccessRestrictions ->; - // @public export const authServiceFactory: ServiceFactory< AuthService, @@ -46,7 +39,7 @@ export interface ExternalTokenHandler { } // @public -export const externalTokenTypeHandlersRef: ServiceRef< +export const externalTokenHandlersServiceRef: ServiceRef< ExternalTokenHandler, 'plugin', 'multiton' diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts index b6d5beefa2..b70aedfb9a 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts @@ -31,7 +31,7 @@ import { toInternalBackstageCredentials } from './helpers'; import { PluginTokenHandler } from './plugin/PluginTokenHandler'; import { createServiceFactory } from '@backstage/backend-plugin-api'; -import { externalTokenTypeHandlersRef } from './external/ExternalAuthTokenHandler'; +import { externalTokenHandlersServiceRef } from './external/ExternalAuthTokenHandler'; import { createExternalTokenHandler } from './external/helpers'; const server = setupServer(); @@ -44,7 +44,7 @@ const mockDeps = [ backend: { baseUrl: 'http://localhost', auth: { - // keys: [{ secret: 'abc' }], + keys: [{ secret: 'abc' }], externalAccess: [ { type: 'static', @@ -468,7 +468,7 @@ describe('authServiceFactory', () => { backend: { baseUrl: 'http://localhost', auth: { - // keys: [{ secret: 'abc' }w], + keys: [{ secret: 'abc' }], externalAccess: [ { type: 'static', @@ -521,7 +521,7 @@ describe('authServiceFactory', () => { }); const customPluginTokenHandler = createServiceFactory({ - service: externalTokenTypeHandlersRef, + service: externalTokenHandlersServiceRef, deps: {}, async factory() { return customExternalTokenHandler; diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts index 0f8c5ff75d..ee171aef25 100644 --- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts @@ -22,7 +22,7 @@ import { import { DefaultAuthService } from './DefaultAuthService'; import { ExternalAuthTokenHandler, - externalTokenTypeHandlersRef, + externalTokenHandlersServiceRef, } from './external/ExternalAuthTokenHandler'; import { DefaultPluginTokenHandler, @@ -67,7 +67,7 @@ export const authServiceFactory = createServiceFactory({ plugin: coreServices.pluginMetadata, database: coreServices.database, pluginTokenHandlerDecorator: pluginTokenHandlerDecoratorServiceRef, - externalTokenHandlers: externalTokenTypeHandlersRef, + externalTokenHandlers: externalTokenHandlersServiceRef, }, async factory({ config, diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index 491de30ac4..f315b43314 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -233,6 +233,57 @@ describe('ExternalTokenHandler', () => { accessRestrictions: { permissionNames: ['catalog.entity.read'] }, }); }); + it('successfully uses legacy configs', async () => { + const legacyKey = randomBytes(24); + const factory = new FakeTokenFactory({ + issuer: 'my-company', + keyDurationSeconds: 100, + }); + + server.use( + rest.get( + 'https://example.com/.well-known/jwks.json', + async (_, res, ctx) => { + const keys = await factory.listPublicKeys(); + return res(ctx.json(keys)); + }, + ), + ); + + const logger = mockServices.logger.mock(); + const handler = ExternalAuthTokenHandler.create({ + ownPluginId: 'catalog', + logger, + config: mockServices.rootConfig({ + data: { + backend: { + auth: { + keys: [ + { + secret: legacyKey.toString('base64'), + }, + ], + }, + }, + }, + }), + }); + + expect(logger.warn).toHaveBeenCalledWith( + `DEPRECATION WARNING: The backend.auth.keys config has been replaced by backend.auth.externalAccess, see https://backstage.io/docs/auth/service-to-service-auth`, + ); + + const legacyToken = await new SignJWT({ + sub: 'backstage-server', + exp: DateTime.now().plus({ minutes: 1 }).toUnixInteger(), + }) + .setProtectedHeader({ alg: 'HS256' }) + .sign(legacyKey); + + await expect(handler.verifyToken(legacyToken)).resolves.toEqual({ + subject: 'external:backstage-plugin', + }); + }); it('successfully uses custom token handlers', async () => { const factory = new FakeTokenFactory({ issuer: 'my-company', diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts index 17541ff384..4b2cbb3e5a 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts @@ -33,14 +33,13 @@ let loggedDeprecationWarning = false; /** * @public - * This service is used to decorate the default plugin token handler with custom logic. + * This service is used to add custom handlers for external token. */ -export const externalTokenTypeHandlersRef = createServiceRef< +export const externalTokenHandlersServiceRef = createServiceRef< ExternalTokenHandler >({ id: 'core.auth.externalTokenHandlers', multiton: true, - // defaultFactory // :pepe-think: seems like is not possible to use defaultFactory with multiton }); const defaultHandlers: ExternalTokenHandler[] = [ @@ -54,6 +53,7 @@ type ContextMapEntry = { handler: ExternalTokenHandler; allAccessRestrictions?: AccessRestrictionsMap; }; + /** * Handles all types of external caller token types (i.e. not Backstage user * tokens, nor Backstage backend plugin tokens). @@ -71,6 +71,7 @@ export class ExternalAuthTokenHandler { ownPluginId, config, externalTokenHandlers: customHandlers, + logger, } = options; const handlersTypes = [...defaultHandlers, ...(customHandlers ?? [])]; @@ -104,12 +105,23 @@ export class ExternalAuthTokenHandler { if (legacyConfigs.length && !loggedDeprecationWarning) { loggedDeprecationWarning = true; - // :pepe-think: this message was here for more than a year, and replacing this simplifies things a lot - throw new Error( - `The ${OLD_CONFIG_KEY} config has been replaced by ${NEW_CONFIG_KEY}, see https://backstage.io/docs/auth/service-to-service-auth`, + + logger.warn( + `DEPRECATION WARNING: The ${OLD_CONFIG_KEY} config has been replaced by ${NEW_CONFIG_KEY}, see https://backstage.io/docs/auth/service-to-service-auth`, ); } + for (const legacyConfig of legacyConfigs) { + contexts.push({ + context: legacyTokenHandler.initialize({ + legacy: true, + options: legacyConfig, + }), + handler: legacyTokenHandler, + allAccessRestrictions: readAccessRestrictionsFromConfig(legacyConfig), + }); + } + return new ExternalAuthTokenHandler(ownPluginId, contexts); } diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts index a278e5766c..48dbcc2418 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.test.ts @@ -23,6 +23,7 @@ import { legacyTokenHandler } from './legacy'; describe('LegacyTokenHandler', () => { const key1 = randomBytes(24); const key2 = randomBytes(24); + const key3 = randomBytes(24); const tokenHandler = legacyTokenHandler; @@ -40,6 +41,13 @@ describe('LegacyTokenHandler', () => { }), }); + const contextWithLegacy = tokenHandler.initialize({ + options: new ConfigReader({ + secret: key3.toString('base64'), + }), + legacy: true, + }); + it('should verify valid tokens', async () => { const token1 = await new SignJWT({ sub: 'backstage-server', @@ -62,6 +70,19 @@ describe('LegacyTokenHandler', () => { await expect(tokenHandler.verifyToken(token2, context2)).resolves.toEqual({ subject: 'key2', }); + + const token3 = await new SignJWT({ + sub: 'backstage-server', + exp: DateTime.now().plus({ minutes: 1 }).toUnixInteger(), + }) + .setProtectedHeader({ alg: 'HS256' }) + .sign(key3); + + await expect( + tokenHandler.verifyToken(token3, contextWithLegacy), + ).resolves.toEqual({ + subject: 'external:backstage-plugin', + }); }); it('should return undefined if the token is not a valid legacy token', async () => { @@ -235,5 +256,54 @@ describe('LegacyTokenHandler', () => { ).toThrowErrorMatchingInlineSnapshot( `"Invalid type in config for key 'subject' in 'mock-config', got number, wanted string"`, ); + + // old style add + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: 'b2s=' }), + legacy: true, + }), + ).not.toThrow(); + + expect(() => + handler.initialize({ + options: new ConfigReader({ _missingsecret: true }), + legacy: true, + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Missing required config value at 'secret' in 'mock-config'"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: '' }), + legacy: true, + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Invalid type in config for key 'secret' in 'mock-config', got empty-string, wanted string"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: 'has spaces' }), + legacy: true, + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Illegal secret, must be a valid base64 string"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: 'hasnewline\n' }), + legacy: true, + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Illegal secret, must be a valid base64 string"`, + ); + expect(() => + handler.initialize({ + options: new ConfigReader({ secret: 3 }), + legacy: true, + }), + ).toThrowErrorMatchingInlineSnapshot( + `"Invalid type in config for key 'secret' in 'mock-config', got number, wanted string"`, + ); }); }); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts index f9932a8735..2ab8c3a5ea 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/legacy.ts @@ -17,7 +17,7 @@ import { Config } from '@backstage/config'; import { base64url, decodeJwt, decodeProtectedHeader, jwtVerify } from 'jose'; -import { createExternalTokenHandler } from './helpers'; +import { ExternalTokenHandler } from './types'; export type LegacyConfigWrapper = { legacy: boolean; @@ -30,64 +30,74 @@ type LegacyTokenHandlerContext = { subject: string; }; -export const legacyTokenHandler = - createExternalTokenHandler({ - type: 'legacy', - initialize(ctx: { options: Config }): LegacyTokenHandlerContext { - const secret = ctx.options.getString('secret'); - const subject = ctx.options.getString('subject'); +type LegacyTokenHandlerOverloaded = + ExternalTokenHandler & { + initialize(ctx: { + options: Config; + legacy: true; + }): LegacyTokenHandlerContext; + }; - if (!secret.match(/^\S+$/)) { - throw new Error('Illegal secret, must be a valid base64 string'); - } else if (!subject.match(/^\S+$/)) { - throw new Error( - 'Illegal subject, must be a set of non-space characters', - ); - } +export const legacyTokenHandler: LegacyTokenHandlerOverloaded = { + type: 'legacy', + initialize(ctx: { + options: Config; + legacy?: true; + }): LegacyTokenHandlerContext { + const secret = ctx.options.getString('secret'); + const subject = ctx.legacy + ? 'external:backstage-plugin' + : ctx.options.getString('subject'); - try { - return { - key: base64url.decode(secret), - subject, - }; - } catch { - throw new Error('Illegal secret, must be a valid base64 string'); - } - }, + if (!secret.match(/^\S+$/)) { + throw new Error('Illegal secret, must be a valid base64 string'); + } else if (!subject.match(/^\S+$/)) { + throw new Error('Illegal subject, must be a set of non-space characters'); + } - async verifyToken(token: string, context: LegacyTokenHandlerContext) { - // First do a duck typing check to see if it remotely looks like a legacy token - try { - // We do a fair amount of checking upfront here. Since we aren't certain - // that it's even the right type of key that we're looking at, we can't - // defer eg the alg check to jwtVerify, because it won't be possible to - // discern different reasons for key verification failures from each other - // easily - const { alg } = decodeProtectedHeader(token); - if (alg !== 'HS256') { - return undefined; - } - const { sub, aud } = decodeJwt(token); - if (sub !== 'backstage-server' || aud) { - return undefined; - } - } catch (e) { - // Doesn't look like a jwt at all + try { + return { + key: base64url.decode(secret), + subject, + }; + } catch { + throw new Error('Illegal secret, must be a valid base64 string'); + } + }, + + async verifyToken(token: string, context: LegacyTokenHandlerContext) { + // First do a duck typing check to see if it remotely looks like a legacy token + try { + // We do a fair amount of checking upfront here. Since we aren't certain + // that it's even the right type of key that we're looking at, we can't + // defer eg the alg check to jwtVerify, because it won't be possible to + // discern different reasons for key verification failures from each other + // easily + const { alg } = decodeProtectedHeader(token); + if (alg !== 'HS256') { return undefined; } - - try { - await jwtVerify(token, context.key); - return { - subject: context.subject, - }; - } catch (error) { - if (error.code !== 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED') { - throw error; - } + const { sub, aud } = decodeJwt(token); + if (sub !== 'backstage-server' || aud) { + return undefined; } - - // None of the signing keys matched + } catch (e) { + // Doesn't look like a jwt at all return undefined; - }, - }); + } + + try { + await jwtVerify(token, context.key); + return { + subject: context.subject, + }; + } catch (error) { + if (error.code !== 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED') { + throw error; + } + } + + // None of the signing keys matched + return undefined; + }, +}; diff --git a/packages/backend-defaults/src/entrypoints/auth/external/types.ts b/packages/backend-defaults/src/entrypoints/auth/external/types.ts index 6ce1ca13b6..01d5a26149 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/types.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/types.ts @@ -17,9 +17,6 @@ import { BackstagePrincipalAccessRestrictions } from '@backstage/backend-plugin-api'; import type { Config } from '@backstage/config'; -/** - * @public - */ export type AccessRestrictionsMap = Map< string, // plugin ID BackstagePrincipalAccessRestrictions @@ -38,16 +35,3 @@ export interface ExternalTokenHandler { ctx: TContext, ): Promise<{ subject: string } | undefined>; } - -// /** -// * @public -// * This interface is used to handle external tokens. -// */ -// export interface TokenTypeHandler { -// type: string; -// /** -// * A factory function that takes all token configuration for a given type -// * and returns a TokenHandler or an array of TokenHandlers. -// */ -// factory: (configs: Config[]) => TokenHandler | TokenHandler[]; -// } diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts index e205c8b566..69d41b0310 100644 --- a/packages/backend-defaults/src/entrypoints/auth/index.ts +++ b/packages/backend-defaults/src/entrypoints/auth/index.ts @@ -21,9 +21,8 @@ export { export { createExternalTokenHandler } from './external/helpers'; -export { externalTokenTypeHandlersRef } from './external/ExternalAuthTokenHandler'; +export { externalTokenHandlersServiceRef } from './external/ExternalAuthTokenHandler'; export type { ExternalTokenHandler } from './external/types'; -export type { AccessRestrictionsMap } from './external/types'; export type { PluginTokenHandler } from './plugin/PluginTokenHandler'; From fe17ef8115b79c300ac78b253cd78b553836fc8e Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Mon, 15 Sep 2025 23:08:47 +0200 Subject: [PATCH 023/177] failing api report Signed-off-by: Juan Pablo Garcia Ripa --- plugins/catalog-react/report-alpha.api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-react/report-alpha.api.md b/plugins/catalog-react/report-alpha.api.md index 30cdd91704..cf28d80c11 100644 --- a/plugins/catalog-react/report-alpha.api.md +++ b/plugins/catalog-react/report-alpha.api.md @@ -92,12 +92,12 @@ export const catalogReactTranslationRef: TranslationRef< readonly 'entityTableColumnTitle.title': 'Title'; readonly 'entityTableColumnTitle.description': 'Description'; readonly 'entityTableColumnTitle.domain': 'Domain'; + readonly 'entityTableColumnTitle.system': 'System'; + readonly 'entityTableColumnTitle.tags': 'Tags'; readonly 'entityTableColumnTitle.namespace': 'Namespace'; readonly 'entityTableColumnTitle.lifecycle': 'Lifecycle'; readonly 'entityTableColumnTitle.owner': 'Owner'; - readonly 'entityTableColumnTitle.system': 'System'; readonly 'entityTableColumnTitle.targets': 'Targets'; - readonly 'entityTableColumnTitle.tags': 'Tags'; } >; @@ -533,8 +533,8 @@ export const EntityTableColumnTitle: ({ translationKey, }: EntityTableColumnTitleProps) => | 'Title' - | 'Domain' | 'System' + | 'Domain' | 'Lifecycle' | 'Namespace' | 'Owner' From 8b912380212386ac2b95e3f5ff906125065251d8 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Tue, 8 Jul 2025 17:33:19 +0100 Subject: [PATCH 024/177] feat(http): support server-level timeout and socket options via app-config Adds support for configuring server-level HTTP options through the `app-config.yaml` file under the `backend.server` key. This includes support for: `headersTimeout`, `keepAliveTimeout`, `requestTimeout`, `timeout`, `maxHeadersCount`, and `maxRequestsPerSocket`. These options are passed directly to the underlying Node.js HTTP server, when omitted, the default values are used. Refs: https://github.com/backstage/backstage/issues/21808 Refs: https://github.com/backstage/backstage/issues/30449 Signed-off-by: Beth Griggs --- .changeset/salty-words-wash.md | 11 ++++ .../core-services/root-http-router.md | 8 +++ .../rootHttpRouter/http/config.test.ts | 53 +++++++++++++++++++ .../entrypoints/rootHttpRouter/http/config.ts | 30 +++++++++++ .../rootHttpRouter/http/createHttpServer.ts | 29 ++++++++-- .../entrypoints/rootHttpRouter/http/types.ts | 8 +++ 6 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 .changeset/salty-words-wash.md diff --git a/.changeset/salty-words-wash.md b/.changeset/salty-words-wash.md new file mode 100644 index 0000000000..eec2e85331 --- /dev/null +++ b/.changeset/salty-words-wash.md @@ -0,0 +1,11 @@ +--- +'@backstage/backend-defaults': minor +--- + +Adds support for configuring server-level HTTP options through the +`app-config.yaml` file under the `backend.server` key. Supported options +include `headersTimeout`, `keepAliveTimeout`, `requestTimeout`, `timeout`, +`maxHeadersCount`, and `maxRequestsPerSocket`. + +These are passed directly to the underlying Node.js HTTP server. +If omitted, Node.js defaults are used. diff --git a/docs/backend-system/core-services/root-http-router.md b/docs/backend-system/core-services/root-http-router.md index 1e76fb1871..0ced7aac66 100644 --- a/docs/backend-system/core-services/root-http-router.md +++ b/docs/backend-system/core-services/root-http-router.md @@ -65,6 +65,14 @@ backend: # - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M'. # - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }`. serverShutdownDelay: { seconds: 20 } + server: + # (Optional) HTTP server configuration, Node.js defaults apply otherwise + headersTimeout: 60000 + keepAliveTimeout: 5000 + maxHeadersCount: 2000 + maxRequestsPerSocket: 100 + requestTimeout: 30000 + timeout: 30000 ``` ### Via Code diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts index 577bae08f3..0fa9dc0420 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts @@ -61,6 +61,59 @@ describe('readHttpServerOptions', () => { expect(readHttpServerOptions(new ConfigReader(input))).toEqual(output); }); + it.each([ + [ + { + server: { + headersTimeout: 10000, + requestTimeout: 30000, + keepAliveTimeout: 5000, + timeout: 60000, + maxHeadersCount: 1000, + maxRequestsPerSocket: 100, + }, + }, + { + listen: { host: '', port: 7007 }, + https: undefined, + serverOptions: { + headersTimeout: 10000, + requestTimeout: 30000, + keepAliveTimeout: 5000, + timeout: 60000, + maxHeadersCount: 1000, + maxRequestsPerSocket: 100, + }, + }, + ], + [ + { + server: { + keepAliveTimeout: 8000, + timeout: 30000, + }, + }, + { + listen: { host: '', port: 7007 }, + https: undefined, + serverOptions: { + keepAliveTimeout: 8000, + timeout: 30000, + }, + }, + ], + [ + { server: {} }, + { + listen: { host: '', port: 7007 }, + https: undefined, + serverOptions: undefined, + }, + ], + ])('should read server options %#', (input, output) => { + expect(readHttpServerOptions(new ConfigReader(input))).toEqual(output); + }); + it.each([ [ { listen: { port: 'not-a-number' } }, diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts index ec29a8a044..229ba2d78d 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts @@ -38,6 +38,7 @@ export function readHttpServerOptions(config?: Config): HttpServerOptions { return { listen: readHttpListenOptions(config), https: readHttpsOptions(config), + serverOptions: readServerOptions(config), }; } @@ -99,3 +100,32 @@ function readHttpsOptions(config?: Config): HttpServerOptions['https'] { }, }; } + +function readServerOptions( + config?: Config, +): HttpServerOptions['serverOptions'] { + const serverConfig = config?.getOptionalConfig('server'); + if (!serverConfig) { + return undefined; + } + + const serverOptions: HttpServerOptions['serverOptions'] = {}; + + const keys = [ + 'headersTimeout', + 'requestTimeout', + 'keepAliveTimeout', + 'timeout', + 'maxHeadersCount', + 'maxRequestsPerSocket', + ] as const; + + for (const key of keys) { + const value = serverConfig.getOptionalNumber(key); + if (value !== undefined) { + serverOptions[key] = value; + } + } + + return Object.keys(serverOptions).length === 0 ? undefined : serverOptions; +} diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts index fbb6ac5805..1ae6cc4fd1 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts @@ -84,6 +84,8 @@ async function createServer( options: HttpServerOptions, deps: { logger: LoggerService }, ): Promise { + let server: http.Server; + if (options.https) { const { certificate } = options.https; if (certificate.type === 'generated') { @@ -91,10 +93,31 @@ async function createServer( certificate.hostname, deps.logger, ); - return https.createServer(credentials, listener); + server = https.createServer(credentials, listener); + } else { + server = https.createServer(certificate, listener); } - return https.createServer(certificate, listener); + } else { + server = http.createServer(listener); } - return http.createServer(listener); + // apply custom server options + if (options.serverOptions) { + const { serverOptions } = options; + + if (serverOptions.headersTimeout !== undefined) + server.headersTimeout = serverOptions.headersTimeout; + if (serverOptions.requestTimeout !== undefined) + server.requestTimeout = serverOptions.requestTimeout; + if (serverOptions.keepAliveTimeout !== undefined) + server.keepAliveTimeout = serverOptions.keepAliveTimeout; + if (serverOptions.timeout !== undefined) + server.timeout = serverOptions.timeout; + if (serverOptions.maxHeadersCount !== undefined) + server.maxHeadersCount = serverOptions.maxHeadersCount; + if (serverOptions.maxRequestsPerSocket !== undefined) + server.maxRequestsPerSocket = serverOptions.maxRequestsPerSocket; + } + + return server; } diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts index 2298ef11ff..13e7914c03 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts @@ -42,6 +42,14 @@ export type HttpServerOptions = { https?: { certificate: HttpServerCertificateOptions; }; + serverOptions?: { + headersTimeout?: number; + requestTimeout?: number; + keepAliveTimeout?: number; + timeout?: number; + maxHeadersCount?: number; + maxRequestsPerSocket?: number; + }; }; /** From ee06f7d181166a06c03659c56c9e4f0a00b23a28 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Wed, 9 Jul 2025 16:49:38 +0100 Subject: [PATCH 025/177] fixup! add API report Signed-off-by: Beth Griggs --- packages/backend-defaults/report-rootHttpRouter.api.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/backend-defaults/report-rootHttpRouter.api.md b/packages/backend-defaults/report-rootHttpRouter.api.md index 84424be39d..acabea9640 100644 --- a/packages/backend-defaults/report-rootHttpRouter.api.md +++ b/packages/backend-defaults/report-rootHttpRouter.api.md @@ -82,6 +82,14 @@ export type HttpServerOptions = { https?: { certificate: HttpServerCertificateOptions; }; + serverOptions?: { + headersTimeout?: number; + requestTimeout?: number; + keepAliveTimeout?: number; + timeout?: number; + maxHeadersCount?: number; + maxRequestsPerSocket?: number; + }; }; // @public From d501e8c7686500428b008d869a6297cceb464bff Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Fri, 12 Sep 2025 15:55:49 +0100 Subject: [PATCH 026/177] feat(http): move HTTP server configuration application, enable flexible duration formats This commit applies HTTP server configuration in `rootHttpRouterServiceFactory` and adds support for multiple duration formats for timeouts. The previous tests for server config have been moved and refactored. The documentation and CHANGELOG have been updated to reflect the new configuration structure and supported formats. Signed-off-by: Beth Griggs --- .../core-services/root-http-router.md | 12 ++- packages/backend-defaults/config.d.ts | 25 ++++++ .../report-rootHttpRouter.api.md | 8 -- .../rootHttpRouter/http/config.test.ts | 53 ------------- .../entrypoints/rootHttpRouter/http/config.ts | 30 -------- .../rootHttpRouter/http/createHttpServer.ts | 29 +------ .../entrypoints/rootHttpRouter/http/types.ts | 8 -- .../rootHttpRouterServiceFactory.test.ts | 61 +++++++++++++++ .../rootHttpRouterServiceFactory.ts | 77 +++++++++++++++++++ 9 files changed, 175 insertions(+), 128 deletions(-) diff --git a/docs/backend-system/core-services/root-http-router.md b/docs/backend-system/core-services/root-http-router.md index 0ced7aac66..1bda95a990 100644 --- a/docs/backend-system/core-services/root-http-router.md +++ b/docs/backend-system/core-services/root-http-router.md @@ -67,12 +67,18 @@ backend: serverShutdownDelay: { seconds: 20 } server: # (Optional) HTTP server configuration, Node.js defaults apply otherwise + # Timeout values support multiple formats: + # - Numbers (milliseconds): 30000 + # - Duration strings: '30s', '1 minute', '2 hours' + # - ISO duration strings: 'PT30S', 'PT1M', 'PT2H' + # - Duration objects: { seconds: 30 }, { minutes: 1 }, { hours: 2 } headersTimeout: 60000 - keepAliveTimeout: 5000 + requestTimeout: '30s' + keepAliveTimeout: { seconds: 5 } + timeout: 'PT30S' + # Numeric-only settings maxHeadersCount: 2000 maxRequestsPerSocket: 100 - requestTimeout: 30000 - timeout: 30000 ``` ### Via Code diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index 2982557f32..f0632a37bb 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -95,6 +95,31 @@ export interface Config { }; }; + /** + * Server-level HTTP options configuration for the backend. + * These options are passed directly to the underlying Node.js HTTP server. + * + * Timeout values support multiple formats: + * - A number in milliseconds + * - A string in the format of '1d', '2 seconds' etc. as supported by the `ms` library + * - A standard ISO formatted duration string, e.g. 'P2DT6H' or 'PT1M' + * - An object with individual units (in plural) as keys, e.g. `{ days: 2, hours: 6 }` + */ + server?: { + /** Sets the timeout value for receiving the complete HTTP headers from the client. */ + headersTimeout?: number | string | HumanDuration; + /** Sets the timeout value for receiving the entire request (headers and body) from the client. */ + requestTimeout?: number | string | HumanDuration; + /** Sets the timeout value for inactivity on a socket during keep-alive. */ + keepAliveTimeout?: number | string | HumanDuration; + /** Sets the timeout value for sockets. */ + timeout?: number | string | HumanDuration; + /** Limits maximum incoming headers count. */ + maxHeadersCount?: number; + /** Sets the maximum number of requests socket can handle before closing keep alive connection. */ + maxRequestsPerSocket?: number; + }; + /** * Options used by the default auditor service. */ diff --git a/packages/backend-defaults/report-rootHttpRouter.api.md b/packages/backend-defaults/report-rootHttpRouter.api.md index acabea9640..84424be39d 100644 --- a/packages/backend-defaults/report-rootHttpRouter.api.md +++ b/packages/backend-defaults/report-rootHttpRouter.api.md @@ -82,14 +82,6 @@ export type HttpServerOptions = { https?: { certificate: HttpServerCertificateOptions; }; - serverOptions?: { - headersTimeout?: number; - requestTimeout?: number; - keepAliveTimeout?: number; - timeout?: number; - maxHeadersCount?: number; - maxRequestsPerSocket?: number; - }; }; // @public diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts index 0fa9dc0420..577bae08f3 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.test.ts @@ -61,59 +61,6 @@ describe('readHttpServerOptions', () => { expect(readHttpServerOptions(new ConfigReader(input))).toEqual(output); }); - it.each([ - [ - { - server: { - headersTimeout: 10000, - requestTimeout: 30000, - keepAliveTimeout: 5000, - timeout: 60000, - maxHeadersCount: 1000, - maxRequestsPerSocket: 100, - }, - }, - { - listen: { host: '', port: 7007 }, - https: undefined, - serverOptions: { - headersTimeout: 10000, - requestTimeout: 30000, - keepAliveTimeout: 5000, - timeout: 60000, - maxHeadersCount: 1000, - maxRequestsPerSocket: 100, - }, - }, - ], - [ - { - server: { - keepAliveTimeout: 8000, - timeout: 30000, - }, - }, - { - listen: { host: '', port: 7007 }, - https: undefined, - serverOptions: { - keepAliveTimeout: 8000, - timeout: 30000, - }, - }, - ], - [ - { server: {} }, - { - listen: { host: '', port: 7007 }, - https: undefined, - serverOptions: undefined, - }, - ], - ])('should read server options %#', (input, output) => { - expect(readHttpServerOptions(new ConfigReader(input))).toEqual(output); - }); - it.each([ [ { listen: { port: 'not-a-number' } }, diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts index 229ba2d78d..ec29a8a044 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/config.ts @@ -38,7 +38,6 @@ export function readHttpServerOptions(config?: Config): HttpServerOptions { return { listen: readHttpListenOptions(config), https: readHttpsOptions(config), - serverOptions: readServerOptions(config), }; } @@ -100,32 +99,3 @@ function readHttpsOptions(config?: Config): HttpServerOptions['https'] { }, }; } - -function readServerOptions( - config?: Config, -): HttpServerOptions['serverOptions'] { - const serverConfig = config?.getOptionalConfig('server'); - if (!serverConfig) { - return undefined; - } - - const serverOptions: HttpServerOptions['serverOptions'] = {}; - - const keys = [ - 'headersTimeout', - 'requestTimeout', - 'keepAliveTimeout', - 'timeout', - 'maxHeadersCount', - 'maxRequestsPerSocket', - ] as const; - - for (const key of keys) { - const value = serverConfig.getOptionalNumber(key); - if (value !== undefined) { - serverOptions[key] = value; - } - } - - return Object.keys(serverOptions).length === 0 ? undefined : serverOptions; -} diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts index 1ae6cc4fd1..fbb6ac5805 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/createHttpServer.ts @@ -84,8 +84,6 @@ async function createServer( options: HttpServerOptions, deps: { logger: LoggerService }, ): Promise { - let server: http.Server; - if (options.https) { const { certificate } = options.https; if (certificate.type === 'generated') { @@ -93,31 +91,10 @@ async function createServer( certificate.hostname, deps.logger, ); - server = https.createServer(credentials, listener); - } else { - server = https.createServer(certificate, listener); + return https.createServer(credentials, listener); } - } else { - server = http.createServer(listener); + return https.createServer(certificate, listener); } - // apply custom server options - if (options.serverOptions) { - const { serverOptions } = options; - - if (serverOptions.headersTimeout !== undefined) - server.headersTimeout = serverOptions.headersTimeout; - if (serverOptions.requestTimeout !== undefined) - server.requestTimeout = serverOptions.requestTimeout; - if (serverOptions.keepAliveTimeout !== undefined) - server.keepAliveTimeout = serverOptions.keepAliveTimeout; - if (serverOptions.timeout !== undefined) - server.timeout = serverOptions.timeout; - if (serverOptions.maxHeadersCount !== undefined) - server.maxHeadersCount = serverOptions.maxHeadersCount; - if (serverOptions.maxRequestsPerSocket !== undefined) - server.maxRequestsPerSocket = serverOptions.maxRequestsPerSocket; - } - - return server; + return http.createServer(listener); } diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts index 13e7914c03..2298ef11ff 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/types.ts @@ -42,14 +42,6 @@ export type HttpServerOptions = { https?: { certificate: HttpServerCertificateOptions; }; - serverOptions?: { - headersTimeout?: number; - requestTimeout?: number; - keepAliveTimeout?: number; - timeout?: number; - maxHeadersCount?: number; - maxRequestsPerSocket?: number; - }; }; /** diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts index 0f2b6463e4..8f8d1b7656 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts @@ -323,4 +323,65 @@ describe('rootHttpRouterServiceFactory', () => { }), ).resolves.toBeUndefined(); }); + + it('should start successfully with server configuration options', async () => { + const { app } = await createExpressApp( + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { port: 0 }, + server: { + headersTimeout: 30000, + requestTimeout: '45s', + keepAliveTimeout: 'PT1M', + timeout: { seconds: 120 }, + maxHeadersCount: 2000, + maxRequestsPerSocket: 100, + }, + }, + }, + }), + ); + + // Verify the server starts and responds to health checks + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + }); + + it('should start successfully with partial server configuration', async () => { + const { app } = await createExpressApp( + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { port: 0 }, + server: { + headersTimeout: 60000, + maxHeadersCount: 1500, + }, + }, + }, + }), + ); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + }); + + it('should start successfully with no server configuration', async () => { + const { app } = await createExpressApp( + mockServices.rootConfig.factory({ + data: { + backend: { + listen: { port: 0 }, + }, + }, + }), + ); + + await request(app) + .get('/.backstage/health/v1/liveness') + .expect(200, { status: 'ok' }); + }); }); diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts index 3b50515742..1bbf986a98 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -117,6 +117,83 @@ const rootHttpRouterServiceFactoryWithOptions = ( if (trustProxy !== undefined) { app.set('trust proxy', trustProxy); } + + // Apply server-level HTTP options from config + const backendConfig = config.getOptionalConfig('backend'); + const serverConfig = backendConfig?.getOptionalConfig('server'); + + if (serverConfig) { + // Helper function to read duration values (supporting number, string, or HumanDuration) + const readDurationValue = (key: string): number | undefined => { + if (!serverConfig.has(key)) { + return undefined; + } + + const value = serverConfig.getOptional(key); + if (typeof value === 'number') { + return value; + } + + // If it's not a number, try to read it as a duration + try { + const duration = readDurationFromConfig(serverConfig, { key }); + return durationToMilliseconds(duration); + } catch (error) { + // Log warning for parsing failures + logger.warn( + `Failed to parse backend.server.${key} as duration: ${error}. ` + + `Expected a number (milliseconds), duration string (e.g., '30s'), ` + + `ISO duration (e.g., 'PT30S'), or duration object (e.g., {seconds: 30}). ` + + `Falling back to number parsing.`, + ); + // Fallback to reading as number if duration parsing fails + const fallbackValue = serverConfig.getOptionalNumber(key); + if (fallbackValue === undefined && typeof value === 'string') { + logger.error( + `backend.server.${key} value '${value}' could not be parsed as either ` + + `a duration or a number. This setting will be ignored.`, + ); + } + return fallbackValue; + } + }; + + // Apply timeout settings + const headersTimeout = readDurationValue('headersTimeout'); + if (headersTimeout !== undefined) { + server.headersTimeout = headersTimeout; + } + + const requestTimeout = readDurationValue('requestTimeout'); + if (requestTimeout !== undefined) { + server.requestTimeout = requestTimeout; + } + + const keepAliveTimeout = readDurationValue('keepAliveTimeout'); + if (keepAliveTimeout !== undefined) { + server.keepAliveTimeout = keepAliveTimeout; + } + + const timeout = readDurationValue('timeout'); + if (timeout !== undefined) { + server.timeout = timeout; + } + + // Apply numeric settings + const maxHeadersCount = + serverConfig.getOptionalNumber('maxHeadersCount'); + if (maxHeadersCount !== undefined) { + server.maxHeadersCount = maxHeadersCount; + } + + const maxRequestsPerSocket = serverConfig.getOptionalNumber( + 'maxRequestsPerSocket', + ); + if (maxRequestsPerSocket !== undefined) { + server.maxRequestsPerSocket = maxRequestsPerSocket; + } + } + app.use(middleware.helmet()); app.use(middleware.cors()); app.use(middleware.compression()); From b8a381e4f150bd75de8f62264a2a089bfc704acd Mon Sep 17 00:00:00 2001 From: Tim Klever Date: Mon, 18 Aug 2025 17:30:26 -0700 Subject: [PATCH 027/177] chore: remove `isomorphic-form-data` from dependencies The need to explicitly specify this dependency was resolved. Issue: https://github.com/swagger-api/swagger-ui/issues/7436 Resolution: https://github.com/swagger-api/swagger-ui/issues/7436#issuecomment-889792304 Signed-off-by: Tim Klever --- .changeset/short-aliens-invite.md | 13 + plugins/api-docs/package.json | 3 +- yarn.lock | 807 +++++++++++++++--------------- 3 files changed, 419 insertions(+), 404 deletions(-) create mode 100644 .changeset/short-aliens-invite.md diff --git a/.changeset/short-aliens-invite.md b/.changeset/short-aliens-invite.md new file mode 100644 index 0000000000..ae3bbc3831 --- /dev/null +++ b/.changeset/short-aliens-invite.md @@ -0,0 +1,13 @@ +--- +'@backstage/plugin-api-docs': minor +--- + +Remove explicit dependency on `isomorphic-form-data`. + +This explicit dependency was added to address [an issue](https://github.com/swagger-api/swagger-ui/issues/7436) in the +dependency `swagger-ui-react`. That [issue has since been resolved](https://github.com/swagger-api/swagger-ui/issues/7436#issuecomment-889792304), +and `isomorphic-form-data` no longer needs to be declared. + +Additionally, this changeset updates the `swagger-ui-react` dependency to version `5.19.0` or higher, which includes +[compatibility](https://github.com/swagger-api/swagger-ui?tab=readme-ov-file#compatibility) with the latest versions of +the OpenAPI specification. diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index febec4ff08..810279ed39 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -71,8 +71,7 @@ "graphql": "^16.0.0", "graphql-config": "^5.0.2", "graphql-ws": "^5.4.1", - "isomorphic-form-data": "^2.0.0", - "swagger-ui-react": "^5.0.0" + "swagger-ui-react": "^5.27.1" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/yarn.lock b/yarn.lock index e606b8246d..71e66f926b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2419,13 +2419,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.24.7": - version: 7.27.0 - resolution: "@babel/runtime-corejs3@npm:7.27.0" +"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.26.10, @babel/runtime-corejs3@npm:^7.27.1": + version: 7.28.4 + resolution: "@babel/runtime-corejs3@npm:7.28.4" dependencies: - core-js-pure: "npm:^3.30.2" - regenerator-runtime: "npm:^0.14.0" - checksum: 10/034628bf1b602729b53022f99fd82baca9347db435843c677b888cd7e71412aa4a3065806d622b8e98971577285b4bd546dfc8b57c14aea43a22934a1a3beca4 + core-js-pure: "npm:^3.43.0" + checksum: 10/99079931145c0606a9967fe002c3528ae237b759cee115fc97a5dc17101d5ccdf9a794fd4ce5d94c7e2e8ee1f9f6816fb50b4472e980b5e4dd878fbdfac02619 languageName: node linkType: hard @@ -3643,11 +3642,10 @@ __metadata: graphql: "npm:^16.0.0" graphql-config: "npm:^5.0.2" graphql-ws: "npm:^5.4.1" - isomorphic-form-data: "npm:^2.0.0" react: "npm:^18.0.2" react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.3.0" - swagger-ui-react: "npm:^5.0.0" + swagger-ui-react: "npm:^5.27.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -7620,13 +7618,6 @@ __metadata: languageName: node linkType: hard -"@braintree/sanitize-url@npm:=7.0.4": - version: 7.0.4 - resolution: "@braintree/sanitize-url@npm:7.0.4" - checksum: 10/80ea0080776a0305d697d12042acac287675e88a2abd9d294464f70ec57c1b00242d8d02a110c98ef8ea1731e512d67273ff5532c4bf01a78ab8b046fabb53d9 - languageName: node - linkType: hard - "@bundled-es-modules/cookie@npm:^2.0.1": version: 2.0.1 resolution: "@bundled-es-modules/cookie@npm:2.0.1" @@ -18486,491 +18477,489 @@ __metadata: languageName: node linkType: hard -"@swagger-api/apidom-ast@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ast@npm:1.0.0-beta.11" +"@swagger-api/apidom-ast@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ast@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" unraw: "npm:^3.0.0" - checksum: 10/efe7caf37735f6b1a9b56ca780ce59134540c00c50ef00606607a458905142b7794466cacbffdcd9afe11ece9f5a99651f2f62d24b05f71727d86718e2dea91c + checksum: 10/b3f2b91df2b9116db318ce44551d3846453b7d9f17eb809c19890ecbbc17166ad6a1fa54698b79e85600960e2f1dd2ea56487d9a50537ee362a1a9dd63f91840 languageName: node linkType: hard -"@swagger-api/apidom-core@npm:>=1.0.0-beta.11 <1.0.0-rc.0, @swagger-api/apidom-core@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-core@npm:1.0.0-beta.11" +"@swagger-api/apidom-core@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-core@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-core@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" minim: "npm:~0.23.8" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - short-unique-id: "npm:^5.0.2" + short-unique-id: "npm:^5.3.2" ts-mixer: "npm:^6.0.3" - checksum: 10/bb81c1ef603b80985c8e7ad8808a12eaaf2daa3de2a41ac2f9f8c041c7a7f26bcbfa9713738248db198af1a6b424127b10abd5ac7e6fcad95d852cea8fb8a526 + checksum: 10/abf7328a4d821f6083daa80fe1e719511825ff855dc4be59a4147a100c1ae34254cba4050ecc29e5147877f7e9d797681e96931da0ce432c310aaae82cd5a371 languageName: node linkType: hard -"@swagger-api/apidom-error@npm:>=1.0.0-beta.11 <1.0.0-rc.0, @swagger-api/apidom-error@npm:^1.0.0-beta.11, @swagger-api/apidom-error@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-error@npm:1.0.0-beta.11" +"@swagger-api/apidom-error@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-error@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-error@npm:1.0.0-beta.48" dependencies: "@babel/runtime-corejs3": "npm:^7.20.7" - checksum: 10/d63ec68067a17c10fa51b2929c18d18f397d91ab45961e398ad99341b45e87d60a0ec6f634ac3883733ea7f4a5155e9929207dd44572f65754fa0f5b7d004466 + checksum: 10/ce6461f5b06a6297074949d1aabd605c272c3061241e4d47f3720707ac8bc41c272deed033ae131fb5620bd6d709e0744275353ed490f7eca81f75db94abfc7e languageName: node linkType: hard -"@swagger-api/apidom-json-pointer@npm:>=1.0.0-beta.11 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.11, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-json-pointer@npm:1.0.0-beta.11" +"@swagger-api/apidom-json-pointer@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-json-pointer@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-json-pointer@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@types/ramda": "npm:~0.30.0" - ramda: "npm:~0.30.0" - ramda-adjunct: "npm:^5.0.0" - checksum: 10/dee858ee4b4a0f93ab082451a703c8b9e0250f7b486d8d9ef243b77f92acc49741cfdd1e10a9cc44d946b64e469aa4016a1380c7a28d660fe048a2897098afc7 + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swaggerexpert/json-pointer": "npm:^2.10.1" + checksum: 10/2075f4d64813128ee80da21f16fd96bc51cf232505d920fc77af86acd2ea1db342936753b824153b232e9522d4a7f389fd870afdf3518b0af91f497119b6e1c5 languageName: node linkType: hard -"@swagger-api/apidom-ns-api-design-systems@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-api-design-systems@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-api-design-systems@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-api-design-systems@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/db2d3aa5342eaa8fc9205116bc1364fee56815dd43e3f57e7b27725ea081dcf897e5343256a9941493cd72e5459faa242c347bb3ff523425026d890ac9776b96 + checksum: 10/48e6a4f323572715f8990f83f6a1617af9d7ca0c6cd0e08f9b05c6f178664da233498c7c2461f636a97a525aaa60748c1da2a8d949ed43a7a14c1639d382f737 languageName: node linkType: hard -"@swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.11, @swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-arazzo-1@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-arazzo-1@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/635618e980a276e607e7faf286bb43dc38d6419745199df952ccced7ca86840bc9b5320698ddb00238f06cba49eeddf4275e12e121b932f8601656cb388af2a8 + checksum: 10/3b9f60ec9ca9dccc5e3d46a48a6d7b30915294bdb7dc6ee481aae57de707485885f887ad9b9daec469712c087e6d74ed748ac8d748ed6d19cb1fb6219141bb12 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-2019-09@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-json-schema-2019-09@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-asyncapi-2@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-asyncapi-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.48" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + ts-mixer: "npm:^6.0.3" + checksum: 10/99bcd30eb7c14334b2ebe3adfdb7ad8cf93d9565fc72217863a82b1ba48d4b5839b639964cf830bf9ba64c41c7a7d7eedeb53d8d28e5379bde1fafa8b424ab02 + languageName: node + linkType: hard + +"@swagger-api/apidom-ns-json-schema-2019-09@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-json-schema-2019-09@npm:1.0.0-beta.48" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-draft-7": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/b91f90e7376922f1112752520bcac265c20245c1d2d682cd5ba9344a3eb7287962f18e3430f501af4d4db43397a2977267b15ef02a3bcd6e8ba384901e195672 + checksum: 10/bed0ed8b2ef35def9da2b8cebb31dba0d83fab88a38ab1a1af4760d370f5b3d0a1dfda7f1f1991204eab97531ddc90c70c153cb3ba9a7a5b93be93f02d873097 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-2020-12@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-json-schema-2020-12@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-json-schema-2020-12@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-json-schema-2020-12@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-2019-09": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-2019-09": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/847103b0923fa7a0fcff124f5359f735f56e38a88666051e5959403e0060e33bea63b30098dec99d36bcda6619b2a3d13ce61c26e6ca03c508ea8518e871c123 + checksum: 10/6bfad975a9db33224bc980edafab8e39218d6eb0acc384881ba14b35061d2c51b45f3e778529f5cf5875330501c892f433319dc4613a2d08ae22cf33f832d91e languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-4@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-json-schema-draft-4@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-json-schema-draft-4@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/9e0ba9e29849915c0067227a82d8d9a741221b3ac73592b73e23d3cfe0c57548b21cbbb66cdeba914218c5f675f4ec497232d465880013f8aec8f486e4c3d91c + checksum: 10/860c09c46b6ef274afeaf4fb5aa0445dd9d394fb81f3d251d34c484ce31ca568e8d8e63acdfd207180dc28ac1a6fe082fe7139dbe1aadac2e5b81f42f80aefcd languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-6@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-json-schema-draft-6@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-json-schema-draft-6@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/0df53880202cdb8dbe1e534314842c2c10fe4cd03f6eecd56d67174492807df03134f360e1c0724610fc4531520c49bb41d81e6fd7373118031ad883e0101338 + checksum: 10/418d8c1cf20cc12841ee1d7e17bc57cbfa296d7833d4f656c650fcb5ade4bd646088177c9cc1c682b2ebd80fb3713de02b8dc562d155e3874c482e9d0d4edcc2 languageName: node linkType: hard -"@swagger-api/apidom-ns-json-schema-draft-7@npm:^1.0.0-beta.11": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-json-schema-draft-7@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-json-schema-draft-7@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-draft-6": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-draft-6": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.4" - checksum: 10/9ef5261e58b2e6798a3c22ad01940c613475a6515d2cd79d2f150b02152118036ef472bb75a271c0d1c3b617d51ccb2262680469824335f27150600f695eb6d8 + checksum: 10/6e683458465f221c490440f94a1d1328a39db87a27c257a5d700b2effc937b8568f98f5042d74f56fdf6692da4b4027074c33c59348199fc821c45de9598e473 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.11, @swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-openapi-2@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-2@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-openapi-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/1f58e871e77e310943b489cb734a88cd11a9d9baf61ec7330f975c056b83ab74efea9fdbf449c1652f562c5ef9bcac9cf010969e900f9b8b67ceb0f440dddf95 + checksum: 10/768fb7ec2c8506857837975529f311fe28359dd56a836c3b3cb1685bed623c489b5327e5fe58a41e70235ba525ba6401cc32fc9bd50bc5ec1cc0baf6fe144900 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.11, @swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-0@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-openapi-3-0@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-draft-4": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/44eabda02fb8ad965b7756931bba7ac2ae9f49ef720f401179efb9eafbf94ff6b3c8cb8fd260c9ddb1affe35c3876f780cef4cb090b755736847adb7eba699c8 + checksum: 10/a005d660c2e476a3d1bb74da9a2efa7fb0a68b1f52ddbde01514f4db9ef14051833f55b001c812da44fce3445c145ce5fd62a137477a71a6bcad220115c1e440 languageName: node linkType: hard -"@swagger-api/apidom-ns-openapi-3-1@npm:>=1.0.0-beta.11 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.11, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:1.0.0-beta.11" +"@swagger-api/apidom-ns-openapi-3-1@npm:>=1.0.0-beta.41 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-ns-openapi-3-1@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-ns-openapi-3-1@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" ts-mixer: "npm:^6.0.3" - checksum: 10/6ed3a3d7bc231c8f3273c60dcd459cdb117246e372ed9d0d2483601a966a3109b9617a4d8f327f494a31013d5bcf2bc372c5f3297bbf953c61ff4770c87414a5 + checksum: 10/3423b3d642487d562376a572dac31fec760d3a64fe8bb4065ee0634a340c418656b2ea9cfc484059db5105e7389c74ac32620413243990141a7bbdc2e7cb1062 languageName: node linkType: hard -"@swagger-api/apidom-ns-workflows-1@npm:^1.0.0-beta.11, @swagger-api/apidom-ns-workflows-1@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-ns-workflows-1@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-json-schema-2020-12": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - ts-mixer: "npm:^6.0.3" - checksum: 10/e8eb8bbbd1aa9c3663f2a5af11d67dd77f32bd983fdf388d3b1a480d9c4886de7e4f2d70baf27da3d7d1c23a4e4118aa2fe27733bbe654ba58b177c9e7945d37 + checksum: 10/ac86988052a7ad9f03c389cef02b22da36d6cbaae6c670c7642615de7f6efe921b3991f14a55793f803e5b5cb9eb0bcda30857a70a0a0d1c31d8f2d8023e78c6 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-json@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/934c4c70f8881a8540bd40d3b062d4da4b23d13b07de558e241ac7c442bcf85ce6451c4c93b243705426298720272c43e5a67805ab159c023ff3e37e99900bd6 + checksum: 10/c0c9f35707afe05c559c8edacc0f548d3916f8f0cb0b4800b441258cbd871ba5c8ed083758b82bbe2589f022964bcd199f8d839648a78e979c94234e7ff22a08 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-api-design-systems-yaml@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-arazzo-json-1@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-api-design-systems": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/0c8f2b77f60ceb100262fe91b9c85e88c6290ba0841522867aaa191bbbf09a61014294837ee14593fe36d6d37db8d4e81b24c5614cd600aaf2015ce2f9ec2b8b + checksum: 10/ec8bd9268b09d3446bb922d881ceab4f52164f995409a305dfa140b9c9790c2f75bf9d59bbc1d6859e1943bc1376ee72a6b7865eaf4b2043795c8576d489ce1b languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-arazzo-yaml-1@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/761380c063b773c16a7f2036eb8f2f5bb8a8850dbaf7cfcfb271e2bd9ba8a957049a63263ce782ced8c481c420aa0995a5833b6d20c07627c46ff26f1db4c180 + checksum: 10/285a55e288475bd20a960fcc90d61bb0b29c8fc586a77ac3ba254c7eacc11db95a964648ae61e8deec20d90bfe32ea5eb11ec8857c6c4b44061c98045be75d5c languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-json-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/4e1842525b04e8992bc1fb5729c27589af8c3fb785b6231b312e159c5aaf1b5d823f5974de6d77d1e9e8941c25ab755d64eac15b7dba5a6c750b98c0ce52648a + checksum: 10/1011a2be2fd576013ae5b725592c49f99dc42c50127d2707dc48893a33eb94a3820f62be6650f5bcbdb987034b5ef150905415eb44c7384a3376da97982bc467 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.11, @swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-json@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" + "@types/ramda": "npm:~0.30.0" + ramda: "npm:~0.30.0" + ramda-adjunct: "npm:^5.0.0" + checksum: 10/c6f28dc27fe796ef3c8440afaa3ce78163e1290fd3c73437541eb629b028d4552537fdeaf29cfd9415774ee2909321289f5c9eb4682e6c5cbf6981ddabaf78b5 + languageName: node + linkType: hard + +"@swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-parser-adapter-json@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-json@npm:1.0.0-beta.48" + dependencies: + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" node-gyp: "npm:latest" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - tree-sitter: "npm:=0.22.1" + tree-sitter: "npm:=0.21.1" tree-sitter-json: "npm:=0.24.8" web-tree-sitter: "npm:=0.24.5" - checksum: 10/5a80f7e83d6b7e26330caf1aef5554f3d87350c1510a31829ee2b0c296d82eacda643247e1cf1628db4ec37c301a87628a130a3aaa4ad3f9e2ff9b71369e96de + checksum: 10/ddb74c62c2a28d359584d385027db17c9630186e6f007e28220379ac27b2875c236b5a748101ff0d46edc46a222287db3ba3e0f43345ce2cf978cda691879b04 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-openapi-json-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/7ab4fb92a517363d5c8711eab3bafd8e425605501ed7f175af4aae23b0e87375bc41c76ba4bd62eb9afb03d18aaa721d0a6d6e2af336eb221e2c00f5181d7cf3 + checksum: 10/c5d4ebfa13c58487626a9b2764995f690db5bbe25de80212d9f216451b20716facb67f3fccae03ed986810d5ecb832756716ba86fcd506b1a3e974aa0e3117dc languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-0@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/3d2f9b0d8792cb590afa1d6ba12166a086db78e7cacc31cf53d1ed8818bb8e55b87d957807632aabd21f2b5c3bd3c25d219730371914d2943edefaa8eea62b3d + checksum: 10/b2e2d71cbb862ec477ebdda8f0e71353c58cef40b1d709ab8cdcea364757f7ffd2643c13a8ff60d0993ffe6a9229deaba6654fea6f3a890730a0b598183de1db languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-openapi-json-3-1@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/4821a09d2305159dac40bc4f0ae7b0ea5e061cc735b8511ef1f189ce897e450f3a0f026689c11fe3c90fdab1bc820c6c40d82606397ad3a63a9b9cd96a5fdbd0 + checksum: 10/a9db188dee99f38e0a91644362e87c526559ddfb35019ed69738a5bebdad645beab925f47d1f0ae2430ca10bd83f329a4007bb2b3b6d23c6fe32d23865fdd672 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/6646978d91369d19ddfc5d9f045cf2c3865b56bf73a3ddc13194bd2ad8d3840ca75beb4c39c13777616ddcf9775a371c44b6ec934f2cf00d62d7c99e68c96803 + checksum: 10/ed29926c1b08108cae294bc100fd279b555731ebc23edba2461e4817f82273003cf650f1eac0d1f2382ad590d76255e23ebf08438c3017ddcec7149e7140761d languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/357a930386a736acfefeca478bc6b115921cdc5df3b469ebc3704d35b84a5a1f92484a124c5dbd4b808e08b01a1afe50054aee95ec4f2787d3c38c1fd6f09d02 + checksum: 10/10d28a60ec9b4197d0c75bf05832c07fc1e8f61f72875ebe1baf328671c53499b51a9c065e1f0310c7c22aa6cb8f51ab2e8ba2692eee2b52f609982e8fe316c5 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:^1.0.0-beta.40 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.11" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.48" "@types/ramda": "npm:~0.30.0" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - checksum: 10/6a81e0b09fc4b8f37f47587d63c6faed2a69773a6e5033914e411db000ff3f293077d29e83dd8c386684a61ee41f243a5f36b45cf349d98ff089c866a19e50e6 + checksum: 10/2f31d09f7aba46b94ad2891097c3e2b880f6f76fab298dbcd794dd42c49fc0d9194f5a73abeb4f3140c4b53deff769f3eddbf16e70a9d764c36cdb24b4998071 languageName: node linkType: hard -"@swagger-api/apidom-parser-adapter-workflows-json-1@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-workflows-json-1@npm:1.0.0-beta.11" +"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.40 <1.0.0-rc.0, @swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.48": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-workflows-1": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.11" - "@types/ramda": "npm:~0.30.0" - ramda: "npm:~0.30.0" - ramda-adjunct: "npm:^5.0.0" - checksum: 10/76b15d74a32428b88efa9cad007e8814e4e5e88e6019228077175cd084fcc500011097f8cc309557d925d1569c3eed51de21d93d07a645f84138ee19aaf4f3d1 - languageName: node - linkType: hard - -"@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-workflows-yaml-1@npm:1.0.0-beta.11" - dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-ns-workflows-1": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.11" - "@types/ramda": "npm:~0.30.0" - ramda: "npm:~0.30.0" - ramda-adjunct: "npm:^5.0.0" - checksum: 10/5a621d7bf92a9f513a9eaa13f5f03c05825a1e4d4f3d9b4d210ae39b69728bfa73bff3b66f582eed48d80970f9068dcf53ea6f86eec92f72ac94542cf589161f - languageName: node - linkType: hard - -"@swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.11, @swagger-api/apidom-parser-adapter-yaml-1-2@npm:^1.0.0-beta.3 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-parser-adapter-yaml-1-2@npm:1.0.0-beta.11" - dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-ast": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.11" - "@tree-sitter-grammars/tree-sitter-yaml": "npm:=0.7.0" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-ast": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@tree-sitter-grammars/tree-sitter-yaml": "npm:=0.7.1" "@types/ramda": "npm:~0.30.0" node-gyp: "npm:latest" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" - tree-sitter: "npm:=0.22.1" + tree-sitter: "npm:=0.22.4" web-tree-sitter: "npm:=0.24.5" - checksum: 10/dbac6b4f61b38d30234c8e4f446938d9fa547ee40a43a4abc73df1a10d58bac0ee0c6fa372a1719b285957ab2adf0d56eda97f683e2de7c1f5ce7739db11ee5b + checksum: 10/c032b088ffef50e119fb9cb60e7a6edfc17ec09e40c6d5ee62f5561c4da806f29ef5ba850f701763c755491f323754c23bb5a07da0cbbd3ed7d673caf5364559 languageName: node linkType: hard -"@swagger-api/apidom-reference@npm:>=1.0.0-beta.11 <1.0.0-rc.0": - version: 1.0.0-beta.11 - resolution: "@swagger-api/apidom-reference@npm:1.0.0-beta.11" +"@swagger-api/apidom-reference@npm:>=1.0.0-beta.41 <1.0.0-rc.0": + version: 1.0.0-beta.48 + resolution: "@swagger-api/apidom-reference@npm:1.0.0-beta.48" dependencies: - "@babel/runtime-corejs3": "npm:^7.20.7" - "@swagger-api/apidom-core": "npm:^1.0.0-beta.11" - "@swagger-api/apidom-error": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-ns-workflows-1": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-json-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-workflows-json-1": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "npm:^1.0.0-beta.3 <1.0.0-rc.0" - "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.3 <1.0.0-rc.0" + "@babel/runtime-corejs3": "npm:^7.26.10" + "@swagger-api/apidom-core": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-error": "npm:^1.0.0-beta.48" + "@swagger-api/apidom-json-pointer": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-arazzo-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-asyncapi-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-json": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "npm:^1.0.0-beta.40 <1.0.0-rc.0" + "@swagger-api/apidom-parser-adapter-yaml-1-2": "npm:^1.0.0-beta.40 <1.0.0-rc.0" "@types/ramda": "npm:~0.30.0" - axios: "npm:^1.7.4" + axios: "npm:^1.9.0" minimatch: "npm:^7.4.3" process: "npm:^0.11.10" ramda: "npm:~0.30.0" ramda-adjunct: "npm:^5.0.0" dependenciesMeta: - "@swagger-api/apidom-error": - optional: true "@swagger-api/apidom-json-pointer": optional: true + "@swagger-api/apidom-ns-arazzo-1": + optional: true "@swagger-api/apidom-ns-asyncapi-2": optional: true "@swagger-api/apidom-ns-openapi-2": @@ -18979,12 +18968,14 @@ __metadata: optional: true "@swagger-api/apidom-ns-openapi-3-1": optional: true - "@swagger-api/apidom-ns-workflows-1": - optional: true "@swagger-api/apidom-parser-adapter-api-design-systems-json": optional: true "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": optional: true + "@swagger-api/apidom-parser-adapter-arazzo-json-1": + optional: true + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": + optional: true "@swagger-api/apidom-parser-adapter-asyncapi-json-2": optional: true "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": @@ -19003,22 +18994,27 @@ __metadata: optional: true "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": optional: true - "@swagger-api/apidom-parser-adapter-workflows-json-1": - optional: true - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": - optional: true "@swagger-api/apidom-parser-adapter-yaml-1-2": optional: true - checksum: 10/1ae856fd2d13884f8f063421c010f166da1602075ae3b08c041c98199c724615b389110672e2c1b129b7b551a21b8738d32df87c066cc105669a03b6b21897e6 + checksum: 10/fd86401690a3992123783c1b6044cdbb4a36b75d437e2519f6ec092d1b03273be45e884fc426e27a9413484047d40f819751f4f7174d9625de8a52a28d2d9e35 languageName: node linkType: hard -"@swaggerexpert/cookie@npm:^1.4.1": - version: 1.4.1 - resolution: "@swaggerexpert/cookie@npm:1.4.1" +"@swaggerexpert/cookie@npm:^2.0.2": + version: 2.0.2 + resolution: "@swaggerexpert/cookie@npm:2.0.2" dependencies: apg-lite: "npm:^1.0.3" - checksum: 10/936590cb70fb7af4ec988e7ee7c5e965b66d09046d3fd2b52c140f9777cda1452f2f24d80eb64ff9678b79f566dd0ef51699050aea9c9a3fd5345dcc73a3fa7a + checksum: 10/cd13848c944d381007a7d15955d5bdf261e956a8d825a9b0847d5ab37e9898082f11aaa558e324e0400be1cf03c408c14935c02150d9987da9bd3ff5b2982974 + languageName: node + linkType: hard + +"@swaggerexpert/json-pointer@npm:^2.10.1": + version: 2.10.2 + resolution: "@swaggerexpert/json-pointer@npm:2.10.2" + dependencies: + apg-lite: "npm:^1.0.4" + checksum: 10/3280d803804811c13c0dab27e57d362f0d6161a0e1fae6e335a227ca8e913f332a4e6ba3af7faeab70cc3d44357f9c5322d816f31b399ee6b383d9cd5abc829d languageName: node linkType: hard @@ -19364,19 +19360,19 @@ __metadata: languageName: node linkType: hard -"@tree-sitter-grammars/tree-sitter-yaml@npm:=0.7.0": - version: 0.7.0 - resolution: "@tree-sitter-grammars/tree-sitter-yaml@npm:0.7.0" +"@tree-sitter-grammars/tree-sitter-yaml@npm:=0.7.1": + version: 0.7.1 + resolution: "@tree-sitter-grammars/tree-sitter-yaml@npm:0.7.1" dependencies: - node-addon-api: "npm:^8.3.0" + node-addon-api: "npm:^8.3.1" node-gyp: "npm:latest" node-gyp-build: "npm:^4.8.4" peerDependencies: - tree-sitter: ^0.22.1 + tree-sitter: ^0.22.4 peerDependenciesMeta: tree-sitter: optional: true - checksum: 10/43cc2d98b084ee5301752f698b1f381008dd0d7aa9ee55390d78a7edf667c503c4f96d8839fe7bde0f4ddfb39c36c56da5b00ec2161e9e2d87a81e4a08a64419 + checksum: 10/870a1a807be7756607bec8d4c399713f94076174fdf694f035f4f6b2d7178bd6cca94a25a2b45b76ef45eb64c49d22c350fdd92acd55f2d6830a2cf771ccade3 languageName: node linkType: hard @@ -21255,10 +21251,10 @@ __metadata: languageName: node linkType: hard -"@types/use-sync-external-store@npm:^0.0.3": - version: 0.0.3 - resolution: "@types/use-sync-external-store@npm:0.0.3" - checksum: 10/161ddb8eec5dbe7279ac971531217e9af6b99f7783213566d2b502e2e2378ea19cf5e5ea4595039d730aa79d3d35c6567d48599f69773a02ffcff1776ec2a44e +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: 10/a95ce330668501ad9b1c5b7f2b14872ad201e552a0e567787b8f1588b22c7040c7c3d80f142cbb9f92d13c4ea41c46af57a20f2af4edf27f224d352abcfe4049 languageName: node linkType: hard @@ -24142,7 +24138,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.0.0, axios@npm:^1.12.0, axios@npm:^1.6.0, axios@npm:^1.7.4, axios@npm:^1.8.3": +"axios@npm:^1.0.0, axios@npm:^1.12.0, axios@npm:^1.6.0, axios@npm:^1.7.4, axios@npm:^1.8.3, axios@npm:^1.9.0": version: 1.12.2 resolution: "axios@npm:1.12.2" dependencies: @@ -26451,10 +26447,10 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.30.2": - version: 3.31.0 - resolution: "core-js-pure@npm:3.31.0" - checksum: 10/8862bc3af702d61e141ebd902242f04b960a5654559692dda1c007eda274aa0158fdb895c279f98584041876055817386a3fbad1c18154113b086635da7e0881 +"core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.43.0": + version: 3.45.1 + resolution: "core-js-pure@npm:3.45.1" + checksum: 10/8c5091695fc9c5d9c45774f1a6dcd1bdc5fcf96e55749d93a40c09b9cf23dbaa72e72da187833ba93d80f67080d9d6c88f8f2256d30e9a9d20a12838f024aba1 languageName: node linkType: hard @@ -28079,10 +28075,15 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:=3.1.6": - version: 3.1.6 - resolution: "dompurify@npm:3.1.6" - checksum: 10/036844bc9b717b172ba27f5863b56f950289a05d8eebfb702d6953bbf80bd021e480ce4217bd084567186f2d0ada13358ce5556963492cfe402d774e8667f120 +"dompurify@npm:=3.2.4": + version: 3.2.4 + resolution: "dompurify@npm:3.2.4" + dependencies: + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: 10/98570c53385518a2f9b617f796926338856acfdd3369c88b5905bddf96bd7d391bf8a5433127155e0046e6faa2bfb767185fcd571b865dfabe624c099e2537f5 languageName: node linkType: hard @@ -30760,7 +30761,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^2.3.2, form-data@npm:^2.5.0": +"form-data@npm:^2.5.0": version: 2.5.5 resolution: "form-data@npm:2.5.5" dependencies: @@ -33949,15 +33950,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-form-data@npm:^2.0.0": - version: 2.0.0 - resolution: "isomorphic-form-data@npm:2.0.0" - dependencies: - form-data: "npm:^2.3.2" - checksum: 10/234bfaa1ed037b1d6cf659eb7a5806889f1f60bc4c7effe5f54e52506004604a9d7229a03a8f9656a1a7ea5fcedca4342277083e38f88ff910b64eefa97dd95e - languageName: node - linkType: hard - "isomorphic-git@npm:^1.23.0": version: 1.27.2 resolution: "isomorphic-git@npm:1.27.2" @@ -38665,12 +38657,12 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^8.2.1, node-addon-api@npm:^8.2.2, node-addon-api@npm:^8.3.0": - version: 8.3.0 - resolution: "node-addon-api@npm:8.3.0" +"node-addon-api@npm:^8.0.0, node-addon-api@npm:^8.2.2, node-addon-api@npm:^8.3.0, node-addon-api@npm:^8.3.1": + version: 8.5.0 + resolution: "node-addon-api@npm:8.5.0" dependencies: node-gyp: "npm:latest" - checksum: 10/b1c2218e794c149011d8f14e5f14b2ffd5f260c08b2982d4163a0f881069dc390458de7703602b9940a1130c1ad87c3f9d35cd7bb116e2f2a134ac0a0c0036ca + checksum: 10/9a893f4f835fbc3908e0070f7bcacf36e37fd06be8008409b104c30df4092a0d9a29927b3a74cdbc1d34338274ba4116d597a41f573e06c29538a1a70d07413f languageName: node linkType: hard @@ -38755,7 +38747,7 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.8.2, node-gyp-build@npm:^4.8.4": +"node-gyp-build@npm:^4.8.0, node-gyp-build@npm:^4.8.2, node-gyp-build@npm:^4.8.4": version: 4.8.4 resolution: "node-gyp-build@npm:4.8.4" bin: @@ -39627,12 +39619,12 @@ __metadata: languageName: node linkType: hard -"openapi-path-templating@npm:^2.0.1": - version: 2.1.0 - resolution: "openapi-path-templating@npm:2.1.0" +"openapi-path-templating@npm:^2.2.1": + version: 2.2.1 + resolution: "openapi-path-templating@npm:2.2.1" dependencies: apg-lite: "npm:^1.0.4" - checksum: 10/de3ba30a19cc4bed5ace5dad0314bea66e09689001bd3510224a441f7ced53d854655daea846f884ed024d90a8f2af2d4bd0f28256dbda0c49b337684a802da1 + checksum: 10/2bd900d761d80e04d19be8bab91a1a3b99902e9c2e38254da605bef5c48184f015f23a766cb16447549120a73bee4ffabf2dfc2702f3278c9ddd18f33866cd7b languageName: node linkType: hard @@ -39646,7 +39638,7 @@ __metadata: languageName: node linkType: hard -"openapi-server-url-templating@npm:^1.2.0": +"openapi-server-url-templating@npm:^1.3.0": version: 1.3.0 resolution: "openapi-server-url-templating@npm:1.3.0" dependencies: @@ -41621,7 +41613,14 @@ __metadata: languageName: node linkType: hard -"prismjs@npm:^1.27.0, prismjs@npm:~1.27.0": +"prismjs@npm:^1.30.0": + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: 10/6b48a2439a82e5c6882f48ebc1564c3890e16463ba17ac10c3ad4f62d98dea5b5c915b172b63b83023a70ad4f5d7be3e8a60304420db34a161fae69dd4e3e2da + languageName: node + linkType: hard + +"prismjs@npm:~1.27.0": version: 1.27.0 resolution: "prismjs@npm:1.27.0" checksum: 10/dc83e2e09170b53526182f5435fae056fc200b109cac39faa88eb48d992311c7f59b94990318962fa93299190a9b33a404920ed150e5b364ce48c897f2ba1e8e @@ -42071,12 +42070,12 @@ __metadata: languageName: node linkType: hard -"ramda-adjunct@npm:^5.0.0": - version: 5.0.1 - resolution: "ramda-adjunct@npm:5.0.1" +"ramda-adjunct@npm:^5.0.0, ramda-adjunct@npm:^5.1.0": + version: 5.1.0 + resolution: "ramda-adjunct@npm:5.1.0" peerDependencies: ramda: ">= 0.30.0" - checksum: 10/f59d2420945b1539706da806f5c0f9c4fdf4f68a5c985b3310f09c583feca7fa5583dd371ad8d71094e9ce441e0bc56fdf65a8c31f28887c06791f44822bf67c + checksum: 10/71abdb121ba127f9306306a85d1f1c5854d6932139d90680300cdd7b6e912996e0b24460f7227c6b2be1f7d5f8204814bc62930a11a1421922ac03be51120e7a languageName: node linkType: hard @@ -42759,22 +42758,22 @@ __metadata: languageName: node linkType: hard -"react-redux@npm:^9.1.2": - version: 9.1.2 - resolution: "react-redux@npm:9.1.2" +"react-redux@npm:^9.2.0": + version: 9.2.0 + resolution: "react-redux@npm:9.2.0" dependencies: - "@types/use-sync-external-store": "npm:^0.0.3" - use-sync-external-store: "npm:^1.0.0" + "@types/use-sync-external-store": "npm:^0.0.6" + use-sync-external-store: "npm:^1.4.0" peerDependencies: - "@types/react": ^18.2.25 - react: ^18.0 + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 redux: ^5.0.0 peerDependenciesMeta: "@types/react": optional: true redux: optional: true - checksum: 10/319b3286f538da7e609ca90fc6762ffae007c5cf75e525a25237ac2feaee63d9cf76fe766817de1fc8f27e7bde825ca409c463037d26dd8e57c435d383f80c50 + checksum: 10/b3d2f89f469169475ab0a9f8914d54a336ac9bc6a31af6e8dcfe9901e6fe2cfd8c1a3f6ce7a2f7f3e0928a93fbab833b668804155715598b7f2ad89927d3ff50 languageName: node linkType: hard @@ -42999,19 +42998,19 @@ __metadata: languageName: node linkType: hard -"react-syntax-highlighter@npm:^15.4.5, react-syntax-highlighter@npm:^15.5.0": - version: 15.6.1 - resolution: "react-syntax-highlighter@npm:15.6.1" +"react-syntax-highlighter@npm:^15.4.5, react-syntax-highlighter@npm:^15.6.1": + version: 15.6.6 + resolution: "react-syntax-highlighter@npm:15.6.6" dependencies: "@babel/runtime": "npm:^7.3.1" highlight.js: "npm:^10.4.1" highlightjs-vue: "npm:^1.0.0" lowlight: "npm:^1.17.0" - prismjs: "npm:^1.27.0" + prismjs: "npm:^1.30.0" refractor: "npm:^3.6.0" peerDependencies: react: ">= 0.14.0" - checksum: 10/9a89c81f7dcc109b038dc2a73189fa1ea916e6485d8a39856ab3d01d2c753449b5ae1c0df9c9ee0ed5c8c9808a68422b19af9a168ec091a274bddc7ad092eb86 + checksum: 10/8b7e60bc7df7218248e17dfc3c44b8f45cd9e363a763477753d5c39242910ff822180db59098e1cc74d0d2ced54ed1ca79a32d67e1afa0c8227ca918a7e0c692 languageName: node linkType: hard @@ -43415,13 +43414,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 10/6c19495baefcf5fbb18a281b56a97f0197b5f219f42e571e80877f095320afac0bdb31dab8f8186858e6126950068c3f17a1226437881e3e70446ea66751897c - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.3": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -44785,7 +44777,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8, sha.js@npm:^2.4.9": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.12, sha.js@npm:^2.4.8, sha.js@npm:^2.4.9": version: 2.4.12 resolution: "sha.js@npm:2.4.12" dependencies: @@ -44874,13 +44866,13 @@ __metadata: languageName: node linkType: hard -"short-unique-id@npm:^5.0.2": - version: 5.0.3 - resolution: "short-unique-id@npm:5.0.3" +"short-unique-id@npm:^5.3.2": + version: 5.3.2 + resolution: "short-unique-id@npm:5.3.2" bin: short-unique-id: bin/short-unique-id suid: bin/short-unique-id - checksum: 10/b2c8777953650a2ad455b04e07d1c792736bf3cedcfa1a97be613834f6c6ea9c4459e23020fff3e98470db77278fc78cbf6a35408806d28362d59e1a351ee10b + checksum: 10/cd15e46009b9e84700ae305568c00f83322e58531555c6e7031f363ff4204bc88361fe62bf480688261cf2b91794a7806ecaddd682004d33d2a0d328efa0f248 languageName: node linkType: hard @@ -46330,44 +46322,44 @@ __metadata: languageName: node linkType: hard -"swagger-client@npm:^3.34.0": - version: 3.34.0 - resolution: "swagger-client@npm:3.34.0" +"swagger-client@npm:^3.35.5": + version: 3.35.6 + resolution: "swagger-client@npm:3.35.6" dependencies: "@babel/runtime-corejs3": "npm:^7.22.15" "@scarf/scarf": "npm:=1.4.0" - "@swagger-api/apidom-core": "npm:>=1.0.0-beta.11 <1.0.0-rc.0" - "@swagger-api/apidom-error": "npm:>=1.0.0-beta.11 <1.0.0-rc.0" - "@swagger-api/apidom-json-pointer": "npm:>=1.0.0-beta.11 <1.0.0-rc.0" - "@swagger-api/apidom-ns-openapi-3-1": "npm:>=1.0.0-beta.11 <1.0.0-rc.0" - "@swagger-api/apidom-reference": "npm:>=1.0.0-beta.11 <1.0.0-rc.0" - "@swaggerexpert/cookie": "npm:^1.4.1" + "@swagger-api/apidom-core": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-error": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-json-pointer": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-ns-openapi-3-1": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swagger-api/apidom-reference": "npm:>=1.0.0-beta.41 <1.0.0-rc.0" + "@swaggerexpert/cookie": "npm:^2.0.2" deepmerge: "npm:~4.3.0" fast-json-patch: "npm:^3.0.0-1" js-yaml: "npm:^4.1.0" neotraverse: "npm:=0.6.18" node-abort-controller: "npm:^3.1.1" node-fetch-commonjs: "npm:^3.3.2" - openapi-path-templating: "npm:^2.0.1" - openapi-server-url-templating: "npm:^1.2.0" + openapi-path-templating: "npm:^2.2.1" + openapi-server-url-templating: "npm:^1.3.0" ramda: "npm:^0.30.1" - ramda-adjunct: "npm:^5.0.0" - checksum: 10/ed89c44ba172abb9cd6a36a189cf2810ef9b1983cb71657772ede94ea804105b07549b90ba36bbead87e4ac71e609b51f0977d9f9c90112952756c7f4f8bde82 + ramda-adjunct: "npm:^5.1.0" + checksum: 10/fb6582dc45c2ae6a26ae4cc80f0a3d97e31f3b058676951f93670828f2f30f5d44ecd7c029465f5452b251a533be329a955c92cec11be7128baa5e2e963e6f9d languageName: node linkType: hard -"swagger-ui-react@npm:^5.0.0": - version: 5.18.3 - resolution: "swagger-ui-react@npm:5.18.3" +"swagger-ui-react@npm:^5.27.1": + version: 5.29.0 + resolution: "swagger-ui-react@npm:5.29.0" dependencies: - "@babel/runtime-corejs3": "npm:^7.24.7" - "@braintree/sanitize-url": "npm:=7.0.4" + "@babel/runtime-corejs3": "npm:^7.27.1" "@scarf/scarf": "npm:=1.4.0" base64-js: "npm:^1.5.1" + buffer: "npm:^6.0.3" classnames: "npm:^2.5.1" css.escape: "npm:1.5.1" deep-extend: "npm:0.6.0" - dompurify: "npm:=3.1.6" + dompurify: "npm:=3.2.4" ieee754: "npm:^1.2.1" immutable: "npm:^3.x.x" js-file-download: "npm:^0.4.12" @@ -46381,23 +46373,23 @@ __metadata: react-immutable-proptypes: "npm:2.2.0" react-immutable-pure-component: "npm:^2.2.0" react-inspector: "npm:^6.0.1" - react-redux: "npm:^9.1.2" - react-syntax-highlighter: "npm:^15.5.0" + react-redux: "npm:^9.2.0" + react-syntax-highlighter: "npm:^15.6.1" redux: "npm:^5.0.1" redux-immutable: "npm:^4.0.0" remarkable: "npm:^2.0.1" reselect: "npm:^5.1.1" serialize-error: "npm:^8.1.0" - sha.js: "npm:^2.4.11" - swagger-client: "npm:^3.34.0" + sha.js: "npm:^2.4.12" + swagger-client: "npm:^3.35.5" url-parse: "npm:^1.5.10" xml: "npm:=1.0.1" xml-but-prettier: "npm:^1.0.1" zenscroll: "npm:^4.0.2" peerDependencies: - react: ">=16.8.0 <19" - react-dom: ">=16.8.0 <19" - checksum: 10/4437fc3fd9a869ab3ef357c78137e20fc9d96dbc71332e9ac53b45decd41382c9467d610ebf0c15a628485c67475a8f89c37882ca548305d633e2dd4b632db5f + react: ">=16.8.0 <20" + react-dom: ">=16.8.0 <20" + checksum: 10/994a7b06b17fe12693a7a09057161723f5e2ab2c80c747879951a54f0d7a0cd4c65c139bdaf229f13d61f5dd61c2b63218881fc23081ced0cc91745b48d806d5 languageName: node linkType: hard @@ -47128,14 +47120,25 @@ __metadata: languageName: node linkType: hard -"tree-sitter@npm:=0.22.1": - version: 0.22.1 - resolution: "tree-sitter@npm:0.22.1" +"tree-sitter@npm:=0.21.1": + version: 0.21.1 + resolution: "tree-sitter@npm:0.21.1" dependencies: - node-addon-api: "npm:^8.2.1" + node-addon-api: "npm:^8.0.0" node-gyp: "npm:latest" - node-gyp-build: "npm:^4.8.2" - checksum: 10/fd3aac9bd375adc626a6990cdf538b00fffbb7a8c8f11351b012830ca8fa67fcb646659b88b6cbae01286333735f4881cf9007f326fc9613837d449fac4fccce + node-gyp-build: "npm:^4.8.0" + checksum: 10/6656208333de86542e73b14e040fbbdf2c0bce7cf0d6422db401963efb1ab1b31ff7d941c973e714c28838dd5f7257b75c6d55778c6751922c3dea123da6a334 + languageName: node + linkType: hard + +"tree-sitter@npm:=0.22.4": + version: 0.22.4 + resolution: "tree-sitter@npm:0.22.4" + dependencies: + node-addon-api: "npm:^8.3.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.8.4" + checksum: 10/f228a9e1cf0160e5737019d0ce28e561feaaed650c3168603314b72234ba871512d298a4a87de51271e28186eda730634f0e167e4b64473111821696ce35437f languageName: node linkType: hard @@ -48396,7 +48399,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.0.0, use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.4.0": +"use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.4.0": version: 1.4.0 resolution: "use-sync-external-store@npm:1.4.0" peerDependencies: From 6981ae6bb5c9ded15a24e6c2d8e7222960281a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Tue, 16 Sep 2025 23:08:07 +0200 Subject: [PATCH 028/177] Fixed DependencyGraph size issue, causing it not to adapt to the container size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gustaf Räntilä --- .changeset/public-sites-admire.md | 6 ++ .../DependencyGraph/DependencyGraph.tsx | 64 ++++++++++++++----- .../EntityRelationsGraph.tsx | 1 + 3 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 .changeset/public-sites-admire.md diff --git a/.changeset/public-sites-admire.md b/.changeset/public-sites-admire.md new file mode 100644 index 0000000000..aa6d245527 --- /dev/null +++ b/.changeset/public-sites-admire.md @@ -0,0 +1,6 @@ +--- +'@backstage/core-components': patch +'@backstage/plugin-catalog-graph': patch +--- + +Fixed DependencyGraph svg size not adapting to the container size diff --git a/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx b/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx index 411a0e2c57..85e6d9ef3f 100644 --- a/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx +++ b/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx @@ -22,6 +22,8 @@ import { useRef, useState, } from 'react'; +import useMeasure from 'react-use/esm/useMeasure'; +import { once } from 'lodash'; import * as d3Zoom from 'd3-zoom'; import * as d3Selection from 'd3-selection'; import useTheme from '@material-ui/core/styles/useTheme'; @@ -41,11 +43,18 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; import { coreComponentsTranslationRef } from '../../translation'; const useStyles = makeStyles((theme: Theme) => ({ + fullscreenButton: { + position: 'absolute', + right: 0, + }, root: { overflow: 'hidden', minHeight: '100%', minWidth: '100%', }, + fixedHeight: { + height: '100%', + }, fullscreen: { backgroundColor: theme.palette.background.paper, }, @@ -268,9 +277,11 @@ export function DependencyGraph( const maxWidth = Math.max(graphWidth, containerWidth); const maxHeight = Math.max(graphHeight, containerHeight); - const minHeight = Math.min(graphHeight, containerHeight); - const scalableHeight = fit === 'grow' ? maxHeight : minHeight; + const [_measureRef] = useMeasure(); + const measureRef = once(_measureRef); + + const scalableHeight = fit === 'grow' ? maxHeight : containerHeight; const containerRef = useMemo( () => @@ -278,6 +289,8 @@ export function DependencyGraph( if (!root) { return; } + measureRef(root); + // Set up zooming + panning const node: SVGSVGElement = root.querySelector( `svg#${DEPENDENCY_GRAPH_SVG}`, @@ -328,7 +341,7 @@ export function DependencyGraph( setContainerHeight(newContainerHeight); } }, 100), - [containerHeight, containerWidth, maxWidth, maxHeight, zoom], + [measureRef, containerHeight, containerWidth, maxWidth, maxHeight, zoom], ); const setNodesAndEdges = useCallback(() => { @@ -431,28 +444,43 @@ export function DependencyGraph( updateGraph, ]); - function setNode(id: string, node: Types.DependencyNode) { - graph.current.setNode(id, node); - updateGraph(); - return graph.current; - } + const setNode = useCallback( + (id: string, node: Types.DependencyNode) => { + graph.current.setNode(id, node); + updateGraph(); + return graph.current; + }, + [updateGraph], + ); - function setEdge(id: dagre.Edge, edge: Types.DependencyEdge) { - graph.current.setEdge(id, edge); - updateGraph(); - return graph.current; - } + const setEdge = useCallback( + (id: dagre.Edge, edge: Types.DependencyEdge) => { + graph.current.setEdge(id, edge); + updateGraph(); + return graph.current; + }, + [updateGraph], + ); return ( -
+
{allowFullscreen && ( (
); } + +function combineClasses(...classes: (string | false | undefined)[]) { + return classes.filter(c => !!c).join(' '); +} diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx index f77ca4b37d..17b5861173 100644 --- a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx +++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx @@ -158,6 +158,7 @@ export const EntityRelationsGraph = (props: EntityRelationsGraphProps) => { renderLabel={renderLabel || DefaultRenderLabel} direction={direction} className={classes.graph} + fit="contain" paddingX={theme.spacing(4)} paddingY={theme.spacing(4)} labelPosition={DependencyGraphTypes.LabelPosition.RIGHT} From 3d09bb218aa4c565cfa4ab6a1b3f1500a8556d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Edeg=C3=A5rd?= Date: Wed, 17 Sep 2025 11:30:28 +0000 Subject: [PATCH 029/177] Adds username as optional config in order to send with a different username than the Slack App have. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Henrik Edegård --- .changeset/heavy-cooks-divide.md | 5 + docs/notifications/processors.md | 1 + .../lib/SlackNotificationProcessor.test.ts | 291 ++++++++++++++++++ .../src/lib/SlackNotificationProcessor.ts | 15 +- .../src/lib/util.ts | 4 +- 5 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 .changeset/heavy-cooks-divide.md diff --git a/.changeset/heavy-cooks-divide.md b/.changeset/heavy-cooks-divide.md new file mode 100644 index 0000000000..181cd01075 --- /dev/null +++ b/.changeset/heavy-cooks-divide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend-module-slack': minor +--- + +Adds username as optional config in order to send Slack notifications with a specific username in the case when using one Slack App for more than just Backstage. diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md index ad3e427364..c25b669ed6 100644 --- a/docs/notifications/processors.md +++ b/docs/notifications/processors.md @@ -148,6 +148,7 @@ notifications: - token: xoxb-XXXXXXXXX broadcastChannels: # Optional, if you wish to support broadcast notifications. - C12345678 + username: 'Backstage Bot' # Optional, defaults to the name of the Slack App. ``` Multiple instances can be added in the `slack` array, allowing you to have multiple configurations if you need to send diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts index 45a74cee70..c970aec7ba 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts @@ -542,6 +542,297 @@ describe('SlackNotificationProcessor', () => { }); }); + describe('when username is configured', () => { + it('should include username in group messages', async () => { + const slack = new WebClient(); + const usernameConfig = mockServices.rootConfig({ + data: { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + slack: [ + { + token: 'mock-token', + username: 'BackstageBot', + }, + ], + }, + }, + }, + }); + + const processor = SlackNotificationProcessor.fromConfig(usernameConfig, { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'entity', entityRef: 'group:default/mock' }, + payload: { title: 'notification' }, + }); + + expect(slack.chat.postMessage).toHaveBeenCalledWith({ + channel: 'C12345678', + text: 'notification', + username: 'BackstageBot', + attachments: [ + { + color: '#00A699', + blocks: [ + { + type: 'section', + text: { + text: 'No description provided', + type: 'mrkdwn', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'View More', + }, + action_id: 'button-action', + }, + }, + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Severity: normal', + emoji: true, + }, + { + type: 'plain_text', + text: 'Topic: N/A', + emoji: true, + }, + ], + }, + ], + fallback: 'notification', + }, + ], + }); + }); + + it('should include username in direct user messages', async () => { + const slack = new WebClient(); + const usernameConfig = mockServices.rootConfig({ + data: { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + slack: [ + { + token: 'mock-token', + username: 'BackstageBot', + }, + ], + }, + }, + }, + }); + + const processor = SlackNotificationProcessor.fromConfig(usernameConfig, { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { + title: 'notification', + link: '/catalog/user/default/jane.doe', + }, + }, + { + recipients: { type: 'entity', entityRef: 'user:default/mock' }, + payload: { title: 'notification' }, + }, + ); + + expect(slack.chat.postMessage).toHaveBeenCalledWith({ + channel: 'U12345678', + text: 'notification', + username: 'BackstageBot', + attachments: [ + { + color: '#00A699', + blocks: [ + { + type: 'section', + text: { + text: 'No description provided', + type: 'mrkdwn', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'View More', + }, + action_id: 'button-action', + }, + }, + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Severity: normal', + emoji: true, + }, + { + type: 'plain_text', + text: 'Topic: N/A', + emoji: true, + }, + ], + }, + ], + fallback: 'notification', + }, + ], + }); + }); + + it('should include username in broadcast messages', async () => { + const slack = new WebClient(); + const usernameAndBroadcastConfig = mockServices.rootConfig({ + data: { + app: { + baseUrl: 'https://example.org', + }, + notifications: { + processors: { + slack: [ + { + token: 'mock-token', + username: 'BackstageBot', + broadcastChannels: ['C12345678'], + }, + ], + }, + }, + }, + }); + + const processor = SlackNotificationProcessor.fromConfig( + usernameAndBroadcastConfig, + { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + }, + )[0]; + + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: null, + created: new Date(), + payload: { + title: 'notification', + link: '/catalog/user/default/jane.doe', + }, + }, + { + recipients: { type: 'broadcast' }, + payload: { title: 'notification' }, + }, + ); + + expect(slack.chat.postMessage).toHaveBeenCalledWith({ + channel: 'C12345678', + text: 'notification', + username: 'BackstageBot', + attachments: [ + { + color: '#00A699', + blocks: [ + { + type: 'section', + text: { + text: 'No description provided', + type: 'mrkdwn', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'View More', + }, + action_id: 'button-action', + }, + }, + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Severity: normal', + emoji: true, + }, + { + type: 'plain_text', + text: 'Topic: N/A', + emoji: true, + }, + ], + }, + ], + fallback: 'notification', + }, + ], + }); + }); + }); + + describe('when username is not configured', () => { + it('should not include username in messages', async () => { + const slack = new WebClient(); + + const processor = SlackNotificationProcessor.fromConfig(config, { + auth, + logger, + catalog: catalogServiceMock({ + entities: DEFAULT_ENTITIES_RESPONSE.items, + }), + slack, + })[0]; + + await processor.processOptions({ + recipients: { type: 'entity', entityRef: 'group:default/mock' }, + payload: { title: 'notification' }, + }); + + const calls = (slack.chat.postMessage as jest.Mock).mock.calls; + expect(calls).toHaveLength(1); + expect(calls[0][0]).not.toHaveProperty('username'); + }); + }); + describe('when replacing user entity refs with Slack IDs', () => { const createBaseMessage = (text: string) => ({ channel: 'U12345678', diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts index f7dbc6a93e..f050b3b677 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts @@ -49,6 +49,7 @@ export class SlackNotificationProcessor implements NotificationProcessor { private readonly messagesFailed: Counter; private readonly broadcastChannels?: string[]; private readonly entityLoader: DataLoader; + private readonly username?: string; static fromConfig( config: Config, @@ -66,9 +67,11 @@ export class SlackNotificationProcessor implements NotificationProcessor { const token = c.getString('token'); const slack = options.slack ?? new WebClient(token); const broadcastChannels = c.getOptionalStringArray('broadcastChannels'); + const username = c.getOptionalString('username'); return new SlackNotificationProcessor({ slack, broadcastChannels, + username, ...options, }); }); @@ -80,13 +83,16 @@ export class SlackNotificationProcessor implements NotificationProcessor { logger: LoggerService; catalog: CatalogService; broadcastChannels?: string[]; + username?: string; }) { - const { auth, catalog, logger, slack, broadcastChannels } = options; + const { auth, catalog, logger, slack, broadcastChannels, username } = + options; this.logger = logger; this.catalog = catalog; this.auth = auth; this.slack = slack; this.broadcastChannels = broadcastChannels; + this.username = username; this.entityLoader = new DataLoader( async entityRefs => { @@ -206,6 +212,7 @@ export class SlackNotificationProcessor implements NotificationProcessor { const payload = toChatPostMessageArgs({ channel, payload: options.payload, + ...(this.username && { username: this.username }), }); this.logger.debug( @@ -261,7 +268,11 @@ export class SlackNotificationProcessor implements NotificationProcessor { options.payload, ); const outbound = destinations.map(channel => - toChatPostMessageArgs({ channel, payload: formattedPayload }), + toChatPostMessageArgs({ + channel, + payload: formattedPayload, + ...(this.username && { username: this.username }), + }), ); // Log debug info diff --git a/plugins/notifications-backend-module-slack/src/lib/util.ts b/plugins/notifications-backend-module-slack/src/lib/util.ts index 24f9f6a964..1116218b09 100644 --- a/plugins/notifications-backend-module-slack/src/lib/util.ts +++ b/plugins/notifications-backend-module-slack/src/lib/util.ts @@ -23,12 +23,14 @@ import { ChatPostMessageArguments, KnownBlock } from '@slack/web-api'; export function toChatPostMessageArgs(options: { channel: string; payload: NotificationPayload; + username?: string; }): ChatPostMessageArguments { - const { channel, payload } = options; + const { channel, payload, username } = options; const args: ChatPostMessageArguments = { channel, text: payload.title, + ...(username && { username }), attachments: [ { color: getColor(payload.severity), From 2100dbfcb14538c48563739f2b7439068445fae4 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 17 Sep 2025 13:40:07 +0100 Subject: [PATCH 030/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 86dbe6477c..5743d27411 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -1,6 +1,7 @@ name: Chromatic on: # NOTE: If you change these you must update verify_storybook-noop.yml as well + workflow_dispatch: pull_request: paths: - '.github/workflows/verify_chromatic.yml' From a418e1961e41439c67426e552eab372b33afe226 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 17 Sep 2025 14:23:29 +0100 Subject: [PATCH 031/177] Fix our Chromatic workflow Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic-noop.yml | 12 ++---------- .github/workflows/verify_chromatic.yml | 12 +++--------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/.github/workflows/verify_chromatic-noop.yml b/.github/workflows/verify_chromatic-noop.yml index 600e8f9bdb..4de52a3258 100644 --- a/.github/workflows/verify_chromatic-noop.yml +++ b/.github/workflows/verify_chromatic-noop.yml @@ -6,16 +6,8 @@ on: pull_request: paths-ignore: - '.github/workflows/verify_chromatic.yml' - - 'storybook/**' - - 'packages/config/src/**' - - 'packages/theme/src/**' - - 'packages/types/src/**' - - 'packages/errors/src/**' - - 'packages/version-bridge/src/**' - - 'packages/test-utils/src/**' - - 'packages/core-app-api/src/**' - - 'packages/core-plugin-api/src/**' - - 'packages/core-components/src/**' + - '.storybook/**' + - 'packages/ui/src/**' - '**/*.stories.tsx' permissions: diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 5743d27411..3926ce60ce 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -2,20 +2,14 @@ name: Chromatic on: # NOTE: If you change these you must update verify_storybook-noop.yml as well workflow_dispatch: + push: + branches: + - master pull_request: paths: - '.github/workflows/verify_chromatic.yml' - '.storybook/**' - 'packages/ui/src/**' - - 'packages/config/src/**' - - 'packages/theme/src/**' - - 'packages/types/src/**' - - 'packages/errors/src/**' - - 'packages/version-bridge/src/**' - - 'packages/test-utils/src/**' - - 'packages/core-app-api/src/**' - - 'packages/core-plugin-api/src/**' - - 'packages/core-components/src/**' - '**/*.stories.tsx' jobs: From c8ec8e52425c830a378acfbd4facaadc0addb2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Wed, 17 Sep 2025 16:11:48 +0200 Subject: [PATCH 032/177] Update .changeset/public-sites-admire.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Gustaf Räntilä --- .changeset/public-sites-admire.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/public-sites-admire.md b/.changeset/public-sites-admire.md index aa6d245527..f5f3304f9f 100644 --- a/.changeset/public-sites-admire.md +++ b/.changeset/public-sites-admire.md @@ -3,4 +3,4 @@ '@backstage/plugin-catalog-graph': patch --- -Fixed DependencyGraph svg size not adapting to the container size +Fixed DependencyGraph `svg` size not adapting to the container size From 65f5a3a84d0e811538ea3bb85a8e026958ee9f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20R=C3=A4ntil=C3=A4?= Date: Wed, 17 Sep 2025 16:16:20 +0200 Subject: [PATCH 033/177] Using 'classnames' instead of custom implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gustaf Räntilä --- .../src/components/DependencyGraph/DependencyGraph.tsx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx b/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx index 85e6d9ef3f..df26bb86fd 100644 --- a/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx +++ b/packages/core-components/src/components/DependencyGraph/DependencyGraph.tsx @@ -23,6 +23,7 @@ import { useState, } from 'react'; import useMeasure from 'react-use/esm/useMeasure'; +import classNames from 'classnames'; import { once } from 'lodash'; import * as d3Zoom from 'd3-zoom'; import * as d3Selection from 'd3-selection'; @@ -465,14 +466,14 @@ export function DependencyGraph( return (
(
); } - -function combineClasses(...classes: (string | false | undefined)[]) { - return classes.filter(c => !!c).join(' '); -} From 9a471252a4fc04bacb596137fac1ac25815f2374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Thu, 18 Sep 2025 10:25:29 +0200 Subject: [PATCH 034/177] fix(ui): improve SearchField component flex layout and animations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed SearchField behavior in Header components - Switched from width-based to flex-basis transitions for better responsive behavior - Added new Storybook stories to test SearchField integration with Header component - Improved icon positioning and padding transitions Signed-off-by: Sofia Sjöblad --- .changeset/tender-cups-tap.md | 5 ++ packages/ui/css/styles.css | 45 ++++++++---- .../SearchField/SearchField.stories.tsx | 71 ++++++++++++++++++- .../SearchField/SearchField.styles.css | 49 +++++++++---- 4 files changed, 139 insertions(+), 31 deletions(-) create mode 100644 .changeset/tender-cups-tap.md diff --git a/.changeset/tender-cups-tap.md b/.changeset/tender-cups-tap.md new file mode 100644 index 0000000000..e95fe2669e --- /dev/null +++ b/.changeset/tender-cups-tap.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Improved SearchField component flex layout and animations. Fixed SearchField behavior in Header components by switching from width-based transitions to flex-basis transitions for better responsive behavior. Added new Storybook stories to test SearchField integration with Header component. diff --git a/packages/ui/css/styles.css b/packages/ui/css/styles.css index 88be061ba5..6fbc7be3a5 100644 --- a/packages/ui/css/styles.css +++ b/packages/ui/css/styles.css @@ -10523,6 +10523,8 @@ } .bui-SearchField { + flex: 1 0; + &[data-empty] { & .bui-InputClear { display: none; @@ -10530,49 +10532,62 @@ } &[data-start-collapsed="true"] { + flex: 0 auto; padding: 0; - transition: width .3s ease-in-out; + transition: flex-basis .3s ease-in-out; + + &[data-collapsed="true"] { + flex-basis: 200px; + } &[data-collapsed="false"] { cursor: pointer; &[data-size="medium"] { - width: 2.5rem; + flex-basis: 2.5rem; height: 2.5rem; } &[data-size="small"] { - width: 2rem; + flex-basis: 2rem; height: 2rem; } &[data-size="medium"] .bui-Input { - padding-left: 0; - &::placeholder { opacity: 0; } } &[data-size="small"] .bui-Input { - padding-left: 0; - &::placeholder { opacity: 0; } } - - &[data-size="small"] .bui-InputIcon { - left: var(--bui-space-2); - } - - &[data-size="medium"] .bui-InputIcon { - left: 10px; - } } } } +.bui-SearchField .bui-Input { + padding-left: var(--bui-space-6); + padding-right: var(--bui-space-1); + transition: padding .3s ease-in-out; +} + +.bui-SearchField .bui-InputIcon { + justify-content: center; + display: flex; + left: 0; + + &[data-size="small"] { + width: var(--bui-space-9); + } + + &[data-size="medium"] { + width: var(--bui-space-10); + } +} + .bui-InputClear { cursor: pointer; color: var(--bui-fg-secondary); diff --git a/packages/ui/src/components/SearchField/SearchField.stories.tsx b/packages/ui/src/components/SearchField/SearchField.stories.tsx index c8867215a1..845b15c1b7 100644 --- a/packages/ui/src/components/SearchField/SearchField.stories.tsx +++ b/packages/ui/src/components/SearchField/SearchField.stories.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { Meta, StoryObj } from '@storybook/react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; import { SearchField } from './SearchField'; import { Form } from 'react-aria-components'; import { Icon } from '../Icon'; @@ -23,6 +23,8 @@ import { FieldLabel } from '../FieldLabel'; import { ButtonIcon } from '../ButtonIcon'; import { RiCactusLine } from '@remixicon/react'; import { Button } from '../Button'; +import { Header } from '../Header'; +import { MemoryRouter } from 'react-router-dom'; const meta = { title: 'Backstage UI/SearchField', @@ -170,6 +172,73 @@ export const StartCollapsed: Story = { ), }; +export const InHeader: Story = { + decorators: [ + Story => ( + + + + ), + ], + render: args => ( + <> +
+ } + size="small" + variant="secondary" + /> + + } + size="small" + variant="secondary" + /> + + } + /> + + ), +}; + +export const StartCollapsedInHeader: Story = { + args: { + ...StartCollapsed.args, + }, + decorators: [ + Story => ( + + + + ), + ], + render: args => ( + <> +
+ } + size="small" + variant="secondary" + /> + + } + size="small" + variant="secondary" + /> + + } + /> + + ), +}; + export const StartCollapsedWithButtons: Story = { args: { ...StartCollapsed.args, diff --git a/packages/ui/src/components/SearchField/SearchField.styles.css b/packages/ui/src/components/SearchField/SearchField.styles.css index 062757f38f..2a505e5f14 100644 --- a/packages/ui/src/components/SearchField/SearchField.styles.css +++ b/packages/ui/src/components/SearchField/SearchField.styles.css @@ -14,7 +14,10 @@ * limitations under the License. */ -.bui-SearchField { + .bui-SearchField { + flex: 1; + flex-shrink: 0; + &[data-empty] { .bui-InputClear { display: none; @@ -22,24 +25,29 @@ } &[data-start-collapsed='true'] { - transition: width 0.3s ease-in-out; + transition: flex-basis 0.3s ease-in-out; padding: 0; + flex: 0 1 auto; + + &[data-collapsed='true'] { + flex-basis: 200px; + } &[data-collapsed='false'] { cursor: pointer; + &[data-size='medium'] { - width: 2.5rem; + flex-basis: 2.5rem; height: 2.5rem; } &[data-size='small'] { - width: 2rem; + flex-basis: 2rem; height: 2rem; } &[data-size='medium'] .bui-Input { - padding-left: 0; &::placeholder { opacity: 0; @@ -47,24 +55,35 @@ } &[data-size='small'] .bui-Input { - padding-left: 0; &::placeholder { opacity: 0; } } - - &[data-size='small'] .bui-InputIcon { - left: var(--bui-space-2); - } - - &[data-size='medium'] .bui-InputIcon { - left: 10px; - } } } } +.bui-SearchField .bui-Input { + padding-left: var(--bui-space-6); + padding-right: var(--bui-space-1); + transition: padding 0.3s ease-in-out; +} + +.bui-SearchField .bui-InputIcon { + left: 0; + display: flex; + justify-content: center; + + &[data-size='small'] { + width: var(--bui-space-9); + } + + &[data-size='medium'] { + width: var(--bui-space-10); + } +} + .bui-InputClear { position: absolute; right: 0; @@ -99,4 +118,4 @@ .bui-InputClear svg { width: 1rem; height: 1rem; -} +} \ No newline at end of file From 2aaf01a0fa38224bc8ce3ace7552cdaa7b0f434a Mon Sep 17 00:00:00 2001 From: Stuart Said Date: Thu, 18 Sep 2025 12:26:04 +0100 Subject: [PATCH 035/177] fix: Counting distinct results for entity facets in search table Signed-off-by: Stuart Said --- .changeset/cold-coats-show.md | 5 ++ .../service/DefaultEntitiesCatalog.test.ts | 46 +++++++++++++++++++ .../src/service/DefaultEntitiesCatalog.ts | 2 +- 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 .changeset/cold-coats-show.md diff --git a/.changeset/cold-coats-show.md b/.changeset/cold-coats-show.md new file mode 100644 index 0000000000..a048ec308c --- /dev/null +++ b/.changeset/cold-coats-show.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fix for duplicate search results in entity-facets API call diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 0b8dec71bb..e9d00f3451 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -2359,6 +2359,52 @@ describe('DefaultEntitiesCatalog', () => { }); }, ); + + it.each(databases.eachSupportedId())( + 'works when the entity is duplicated in search results, %p', + async databaseId => { + await createDatabase(databaseId); + + await addEntityToSearch({ + apiVersion: 'a', + kind: 'k', + metadata: { + name: 'one', + uid: 'uid-a', + }, + spec: {}, + }); + + // Manually insert a duplicate search entry, this shouldn't happen but does in reality + await knex('search').insert([ + { + entity_id: 'uid-a', + key: 'metadata.name', + value: 'one', + original_value: 'one', + }, + ]); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + await expect( + catalog.facets({ + facets: ['metadata.name'], + credentials: mockCredentials.none(), + }), + ).resolves.toEqual({ + facets: { + 'metadata.name': expect.arrayContaining([ + { value: 'one', count: 1 }, + ]), + }, + }); + }, + ); }); }); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 33847ea87b..92c0bb0ecf 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -683,7 +683,7 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .select({ facet: 'search.key', value: 'search.original_value', - count: this.database.raw('count(*)'), + count: this.database.raw('count(DISTINCT search.entity_id)'), }) .groupBy(['search.key', 'search.original_value']); From 84443f16bc1f07c178398b1ca3a9ecee1c64fa07 Mon Sep 17 00:00:00 2001 From: Jonathan Roebuck Date: Thu, 18 Sep 2025 13:37:02 +0100 Subject: [PATCH 036/177] Adds config definitions for Azure Blob Storage in integration and catalog provider Signed-off-by: Jonathan Roebuck --- .changeset/rare-states-pay.md | 6 ++ packages/integration/config.d.ts | 57 +++++++++++++++++++ .../catalog-backend-module-azure/config.d.ts | 18 ++++++ 3 files changed, 81 insertions(+) create mode 100644 .changeset/rare-states-pay.md diff --git a/.changeset/rare-states-pay.md b/.changeset/rare-states-pay.md new file mode 100644 index 0000000000..4f7c639af7 --- /dev/null +++ b/.changeset/rare-states-pay.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/integration': patch +--- + +Adds config definitions for Azure Blob Storage. diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index 4955d0fac3..76af358ccb 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -71,6 +71,63 @@ export interface Config { commitSigningKey?: string; }>; + /** Integration configuration for Azure Blob Storage */ + azureBlobStorage?: Array<{ + /** + * The name of the Azure Storage Account, e.g., "mystorageaccount". + */ + accountName?: string; + + /** + * The primary or secondary key for the Azure Storage Account. + * Only required if connectionString or SAS token are not specified. + */ + accountKey?: string; + + /** + * A Shared Access Signature (SAS) token for limited access to resources. + */ + sasToken?: string; + + /** + * A full connection string for the Azure Storage Account. + * This includes the account name, key, and endpoint details. + */ + connectionString?: string; + + /** + * Optional endpoint suffix for custom domains or sovereign clouds. + * e.g., "core.windows.net" for public Azure or "core.usgovcloudapi.net" for US Government cloud. + */ + endpointSuffix?: string; + + /** + * The host of the target that this matches on, e.g., "blob.core.windows.net". + */ + host: string; + + endpoint?: string; + /** + * Optional credential to use for Azure Active Directory authentication. + */ + aadCredential?: { + /** + * The client ID of the Azure AD application. + */ + clientId: string; + + /** + * The tenant ID for Azure AD. + */ + tenantId: string; + + /** + * The client secret for the Azure AD application. + */ + clientSecret: string; + }; + }>; + /** * Integration configuration for Bitbucket * @deprecated replaced by bitbucketCloud and bitbucketServer diff --git a/plugins/catalog-backend-module-azure/config.d.ts b/plugins/catalog-backend-module-azure/config.d.ts index 50af529907..511588fb73 100644 --- a/plugins/catalog-backend-module-azure/config.d.ts +++ b/plugins/catalog-backend-module-azure/config.d.ts @@ -55,6 +55,24 @@ export interface Config { schedule?: SchedulerServiceTaskScheduleDefinitionConfig; }; }; + /** + * AzureBlobEntityProvider configuration + */ + azureBlob?: + | { + [name: string]: { + id: string; + containerName: string; + accountName: string; + schedule?: SchedulerServiceTaskScheduleDefinitionConfig; + }; + } + | { + id: string; + containerName: string; + accountName: string; + schedule?: SchedulerServiceTaskScheduleDefinitionConfig; + }; }; }; } From b937a11d2e9c4daf6080bc9140d85d8941911b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Thu, 18 Sep 2025 14:57:39 +0200 Subject: [PATCH 037/177] fix(ui): add smooth border animations and improve SearchField styling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- packages/ui/css/styles.css | 27 ++++++++++++++--- .../SearchField/SearchField.styles.css | 30 +++++++++++++++---- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/packages/ui/css/styles.css b/packages/ui/css/styles.css index 6fbc7be3a5..8aa99175b3 100644 --- a/packages/ui/css/styles.css +++ b/packages/ui/css/styles.css @@ -10564,14 +10564,33 @@ opacity: 0; } } + + & .bui-InputWrapper { + & .bui-Input[data-icon] { + padding-right: 0; + } + } } } } .bui-SearchField .bui-Input { - padding-left: var(--bui-space-6); - padding-right: var(--bui-space-1); - transition: padding .3s ease-in-out; + transition: padding .3s ease-in-out, border-color .2s ease-in-out, outline-color .2s ease-in-out; + + &[data-hovered] { + border-color: var(--bui-border-hover); + } + + &[data-focused] { + border-color: var(--bui-border-pressed); + outline-width: 0; + } +} + +.bui-SearchField .bui-InputWrapper { + & .bui-Input[data-icon] { + padding-right: var(--bui-space-6); + } } .bui-SearchField .bui-InputIcon { @@ -10580,7 +10599,7 @@ left: 0; &[data-size="small"] { - width: var(--bui-space-9); + width: var(--bui-space-8); } &[data-size="medium"] { diff --git a/packages/ui/src/components/SearchField/SearchField.styles.css b/packages/ui/src/components/SearchField/SearchField.styles.css index 2a505e5f14..b56bc0efd5 100644 --- a/packages/ui/src/components/SearchField/SearchField.styles.css +++ b/packages/ui/src/components/SearchField/SearchField.styles.css @@ -14,7 +14,7 @@ * limitations under the License. */ - .bui-SearchField { +.bui-SearchField { flex: 1; flex-shrink: 0; @@ -60,14 +60,34 @@ opacity: 0; } } + + .bui-InputWrapper { + .bui-Input[data-icon] { + padding-right: 0px; + } + } } } } .bui-SearchField .bui-Input { - padding-left: var(--bui-space-6); - padding-right: var(--bui-space-1); - transition: padding 0.3s ease-in-out; + + transition: padding 0.3s ease-in-out, border-color 0.2s ease-in-out, outline-color 0.2s ease-in-out; + + &[data-hovered] { + border-color: var(--bui-border-hover); + } + + &[data-focused] { + border-color: var(--bui-border-pressed); + outline-width: 0px; + } +} + +.bui-SearchField .bui-InputWrapper { + .bui-Input[data-icon] { + padding-right: var(--bui-space-6); + } } .bui-SearchField .bui-InputIcon { @@ -76,7 +96,7 @@ justify-content: center; &[data-size='small'] { - width: var(--bui-space-9); + width: var(--bui-space-8); } &[data-size='medium'] { From 4c1d163c8709b67bd5b93c35b0521ce6da7cd780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Thu, 18 Sep 2025 15:58:51 +0200 Subject: [PATCH 038/177] chore: fix prettier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- .../ui/src/components/SearchField/SearchField.styles.css | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/components/SearchField/SearchField.styles.css b/packages/ui/src/components/SearchField/SearchField.styles.css index b56bc0efd5..a13c455b44 100644 --- a/packages/ui/src/components/SearchField/SearchField.styles.css +++ b/packages/ui/src/components/SearchField/SearchField.styles.css @@ -36,7 +36,6 @@ &[data-collapsed='false'] { cursor: pointer; - &[data-size='medium'] { flex-basis: 2.5rem; height: 2.5rem; @@ -48,14 +47,12 @@ } &[data-size='medium'] .bui-Input { - &::placeholder { opacity: 0; } } &[data-size='small'] .bui-Input { - &::placeholder { opacity: 0; } @@ -71,8 +68,8 @@ } .bui-SearchField .bui-Input { - - transition: padding 0.3s ease-in-out, border-color 0.2s ease-in-out, outline-color 0.2s ease-in-out; + transition: padding 0.3s ease-in-out, border-color 0.2s ease-in-out, + outline-color 0.2s ease-in-out; &[data-hovered] { border-color: var(--bui-border-hover); @@ -138,4 +135,4 @@ .bui-InputClear svg { width: 1rem; height: 1rem; -} \ No newline at end of file +} From 938973cdf3c2ccc340ed36f8591cf07362f2900b Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Thu, 18 Sep 2025 15:57:24 +0100 Subject: [PATCH 039/177] Fix Storybook types issues Signed-off-by: Charles de Dreuille --- ...storybook-react-npm-9.1.5-2331f18b6b.patch | 35 ---- package.json | 13 +- packages/ui/package.json | 4 +- yarn.lock | 154 ++++++++---------- 4 files changed, 76 insertions(+), 130 deletions(-) delete mode 100644 .yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch diff --git a/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch b/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch deleted file mode 100644 index b8fb44001f..0000000000 --- a/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git a/dist/preview.d.ts b/dist/preview.d.ts -index 73525b5fe07240d27733b59362cf2076cd28a6ed..0420e6b170a65b6d0db64fcfcfa07b68cd851942 100644 ---- a/dist/preview.d.ts -+++ b/dist/preview.d.ts -@@ -174,7 +174,7 @@ type UnionToIntersection = ( - declare function __definePreview[]>(input: { - addons: Addons; - } & ProjectAnnotations>): ReactPreview>; --interface ReactPreview extends Preview { -+interface ReactPreview extends Omit, 'meta'> { - meta, TMetaArgs extends Partial>(meta: { - render?: ArgsStoryFn; - component?: ComponentType; -@@ -187,16 +187,13 @@ interface ReactPreview extends Preview { - }>; - } - type DecoratorsArgs = UnionToIntersection ? TArgs : unknown>; --interface ReactMeta> extends Meta { -+interface ReactMeta extends Omit>, 'story'> { - story ReactTypes['storyResult']) | (StoryAnnotations & { - render: () => ReactTypes['storyResult']; -- })>(story?: TInput): ReactStory ReactTypes['storyResult'] ? { -- render: TInput; -- } : TInput>; -- story, SetOptional>>>(story?: TInput): ReactStory; -+ })>(story?: TInput): ReactStory; -+ story(story?: TInput): ReactStory; - } --interface ReactStory> extends Story { -+interface ReactStory { - Component: ComponentType>; - } -- - export { ReactPreview, ReactStory, __definePreview }; -\ No newline at end of file diff --git a/package.json b/package.json index 69e30f5cc9..5904f0f305 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,6 @@ "@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch", "@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", "@material-ui/pickers@^3.3.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch", - "@storybook/react@npm:9.1.5": "patch:@storybook/react@npm%3A9.1.5#~/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@yarnpkg/plugin-npm@npm:^3.1.0": "patch:@yarnpkg/plugin-npm@npm%3A3.1.0#~/.yarn/patches/@yarnpkg-plugin-npm-npm-3.1.0-6533d0f5a1.patch", @@ -135,11 +134,11 @@ "@octokit/rest": "^19.0.3", "@playwright/test": "^1.32.3", "@spotify/eslint-plugin": "^15.0.0", - "@storybook/addon-a11y": "^9.1.5", - "@storybook/addon-docs": "^9.1.5", - "@storybook/addon-links": "^9.1.5", - "@storybook/addon-themes": "^9.1.5", - "@storybook/react-vite": "^9.1.5", + "@storybook/addon-a11y": "^9.1.7", + "@storybook/addon-docs": "^9.1.7", + "@storybook/addon-links": "^9.1.7", + "@storybook/addon-themes": "^9.1.7", + "@storybook/react-vite": "^9.1.7", "@techdocs/cli": "workspace:*", "@types/cacheable-request": "^8.3.6", "@types/memjs": "^1.3.3", @@ -164,7 +163,7 @@ "shx": "^0.4.0", "sloc": "^0.3.1", "sort-package-json": "^2.8.0", - "storybook": "^9.1.5", + "storybook": "^9.1.7", "typedoc": "^0.28.0", "typescript": "~5.7.0", "vite": "^7.1.5" diff --git a/packages/ui/package.json b/packages/ui/package.json index c0a0e7c143..80192895d9 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -49,7 +49,7 @@ "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "chalk": "^5.4.1", - "eslint-plugin-storybook": "^9.1.5", + "eslint-plugin-storybook": "^9.1.7", "glob": "^11.0.1", "globals": "^15.11.0", "lightningcss": "^1.29.1", @@ -57,7 +57,7 @@ "react": "^18.0.2", "react-dom": "^18.0.2", "react-router-dom": "^6.3.0", - "storybook": "^9.1.5" + "storybook": "^9.1.7" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", diff --git a/yarn.lock b/yarn.lock index e606b8246d..483bd8e5b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7542,7 +7542,7 @@ __metadata: "@types/react-dom": "npm:^18.0.0" chalk: "npm:^5.4.1" clsx: "npm:^2.1.1" - eslint-plugin-storybook: "npm:^9.1.5" + eslint-plugin-storybook: "npm:^9.1.7" glob: "npm:^11.0.1" globals: "npm:^15.11.0" lightningcss: "npm:^1.29.1" @@ -7551,7 +7551,7 @@ __metadata: react-aria-components: "npm:^1.10.1" react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.3.0" - storybook: "npm:^9.1.5" + storybook: "npm:^9.1.7" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -18321,82 +18321,82 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:^9.1.5": - version: 9.1.6 - resolution: "@storybook/addon-a11y@npm:9.1.6" +"@storybook/addon-a11y@npm:^9.1.7": + version: 9.1.7 + resolution: "@storybook/addon-a11y@npm:9.1.7" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^9.1.6 - checksum: 10/345c44673ccede4073e7415eb7c73f7817cb64b24b75d6f2edae73a0a6e50cc91e098a48dfd55996188aeb04d308c147b6d660bcdd4e5449d601271a83d4f178 + storybook: ^9.1.7 + checksum: 10/d62a623d3e185acef3ff6b1471db8f72d46685e3e612628f442193b35b12dc0e110ff197d0125a3e6749497917e703feaa047068aab6c37572e2dc0aa04fcc0f languageName: node linkType: hard -"@storybook/addon-docs@npm:^9.1.5": - version: 9.1.5 - resolution: "@storybook/addon-docs@npm:9.1.5" +"@storybook/addon-docs@npm:^9.1.7": + version: 9.1.7 + resolution: "@storybook/addon-docs@npm:9.1.7" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:9.1.5" + "@storybook/csf-plugin": "npm:9.1.7" "@storybook/icons": "npm:^1.4.0" - "@storybook/react-dom-shim": "npm:9.1.5" + "@storybook/react-dom-shim": "npm:9.1.7" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.5 - checksum: 10/dcc2ed8df4593044667fc2a3bc62be2e6f7395e002eabee218d5376c0d0b38684508988823b5c75973a315ae1821d365879494c52e0c17daa814d9c0992c7ac3 + storybook: ^9.1.7 + checksum: 10/89a26ba462c2f7498159fecb6f66a47fbc68675f80906b10420594553c10de0ad871429f3124efb0cefd06bc8ceca3f12c17334d6e796bf7f094b4c29fd61aae languageName: node linkType: hard -"@storybook/addon-links@npm:^9.1.5": - version: 9.1.5 - resolution: "@storybook/addon-links@npm:9.1.5" +"@storybook/addon-links@npm:^9.1.7": + version: 9.1.7 + resolution: "@storybook/addon-links@npm:9.1.7" dependencies: "@storybook/global": "npm:^5.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.5 + storybook: ^9.1.7 peerDependenciesMeta: react: optional: true - checksum: 10/c33630c61a4bbbc74ddfa5f2c9dc5abe310d0de39064df739f4b441208b4df0900edd800ecd8b275f3613a9a8412f8f250dc322ec7fc5aa7aad8c6cf94efae3f + checksum: 10/487f3055ce1a87984794d195fdf8eb4c19c5c8263dc94d16fde310eb97a9785b311b81d5bc8ce07e31a8b0a7cff29eb58f718152b87b5746ec0f529c021f698b languageName: node linkType: hard -"@storybook/addon-themes@npm:^9.1.5": - version: 9.1.5 - resolution: "@storybook/addon-themes@npm:9.1.5" +"@storybook/addon-themes@npm:^9.1.7": + version: 9.1.7 + resolution: "@storybook/addon-themes@npm:9.1.7" dependencies: ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.5 - checksum: 10/c214cbfe5c94a9c58d0240f6009c62dc3189164dae19679d5503fe8cbf2603cfcf9b58cb500be63c6d92897563cbccef63b9413f14513b1be9f51f8c5b60438e + storybook: ^9.1.7 + checksum: 10/3a57c3b2265e775c2fc0cee3c8f4b3189915c9dc8001f74351d427094739501112842fb02e94893c3290aec0bdea64fbc00374b8f7095da39765844ae51c5df3 languageName: node linkType: hard -"@storybook/builder-vite@npm:9.1.5": - version: 9.1.5 - resolution: "@storybook/builder-vite@npm:9.1.5" +"@storybook/builder-vite@npm:9.1.7": + version: 9.1.7 + resolution: "@storybook/builder-vite@npm:9.1.7" dependencies: - "@storybook/csf-plugin": "npm:9.1.5" + "@storybook/csf-plugin": "npm:9.1.7" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.5 + storybook: ^9.1.7 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10/adf191098abd4685a9451cc9a4da17ecde59e6be951c049add6ab379c26325710d2f15e4191709029b055560bbf59e2845225b85f8d1fd49c1a0d04e82e4d57f + checksum: 10/f285896e8103ded0c81d1b89d500179e83088b6d1e82b9deca9b5e03b209b68c89d5735ffc0a3a5ac30a3f4c847b361de0289523f0a39c0585fbc82d516c298e languageName: node linkType: hard -"@storybook/csf-plugin@npm:9.1.5": - version: 9.1.5 - resolution: "@storybook/csf-plugin@npm:9.1.5" +"@storybook/csf-plugin@npm:9.1.7": + version: 9.1.7 + resolution: "@storybook/csf-plugin@npm:9.1.7" dependencies: unplugin: "npm:^1.3.1" peerDependencies: - storybook: ^9.1.5 - checksum: 10/f86e178a51d9ea72903392767a7f2fdef98074e251ef90ef50035c9b74f40d9cc62d4ff74079b5e9e0aa9d68d337559beea77f3458ba928b379bfdedda2e5258 + storybook: ^9.1.7 + checksum: 10/d90d3b410c74e893d0b51179fd1357fba0df7410da4e04b55c373705eca7e48bad4e2062be9a201b0c764b3821a7208b06bc5469e00079ee8b00b86d6fbb6f4e languageName: node linkType: hard @@ -18417,25 +18417,25 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:9.1.5": - version: 9.1.5 - resolution: "@storybook/react-dom-shim@npm:9.1.5" +"@storybook/react-dom-shim@npm:9.1.7": + version: 9.1.7 + resolution: "@storybook/react-dom-shim@npm:9.1.7" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.5 - checksum: 10/8aa85b15a2d5584da0af285e52cf78b132fc772846cc2d4369349ecf6d966331ee05a8162c5b1ecf42acefe8d9659f7e0f7cfdd2e1230dc983cb989eefcfb7fe + storybook: ^9.1.7 + checksum: 10/3d909506dea4f1927698ca3f9d9d49680d4d3f7fb8f14125f5f9a2f1a0a4fca4759f82ef29fbeb5afc50aabb8f66179a4ea6409ccb91c294aba8701028c61d08 languageName: node linkType: hard -"@storybook/react-vite@npm:^9.1.5": - version: 9.1.5 - resolution: "@storybook/react-vite@npm:9.1.5" +"@storybook/react-vite@npm:^9.1.7": + version: 9.1.7 + resolution: "@storybook/react-vite@npm:9.1.7" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:9.1.5" - "@storybook/react": "npm:9.1.5" + "@storybook/builder-vite": "npm:9.1.7" + "@storybook/react": "npm:9.1.7" find-up: "npm:^7.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -18444,45 +18444,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.5 + storybook: ^9.1.7 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10/77ed64e8187636299b6b7de1a4db96aa2fed8b5be5cee844bbdeeab64b4b231aeb5c6bc5b84014983da095a4e3be782e5ea167126e7867c26d7c5d47263b20be + checksum: 10/6e676ef8c34179d2cad2afb5c952130bd770d362828f5a10481d44a13e0938c34843d2a3914921acd539adf1c0d5c2108881344a6d68bc3a5d4baf55d4b0a317 languageName: node linkType: hard -"@storybook/react@npm:9.1.5": - version: 9.1.5 - resolution: "@storybook/react@npm:9.1.5" +"@storybook/react@npm:9.1.7": + version: 9.1.7 + resolution: "@storybook/react@npm:9.1.7" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:9.1.5" + "@storybook/react-dom-shim": "npm:9.1.7" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.5 + storybook: ^9.1.7 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10/a5b80438976011498998035b6cffb513246dfd6852b035639212a89f8a9114b16757803ce750feb863393af0b9f47ff170d202c5341b083ee4440663976f2939 - languageName: node - linkType: hard - -"@storybook/react@patch:@storybook/react@npm%3A9.1.5#~/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch": - version: 9.1.5 - resolution: "@storybook/react@patch:@storybook/react@npm%3A9.1.5#~/.yarn/patches/@storybook-react-npm-9.1.5-2331f18b6b.patch::version=9.1.5&hash=8c1145" - dependencies: - "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:9.1.5" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.5 - typescript: ">= 4.9.x" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/17edd1c58208ca26ed805656fadda3b0797a995afc0d64005ce50b4383dc1b3bbfead2c9c4523f1450ee7b82570b0302acadedb17ea3d8aeacfb1b66f7f436d1 + checksum: 10/691b4204e0fa405e071b77996c9ee18c17250733c6239b6f7361d3803f8da90a4fc7288364dea841aaa0ad1a78f931589ec443fdaf2bfe6ad340856648251c4e languageName: node linkType: hard @@ -29241,15 +29223,15 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:^9.1.5": - version: 9.1.5 - resolution: "eslint-plugin-storybook@npm:9.1.5" +"eslint-plugin-storybook@npm:^9.1.7": + version: 9.1.7 + resolution: "eslint-plugin-storybook@npm:9.1.7" dependencies: "@typescript-eslint/utils": "npm:^8.8.1" peerDependencies: eslint: ">=8" - storybook: ^9.1.5 - checksum: 10/e852f8e667f056b07a47182bc2d6e931469e27087df099da3340cfedd61e5bb6e529e0e7c793d1eab318214d34f0ac9c437f96bf1df92e9b3eada39d2a6d2839 + storybook: ^9.1.7 + checksum: 10/9e8d82bf504bc40cac67ce62dd9213cb672240a1c4184a702eb7c027290cd3604239fd3663a1c985b2569f4e9cab1cd1cf57dcb7d3b3dba119d8d42dfb509925 languageName: node linkType: hard @@ -44153,11 +44135,11 @@ __metadata: "@octokit/rest": "npm:^19.0.3" "@playwright/test": "npm:^1.32.3" "@spotify/eslint-plugin": "npm:^15.0.0" - "@storybook/addon-a11y": "npm:^9.1.5" - "@storybook/addon-docs": "npm:^9.1.5" - "@storybook/addon-links": "npm:^9.1.5" - "@storybook/addon-themes": "npm:^9.1.5" - "@storybook/react-vite": "npm:^9.1.5" + "@storybook/addon-a11y": "npm:^9.1.7" + "@storybook/addon-docs": "npm:^9.1.7" + "@storybook/addon-links": "npm:^9.1.7" + "@storybook/addon-themes": "npm:^9.1.7" + "@storybook/react-vite": "npm:^9.1.7" "@techdocs/cli": "workspace:*" "@types/cacheable-request": "npm:^8.3.6" "@types/global-agent": "npm:^2.1.3" @@ -44184,7 +44166,7 @@ __metadata: shx: "npm:^0.4.0" sloc: "npm:^0.3.1" sort-package-json: "npm:^2.8.0" - storybook: "npm:^9.1.5" + storybook: "npm:^9.1.7" typedoc: "npm:^0.28.0" typescript: "npm:~5.7.0" vite: "npm:^7.1.5" @@ -45619,9 +45601,9 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^9.1.5": - version: 9.1.5 - resolution: "storybook@npm:9.1.5" +"storybook@npm:^9.1.7": + version: 9.1.7 + resolution: "storybook@npm:9.1.7" dependencies: "@storybook/global": "npm:^5.0.0" "@testing-library/jest-dom": "npm:^6.6.3" @@ -45642,7 +45624,7 @@ __metadata: optional: true bin: storybook: ./bin/index.cjs - checksum: 10/bf205e9daacbb3570484480a8c3ad0ef36e5cbbecde50126a579678b79194ececd598823e5747ee8a77f6a71ff82a4994f7540ed4d15adae30d66f13928f118c + checksum: 10/3ad9a953d1c54249153c7928e970d41f9b7ce376649f5a07f71c622b0b524784955c8d11afca8903e712c28655cce7c94d9e2b5f094ceb883d284ffdcd5f0d01 languageName: node linkType: hard From eebc042cab9d8012f46911f47d8daaeaee83c176 Mon Sep 17 00:00:00 2001 From: Julio Fernandez Date: Thu, 18 Sep 2025 17:20:59 +0200 Subject: [PATCH 040/177] Add new plugin (KwrithLog) Signed-off-by: Julio Fernandez --- microsite/data/plugins/kwirthlog.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 microsite/data/plugins/kwirthlog.yaml diff --git a/microsite/data/plugins/kwirthlog.yaml b/microsite/data/plugins/kwirthlog.yaml new file mode 100644 index 0000000000..49863c2d4e --- /dev/null +++ b/microsite/data/plugins/kwirthlog.yaml @@ -0,0 +1,10 @@ +--- +title: KwirthLog for Backstage +author: Julio Fernandez +authorUrl: https://github.com/jfvilas +category: Monitoring +description: With KwirthLog you can view real-time log streams of Kubernetes objects linked to Backstage entities (source entities can be grouped and merged) +documentation: https://github.com/jfvilas/plugin-kwirth-log +iconUrl: https://raw.githubusercontent.com/jfvilas/plugin-kwirth-log/master/src/assets/kwirthlog-logo.png +npmPackageName: '@jfvilas/plugin-kwirth-log' +addedDate: '2025-09-18' From d2f44726ac3c04cbf41491434a0a910332b4e391 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Thu, 18 Sep 2025 18:26:37 +0100 Subject: [PATCH 041/177] Add Chromatic bot Signed-off-by: Charles de Dreuille --- .github/workflows/chromatic-pr-comment.yml | 144 +++++++++++++++++++++ .github/workflows/verify_chromatic.yml | 10 ++ 2 files changed, 154 insertions(+) create mode 100644 .github/workflows/chromatic-pr-comment.yml diff --git a/.github/workflows/chromatic-pr-comment.yml b/.github/workflows/chromatic-pr-comment.yml new file mode 100644 index 0000000000..82af73f8eb --- /dev/null +++ b/.github/workflows/chromatic-pr-comment.yml @@ -0,0 +1,144 @@ +name: Chromatic PR Comment + +on: + workflow_run: + workflows: + - 'Chromatic' + types: + - completed + +jobs: + post-chromatic-comment: + name: Post Chromatic Results + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' }} + permissions: + contents: read + pull-requests: write + steps: + - name: Harden Runner + uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 + with: + disable-sudo: true + egress-policy: block + allowed-endpoints: > + api.github.com:443 + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Get PR number + id: pr + run: | + # Extract PR number from the workflow run event + PR_NUMBER=$(echo '${{ github.event.workflow_run.head_branch }}' | grep -o 'pull/[0-9]*' | cut -d'/' -f2 || echo '') + if [ -z "$PR_NUMBER" ]; then + # Fallback: try to get from the workflow run name or other sources + PR_NUMBER=$(echo '${{ github.event.workflow_run.display_title }}' | grep -o '#[0-9]*' | cut -d'#' -f2 || echo '') + fi + echo "pr-number=$PR_NUMBER" >> $GITHUB_OUTPUT + echo "PR Number: $PR_NUMBER" + + - name: Get Chromatic URL from workflow run + id: chromatic-url + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + // Get the workflow run details + const workflowRun = await github.rest.actions.getWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + + // Get the jobs for this workflow run + const jobs = await github.rest.actions.listJobsForWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + + // Find the chromatic job + const chromaticJob = jobs.data.jobs.find(job => job.name === 'Chromatic'); + if (!chromaticJob) { + console.log('Chromatic job not found'); + return; + } + + // Get the job steps + const jobSteps = await github.rest.actions.getJobForWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + job_id: chromaticJob.id, + }); + + console.log('Chromatic job steps:', jobSteps.data.steps.map(step => ({ name: step.name, conclusion: step.conclusion }))); + + // Look for the Chromatic step output + // The Chromatic action typically outputs the URL in the step logs + // We'll need to parse the logs to extract the URL + const logs = await github.rest.actions.downloadJobLogsForWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + job_id: chromaticJob.id, + }); + + const logText = Buffer.from(logs.data, 'base64').toString('utf-8'); + console.log('Log text length:', logText.length); + + // Extract Chromatic URL from logs + const urlMatch = logText.match(/https:\/\/[a-zA-Z0-9.-]*chromatic\.com\/builds\/[a-zA-Z0-9-]+/); + if (urlMatch) { + console.log('Found Chromatic URL:', urlMatch[0]); + core.setOutput('url', urlMatch[0]); + } else { + console.log('No Chromatic URL found in logs'); + // Look for alternative patterns + const altMatch = logText.match(/View your changes at: (https:\/\/[^\s]+)/); + if (altMatch) { + console.log('Found alternative Chromatic URL:', altMatch[1]); + core.setOutput('url', altMatch[1]); + } + } + + - name: Find existing Chromatic comment + if: steps.chromatic-url.outputs.url + uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3 + id: find-comment + with: + issue-number: ${{ steps.pr.outputs.pr-number }} + comment-author: 'github-actions[bot]' + body-includes: '🎨 Chromatic Visual Testing' + direction: last + + - name: Create or Update Chromatic Comment + if: steps.chromatic-url.outputs.url + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ steps.find-comment.outputs.comment-id }} + issue-number: ${{ steps.pr.outputs.pr-number }} + body: | + ## 🎨 Chromatic Visual Testing + + Visual testing has completed successfully! You can view the results and any visual changes at: + + **🔗 [View Chromatic Build](${{ steps.chromatic-url.outputs.url }})** + + --- + *This comment is automatically updated when visual tests run.* + edit-mode: replace + + - name: Create comment if no URL found + if: steps.chromatic-url.outputs.url == '' + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + issue-number: ${{ steps.pr.outputs.pr-number }} + body: | + ## 🎨 Chromatic Visual Testing + + Visual testing completed, but the Chromatic URL could not be extracted from the workflow logs. + + Please check the [Chromatic workflow run](https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}) for details. + + --- + *This comment is automatically updated when visual tests run.* diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 3926ce60ce..29bf843678 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -48,6 +48,7 @@ jobs: run: yarn build-storybook:chromatic - name: Run Chromatic + id: chromatic uses: chromaui/action@latest with: token: ${{ secrets.GITHUB_TOKEN }} @@ -56,3 +57,12 @@ jobs: projectToken: chpt_dab72dc0f97d55b storybookBuildDir: dist-storybook onlyChanged: true + + - name: Post Chromatic Link in PR Comment + if: github.event_name == 'pull_request' && steps.chromatic.outputs.url + uses: dannyhw/storybook-chromatic-link-comment@v0.11 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + review-url: ${{ steps.chromatic.outputs.url }} + build-url: ${{ steps.chromatic.outputs.buildUrl }} + storybook-url: ${{ steps.chromatic.outputs.storybookUrl }} From 3f731d5bff137d18d130ee0f8a93b59be063d112 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Thu, 18 Sep 2025 18:31:05 +0100 Subject: [PATCH 042/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 29bf843678..7a7e2d99b7 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -31,7 +31,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - fetch-depth: 0 # Required to retrieve git history + fetch-depth: 500 # Required to retrieve git history - name: Use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 From be63eb80565861b534f09f287766d1afc1859c87 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 07:06:21 +0100 Subject: [PATCH 043/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 7a7e2d99b7..69e9a502a7 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -60,9 +60,19 @@ jobs: - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url - uses: dannyhw/storybook-chromatic-link-comment@v0.11 + uses: mshick/add-pr-comment@v2 with: - github-token: ${{ secrets.GITHUB_TOKEN }} - review-url: ${{ steps.chromatic.outputs.url }} - build-url: ${{ steps.chromatic.outputs.buildUrl }} - storybook-url: ${{ steps.chromatic.outputs.storybookUrl }} + message: | + ## 🎨 Visual Testing Results + + Your visual changes have been tested with Chromatic! Here are the results: + + | 🔗 Link | Description | + |---------|-------------| + | [**Review Changes**](${{ steps.chromatic.outputs.url }}) | View visual diffs and approve/reject changes | + | [**Build Details**](${{ steps.chromatic.outputs.buildUrl }}) | See detailed build information | + | [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) | Browse the interactive component library | + + --- + *This comment is automatically updated when visual tests run.* + repo-token: ${{ secrets.GITHUB_TOKEN }} From f6b0e241a9632a24b2776c7dc56344a4d002b262 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 07:21:25 +0100 Subject: [PATCH 044/177] Test Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 29 ++++++++++++++++++++ packages/ui/src/components/Button/styles.css | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 69e9a502a7..8eca8f7967 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -58,6 +58,31 @@ jobs: storybookBuildDir: dist-storybook onlyChanged: true + - name: Extract Chromatic Details + if: github.event_name == 'pull_request' && steps.chromatic.outputs.url + id: extract-details + run: | + # Try to extract change count from Chromatic logs + # This is a best-effort approach as the exact log format may vary + echo "Extracting Chromatic details from logs..." + + # Set default values + CHANGES_COUNT="Unknown" + STORIES_COUNT="Unknown" + + # Try to find change count in various log patterns + if [ -f "$GITHUB_WORKSPACE/chromatic-output.log" ]; then + CHANGES_COUNT=$(grep -oP '(\d+)\s+changes?' "$GITHUB_WORKSPACE/chromatic-output.log" | head -1 | grep -oP '\d+' || echo "Unknown") + STORIES_COUNT=$(grep -oP '(\d+)\s+stories?' "$GITHUB_WORKSPACE/chromatic-output.log" | head -1 | grep -oP '\d+' || echo "Unknown") + fi + + # Output the extracted values + echo "changes-count=$CHANGES_COUNT" >> $GITHUB_OUTPUT + echo "stories-count=$STORIES_COUNT" >> $GITHUB_OUTPUT + + echo "Changes detected: $CHANGES_COUNT" + echo "Stories affected: $STORIES_COUNT" + - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url uses: mshick/add-pr-comment@v2 @@ -73,6 +98,10 @@ jobs: | [**Build Details**](${{ steps.chromatic.outputs.buildUrl }}) | See detailed build information | | [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) | Browse the interactive component library | + ### 📊 Build Summary + - **Changes detected**: ${{ steps.extract-details.outputs.changes-count }} + - **Stories affected**: ${{ steps.extract-details.outputs.stories-count }} + --- *This comment is automatically updated when visual tests run.* repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/packages/ui/src/components/Button/styles.css b/packages/ui/src/components/Button/styles.css index 03138a7c44..526a9b010b 100644 --- a/packages/ui/src/components/Button/styles.css +++ b/packages/ui/src/components/Button/styles.css @@ -34,7 +34,7 @@ } .bui-Button[data-variant='primary'] { - background-color: var(--bui-bg-solid); + background-color: red; color: var(--bui-fg-solid); &:hover { From 15ac8dc8ae0632b944593a9ab86a99d9ec728a52 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 07:27:47 +0100 Subject: [PATCH 045/177] Test Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 2 +- packages/ui/css/styles.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 8eca8f7967..c15d67ef12 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -31,7 +31,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - fetch-depth: 500 # Required to retrieve git history + fetch-depth: 0 # Required to retrieve git history - name: Use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 diff --git a/packages/ui/css/styles.css b/packages/ui/css/styles.css index 88be061ba5..c2dec63d32 100644 --- a/packages/ui/css/styles.css +++ b/packages/ui/css/styles.css @@ -9309,8 +9309,8 @@ } .bui-Button[data-variant="primary"] { - background-color: var(--bui-bg-solid); color: var(--bui-fg-solid); + background-color: red; &:hover { background-color: var(--bui-bg-solid-hover); From 43c80bd9a00cb568fb7866a0e1652e40c5e0d429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Fri, 19 Sep 2025 10:17:06 +0200 Subject: [PATCH 046/177] fix(ui): improve ButtonIcon accessibility in SearchField stories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- .../SearchField/SearchField.stories.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/SearchField/SearchField.stories.tsx b/packages/ui/src/components/SearchField/SearchField.stories.tsx index 845b15c1b7..a811d2a451 100644 --- a/packages/ui/src/components/SearchField/SearchField.stories.tsx +++ b/packages/ui/src/components/SearchField/SearchField.stories.tsx @@ -187,12 +187,14 @@ export const InHeader: Story = { customActions={ <> } size="small" variant="secondary" /> } size="small" variant="secondary" @@ -222,12 +224,14 @@ export const StartCollapsedInHeader: Story = { customActions={ <> } size="small" variant="secondary" /> } size="small" variant="secondary" @@ -246,12 +250,22 @@ export const StartCollapsedWithButtons: Story = { render: args => ( - } size="small" variant="secondary" /> + } + size="small" + variant="secondary" + /> - } size="medium" variant="secondary" /> + } + size="medium" + variant="secondary" + /> From be0a22d4f2461d7e39f566d4d7265387416f158c Mon Sep 17 00:00:00 2001 From: Jonathan Roebuck Date: Fri, 19 Sep 2025 09:16:28 +0100 Subject: [PATCH 047/177] add visibility annotations Signed-off-by: Jonathan Roebuck --- packages/integration/config.d.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index 76af358ccb..c85d87144b 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -81,17 +81,20 @@ export interface Config { /** * The primary or secondary key for the Azure Storage Account. * Only required if connectionString or SAS token are not specified. + * @visibility secret */ accountKey?: string; /** * A Shared Access Signature (SAS) token for limited access to resources. + * @visibility secret */ sasToken?: string; /** * A full connection string for the Azure Storage Account. * This includes the account name, key, and endpoint details. + * @visibility secret */ connectionString?: string; @@ -103,12 +106,14 @@ export interface Config { /** * The host of the target that this matches on, e.g., "blob.core.windows.net". + * @visibility frontend */ host: string; endpoint?: string; /** * Optional credential to use for Azure Active Directory authentication. + * @deepVisibility secret */ aadCredential?: { /** From 3407916506a71963e2a3568a90d8b0ea61222cbc Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 09:46:40 +0100 Subject: [PATCH 048/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 49 ++++++++++++-------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index c15d67ef12..4ee27ed50a 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -57,31 +57,7 @@ jobs: projectToken: chpt_dab72dc0f97d55b storybookBuildDir: dist-storybook onlyChanged: true - - - name: Extract Chromatic Details - if: github.event_name == 'pull_request' && steps.chromatic.outputs.url - id: extract-details - run: | - # Try to extract change count from Chromatic logs - # This is a best-effort approach as the exact log format may vary - echo "Extracting Chromatic details from logs..." - - # Set default values - CHANGES_COUNT="Unknown" - STORIES_COUNT="Unknown" - - # Try to find change count in various log patterns - if [ -f "$GITHUB_WORKSPACE/chromatic-output.log" ]; then - CHANGES_COUNT=$(grep -oP '(\d+)\s+changes?' "$GITHUB_WORKSPACE/chromatic-output.log" | head -1 | grep -oP '\d+' || echo "Unknown") - STORIES_COUNT=$(grep -oP '(\d+)\s+stories?' "$GITHUB_WORKSPACE/chromatic-output.log" | head -1 | grep -oP '\d+' || echo "Unknown") - fi - - # Output the extracted values - echo "changes-count=$CHANGES_COUNT" >> $GITHUB_OUTPUT - echo "stories-count=$STORIES_COUNT" >> $GITHUB_OUTPUT - - echo "Changes detected: $CHANGES_COUNT" - echo "Stories affected: $STORIES_COUNT" + externals: packages/ui/**/*.css - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url @@ -99,8 +75,27 @@ jobs: | [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) | Browse the interactive component library | ### 📊 Build Summary - - **Changes detected**: ${{ steps.extract-details.outputs.changes-count }} - - **Stories affected**: ${{ steps.extract-details.outputs.stories-count }} + - **Changes detected**: ${{ steps.chromatic.outputs.changeCount }} + - **Actual capture count**: ${{ steps.chromatic.outputs.actualCaptureCount }} + + --- + + ### 🔧 All Available Chromatic Outputs + + | Output | Value | Description | + |--------|-------|-------------| + | `url` | `${{ steps.chromatic.outputs.url }}` | An alias for the build URL. | + | `buildUrl` | `${{ steps.chromatic.outputs.buildUrl }}` | The build URL. | + | `storybookUrl` | `${{ steps.chromatic.outputs.storybookUrl }}` | The Storybook preview URL for your current branch / Pull Request. | + | `code` | `${{ steps.chromatic.outputs.code }}` | The exit code for the current run of the Chromatic CLI. | + | `actualCaptureCount` | `${{ steps.chromatic.outputs.actualCaptureCount }}` | The number of captured snapshots. | + | `changeCount` | `${{ steps.chromatic.outputs.changeCount }}` | The number of tests with visual changes, including any inherited changes (e.g., due to TurboSnap). | + | `componentCount` | `${{ steps.chromatic.outputs.componentCount }}` | The number of components in the published Storybook. | + | `errorCount` | `${{ steps.chromatic.outputs.errorCount }}` | The number of tests with error(s), including any inherited errors (e.g., due to TurboSnap). | + | `inheritedCaptureCount` | `${{ steps.chromatic.outputs.inheritedCaptureCount }}` | The number of inherited (not captured) snapshots (e.g., due to TurboSnap). | + | `interactionTestFailuresCount` | `${{ steps.chromatic.outputs.interactionTestFailuresCount }}` | The number of stories with interaction test failures. | + | `specCount` | `${{ steps.chromatic.outputs.specCount }}` | The number of stories in the published Storybook. | + | `testCount` | `${{ steps.chromatic.outputs.testCount }}` | The number of tests on the build. | --- *This comment is automatically updated when visual tests run.* From d19c7ac72f05c19cc0f93424a1a5d0b4ea82f7bb Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 09:47:20 +0100 Subject: [PATCH 049/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 4ee27ed50a..d79d760578 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -31,7 +31,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - fetch-depth: 0 # Required to retrieve git history + fetch-depth: 1000 # Required to retrieve git history - name: Use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 From fb627e11852ee3495bf98e83982ded590ad22d7b Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 09:57:07 +0100 Subject: [PATCH 050/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 43 +++++++++++++++----------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index d79d760578..9a88bb462f 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -57,7 +57,22 @@ jobs: projectToken: chpt_dab72dc0f97d55b storybookBuildDir: dist-storybook onlyChanged: true - externals: packages/ui/**/*.css + externals: | + packages/ui/**/*.css + packages/ui/css/** + packages/ui/src/**/*.css + + - name: Debug - Show changed files + if: github.event_name == 'pull_request' + run: | + echo "=== Changed files in this PR ===" + git diff --name-only HEAD~1 HEAD || echo "No previous commit to compare" + echo "" + echo "=== CSS files in packages/ui ===" + find packages/ui -name "*.css" -type f || echo "No CSS files found" + echo "" + echo "=== Recent changes to CSS files ===" + git log --oneline --name-only -10 -- "packages/ui/**/*.css" || echo "No recent CSS changes" - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url @@ -68,19 +83,12 @@ jobs: Your visual changes have been tested with Chromatic! Here are the results: - | 🔗 Link | Description | - |---------|-------------| - | [**Review Changes**](${{ steps.chromatic.outputs.url }}) | View visual diffs and approve/reject changes | - | [**Build Details**](${{ steps.chromatic.outputs.buildUrl }}) | See detailed build information | - | [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) | Browse the interactive component library | + - [**Review Changes**](${{ steps.chromatic.outputs.url }}) - View visual diffs and approve/reject changes + - [**Build Details**](${{ steps.chromatic.outputs.buildUrl }}) - See detailed build information + - [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) - Browse the interactive component library - ### 📊 Build Summary - - **Changes detected**: ${{ steps.chromatic.outputs.changeCount }} - - **Actual capture count**: ${{ steps.chromatic.outputs.actualCaptureCount }} - - --- - - ### 🔧 All Available Chromatic Outputs +
+ 🔧 All Available Chromatic Outputs | Output | Value | Description | |--------|-------|-------------| @@ -93,10 +101,9 @@ jobs: | `componentCount` | `${{ steps.chromatic.outputs.componentCount }}` | The number of components in the published Storybook. | | `errorCount` | `${{ steps.chromatic.outputs.errorCount }}` | The number of tests with error(s), including any inherited errors (e.g., due to TurboSnap). | | `inheritedCaptureCount` | `${{ steps.chromatic.outputs.inheritedCaptureCount }}` | The number of inherited (not captured) snapshots (e.g., due to TurboSnap). | - | `interactionTestFailuresCount` | `${{ steps.chromatic.outputs.interactionTestFailuresCount }}` | The number of stories with interaction test failures. | - | `specCount` | `${{ steps.chromatic.outputs.specCount }}` | The number of stories in the published Storybook. | - | `testCount` | `${{ steps.chromatic.outputs.testCount }}` | The number of tests on the build. | + | `interactionTestFailuresCount` | `${{ steps.chromatic.outputs.interactionTestFailuresCount }}` | The number of stories with interaction test failures. | + | `specCount` | `${{ steps.chromatic.outputs.specCount }}` | The number of stories in the published Storybook. | + | `testCount` | `${{ steps.chromatic.outputs.testCount }}` | The number of tests on the build. | - --- - *This comment is automatically updated when visual tests run.* +
repo-token: ${{ secrets.GITHUB_TOKEN }} From a2904704bc55955d64587ca11699d45643830b86 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 10:45:37 +0100 Subject: [PATCH 051/177] Remove turbosnap Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 13 +++++++++- chromatic.config.js | 35 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 chromatic.config.js diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 9a88bb462f..6adf405f28 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -56,7 +56,7 @@ jobs: # https://www.chromatic.com/docs/custom-ci-provider#run-chromatic-on-external-forks-of-open-source-projects projectToken: chpt_dab72dc0f97d55b storybookBuildDir: dist-storybook - onlyChanged: true + onlyChanged: false externals: | packages/ui/**/*.css packages/ui/css/** @@ -73,6 +73,17 @@ jobs: echo "" echo "=== Recent changes to CSS files ===" git log --oneline --name-only -10 -- "packages/ui/**/*.css" || echo "No recent CSS changes" + echo "" + echo "=== Git diff for CSS files ===" + git diff HEAD~1 HEAD -- "packages/ui/**/*.css" || echo "No CSS changes in diff" + echo "" + echo "=== Chromatic config check ===" + if [ -f "chromatic.config.js" ]; then + echo "chromatic.config.js exists" + cat chromatic.config.js + else + echo "No chromatic.config.js found" + fi - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url diff --git a/chromatic.config.js b/chromatic.config.js new file mode 100644 index 0000000000..a99bf4ecc0 --- /dev/null +++ b/chromatic.config.js @@ -0,0 +1,35 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +module.exports = { + // Force full rebuild when these files change + externals: [ + 'packages/ui/**/*.css', + 'packages/ui/css/**', + 'packages/ui/src/**/*.css', + 'packages/ui/css/styles.css', // Specific file that was changed + 'packages/ui/src/components/Button/styles.css', // Specific file that was changed + ], + + // Additional configuration for better change detection + turboSnap: { + // Force rebuild for CSS changes + externals: [ + 'packages/ui/**/*.css', + 'packages/ui/css/**', + 'packages/ui/src/**/*.css', + ], + }, +}; From adc12bb1ed0eed856db52c91909be160cdd1e5af Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 10:50:03 +0100 Subject: [PATCH 052/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 46 ++++++++++++-------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 6adf405f28..d2a684ec96 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -56,35 +56,12 @@ jobs: # https://www.chromatic.com/docs/custom-ci-provider#run-chromatic-on-external-forks-of-open-source-projects projectToken: chpt_dab72dc0f97d55b storybookBuildDir: dist-storybook - onlyChanged: false + onlyChanged: true externals: | packages/ui/**/*.css packages/ui/css/** packages/ui/src/**/*.css - - name: Debug - Show changed files - if: github.event_name == 'pull_request' - run: | - echo "=== Changed files in this PR ===" - git diff --name-only HEAD~1 HEAD || echo "No previous commit to compare" - echo "" - echo "=== CSS files in packages/ui ===" - find packages/ui -name "*.css" -type f || echo "No CSS files found" - echo "" - echo "=== Recent changes to CSS files ===" - git log --oneline --name-only -10 -- "packages/ui/**/*.css" || echo "No recent CSS changes" - echo "" - echo "=== Git diff for CSS files ===" - git diff HEAD~1 HEAD -- "packages/ui/**/*.css" || echo "No CSS changes in diff" - echo "" - echo "=== Chromatic config check ===" - if [ -f "chromatic.config.js" ]; then - echo "chromatic.config.js exists" - cat chromatic.config.js - else - echo "No chromatic.config.js found" - fi - - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url uses: mshick/add-pr-comment@v2 @@ -118,3 +95,24 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Post Debug Comment (if Chromatic failed) + if: github.event_name == 'pull_request' && steps.chromatic.outputs.url == '' + uses: mshick/add-pr-comment@v2 + with: + message: | + ## 🚨 Chromatic Debug Info + + The Chromatic workflow ran but didn't produce a URL. This could mean: + - Chromatic failed to run + - No changes were detected + - Configuration issue + + **Debug Info:** + - Workflow triggered: ✅ + - Chromatic URL: `${{ steps.chromatic.outputs.url }}` + - Exit Code: `${{ steps.chromatic.outputs.code }}` + - Changed files: See workflow logs above + + Please check the [workflow logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details. + repo-token: ${{ secrets.GITHUB_TOKEN }} From aa168233e5fdfb3f3e9c936ca509b24cb04a5040 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 11:00:29 +0100 Subject: [PATCH 053/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 28 +++----------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index d2a684ec96..85f6d0305c 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -69,14 +69,13 @@ jobs: message: | ## 🎨 Visual Testing Results - Your visual changes have been tested with Chromatic! Here are the results: + ${{ steps.chromatic.outputs.changeCount }} visual changes were found in this build. - - [**Review Changes**](${{ steps.chromatic.outputs.url }}) - View visual diffs and approve/reject changes - - [**Build Details**](${{ steps.chromatic.outputs.buildUrl }}) - See detailed build information + - [**Review changes**](${{ steps.chromatic.outputs.buildUrl }}) - Please review the changes and approve or reject them. - [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) - Browse the interactive component library
- 🔧 All Available Chromatic Outputs + All Available Chromatic Outputs | Output | Value | Description | |--------|-------|-------------| @@ -95,24 +94,3 @@ jobs:
repo-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Post Debug Comment (if Chromatic failed) - if: github.event_name == 'pull_request' && steps.chromatic.outputs.url == '' - uses: mshick/add-pr-comment@v2 - with: - message: | - ## 🚨 Chromatic Debug Info - - The Chromatic workflow ran but didn't produce a URL. This could mean: - - Chromatic failed to run - - No changes were detected - - Configuration issue - - **Debug Info:** - - Workflow triggered: ✅ - - Chromatic URL: `${{ steps.chromatic.outputs.url }}` - - Exit Code: `${{ steps.chromatic.outputs.code }}` - - Changed files: See workflow logs above - - Please check the [workflow logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details. - repo-token: ${{ secrets.GITHUB_TOKEN }} From 655d40ae059665af6610821e0a20d82d74619299 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 11:51:47 +0100 Subject: [PATCH 054/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 28 +++----------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 85f6d0305c..33951617e6 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -67,30 +67,8 @@ jobs: uses: mshick/add-pr-comment@v2 with: message: | - ## 🎨 Visual Testing Results + ## 🎨 Visual Regression Testing - ${{ steps.chromatic.outputs.changeCount }} visual changes were found in this build. - - - [**Review changes**](${{ steps.chromatic.outputs.buildUrl }}) - Please review the changes and approve or reject them. - - [**Live Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) - Browse the interactive component library - -
- All Available Chromatic Outputs - - | Output | Value | Description | - |--------|-------|-------------| - | `url` | `${{ steps.chromatic.outputs.url }}` | An alias for the build URL. | - | `buildUrl` | `${{ steps.chromatic.outputs.buildUrl }}` | The build URL. | - | `storybookUrl` | `${{ steps.chromatic.outputs.storybookUrl }}` | The Storybook preview URL for your current branch / Pull Request. | - | `code` | `${{ steps.chromatic.outputs.code }}` | The exit code for the current run of the Chromatic CLI. | - | `actualCaptureCount` | `${{ steps.chromatic.outputs.actualCaptureCount }}` | The number of captured snapshots. | - | `changeCount` | `${{ steps.chromatic.outputs.changeCount }}` | The number of tests with visual changes, including any inherited changes (e.g., due to TurboSnap). | - | `componentCount` | `${{ steps.chromatic.outputs.componentCount }}` | The number of components in the published Storybook. | - | `errorCount` | `${{ steps.chromatic.outputs.errorCount }}` | The number of tests with error(s), including any inherited errors (e.g., due to TurboSnap). | - | `inheritedCaptureCount` | `${{ steps.chromatic.outputs.inheritedCaptureCount }}` | The number of inherited (not captured) snapshots (e.g., due to TurboSnap). | - | `interactionTestFailuresCount` | `${{ steps.chromatic.outputs.interactionTestFailuresCount }}` | The number of stories with interaction test failures. | - | `specCount` | `${{ steps.chromatic.outputs.specCount }}` | The number of stories in the published Storybook. | - | `testCount` | `${{ steps.chromatic.outputs.testCount }}` | The number of tests on the build. | - -
+ - **${{ steps.chromatic.outputs.changeCount }}** visual changes are waiting for review - [**Review changes in Chromatic**](${{ steps.chromatic.outputs.buildUrl }}) + - **${{ steps.chromatic.outputs.specCount}}** stories for **${{ steps.chromatic.outputs.componentCount}}** Components - [**Preview changes in Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) repo-token: ${{ secrets.GITHUB_TOKEN }} From 0651cea08f1b84eecb16ed026c5612c150ab6086 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 11:58:56 +0100 Subject: [PATCH 055/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 33951617e6..1e082f9c2b 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -67,7 +67,7 @@ jobs: uses: mshick/add-pr-comment@v2 with: message: | - ## 🎨 Visual Regression Testing + ## 🎨 Visual Testing with Chromatic - **${{ steps.chromatic.outputs.changeCount }}** visual changes are waiting for review - [**Review changes in Chromatic**](${{ steps.chromatic.outputs.buildUrl }}) - **${{ steps.chromatic.outputs.specCount}}** stories for **${{ steps.chromatic.outputs.componentCount}}** Components - [**Preview changes in Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) From 8a3eccdb5e2244cdbd9673835f8a471413aac69a Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 12:02:39 +0100 Subject: [PATCH 056/177] Fixes Signed-off-by: Charles de Dreuille --- chromatic.config.js | 35 -------------------- packages/ui/css/styles.css | 2 +- packages/ui/src/components/Button/styles.css | 2 +- 3 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 chromatic.config.js diff --git a/chromatic.config.js b/chromatic.config.js deleted file mode 100644 index a99bf4ecc0..0000000000 --- a/chromatic.config.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -module.exports = { - // Force full rebuild when these files change - externals: [ - 'packages/ui/**/*.css', - 'packages/ui/css/**', - 'packages/ui/src/**/*.css', - 'packages/ui/css/styles.css', // Specific file that was changed - 'packages/ui/src/components/Button/styles.css', // Specific file that was changed - ], - - // Additional configuration for better change detection - turboSnap: { - // Force rebuild for CSS changes - externals: [ - 'packages/ui/**/*.css', - 'packages/ui/css/**', - 'packages/ui/src/**/*.css', - ], - }, -}; diff --git a/packages/ui/css/styles.css b/packages/ui/css/styles.css index c2dec63d32..88be061ba5 100644 --- a/packages/ui/css/styles.css +++ b/packages/ui/css/styles.css @@ -9309,8 +9309,8 @@ } .bui-Button[data-variant="primary"] { + background-color: var(--bui-bg-solid); color: var(--bui-fg-solid); - background-color: red; &:hover { background-color: var(--bui-bg-solid-hover); diff --git a/packages/ui/src/components/Button/styles.css b/packages/ui/src/components/Button/styles.css index 526a9b010b..03138a7c44 100644 --- a/packages/ui/src/components/Button/styles.css +++ b/packages/ui/src/components/Button/styles.css @@ -34,7 +34,7 @@ } .bui-Button[data-variant='primary'] { - background-color: red; + background-color: var(--bui-bg-solid); color: var(--bui-fg-solid); &:hover { From 344beb24eceac843867ff1928757ec07b8552ce7 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 12:07:36 +0100 Subject: [PATCH 057/177] Update styles.css Signed-off-by: Charles de Dreuille --- packages/ui/src/components/Button/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/components/Button/styles.css b/packages/ui/src/components/Button/styles.css index 03138a7c44..0704087b64 100644 --- a/packages/ui/src/components/Button/styles.css +++ b/packages/ui/src/components/Button/styles.css @@ -34,7 +34,7 @@ } .bui-Button[data-variant='primary'] { - background-color: var(--bui-bg-solid); + background-color: green; color: var(--bui-fg-solid); &:hover { From b43fee2c7adade21768026743ad322bffe28a037 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 12:12:40 +0100 Subject: [PATCH 058/177] Cleanup Signed-off-by: Charles de Dreuille --- .github/workflows/chromatic-pr-comment.yml | 144 ------------------- .github/workflows/verify_chromatic.yml | 12 +- packages/ui/src/components/Button/styles.css | 2 +- 3 files changed, 12 insertions(+), 146 deletions(-) delete mode 100644 .github/workflows/chromatic-pr-comment.yml diff --git a/.github/workflows/chromatic-pr-comment.yml b/.github/workflows/chromatic-pr-comment.yml deleted file mode 100644 index 82af73f8eb..0000000000 --- a/.github/workflows/chromatic-pr-comment.yml +++ /dev/null @@ -1,144 +0,0 @@ -name: Chromatic PR Comment - -on: - workflow_run: - workflows: - - 'Chromatic' - types: - - completed - -jobs: - post-chromatic-comment: - name: Post Chromatic Results - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' }} - permissions: - contents: read - pull-requests: write - steps: - - name: Harden Runner - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 - with: - disable-sudo: true - egress-policy: block - allowed-endpoints: > - api.github.com:443 - - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Get PR number - id: pr - run: | - # Extract PR number from the workflow run event - PR_NUMBER=$(echo '${{ github.event.workflow_run.head_branch }}' | grep -o 'pull/[0-9]*' | cut -d'/' -f2 || echo '') - if [ -z "$PR_NUMBER" ]; then - # Fallback: try to get from the workflow run name or other sources - PR_NUMBER=$(echo '${{ github.event.workflow_run.display_title }}' | grep -o '#[0-9]*' | cut -d'#' -f2 || echo '') - fi - echo "pr-number=$PR_NUMBER" >> $GITHUB_OUTPUT - echo "PR Number: $PR_NUMBER" - - - name: Get Chromatic URL from workflow run - id: chromatic-url - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - with: - script: | - // Get the workflow run details - const workflowRun = await github.rest.actions.getWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: context.payload.workflow_run.id, - }); - - // Get the jobs for this workflow run - const jobs = await github.rest.actions.listJobsForWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: context.payload.workflow_run.id, - }); - - // Find the chromatic job - const chromaticJob = jobs.data.jobs.find(job => job.name === 'Chromatic'); - if (!chromaticJob) { - console.log('Chromatic job not found'); - return; - } - - // Get the job steps - const jobSteps = await github.rest.actions.getJobForWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - job_id: chromaticJob.id, - }); - - console.log('Chromatic job steps:', jobSteps.data.steps.map(step => ({ name: step.name, conclusion: step.conclusion }))); - - // Look for the Chromatic step output - // The Chromatic action typically outputs the URL in the step logs - // We'll need to parse the logs to extract the URL - const logs = await github.rest.actions.downloadJobLogsForWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - job_id: chromaticJob.id, - }); - - const logText = Buffer.from(logs.data, 'base64').toString('utf-8'); - console.log('Log text length:', logText.length); - - // Extract Chromatic URL from logs - const urlMatch = logText.match(/https:\/\/[a-zA-Z0-9.-]*chromatic\.com\/builds\/[a-zA-Z0-9-]+/); - if (urlMatch) { - console.log('Found Chromatic URL:', urlMatch[0]); - core.setOutput('url', urlMatch[0]); - } else { - console.log('No Chromatic URL found in logs'); - // Look for alternative patterns - const altMatch = logText.match(/View your changes at: (https:\/\/[^\s]+)/); - if (altMatch) { - console.log('Found alternative Chromatic URL:', altMatch[1]); - core.setOutput('url', altMatch[1]); - } - } - - - name: Find existing Chromatic comment - if: steps.chromatic-url.outputs.url - uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3 - id: find-comment - with: - issue-number: ${{ steps.pr.outputs.pr-number }} - comment-author: 'github-actions[bot]' - body-includes: '🎨 Chromatic Visual Testing' - direction: last - - - name: Create or Update Chromatic Comment - if: steps.chromatic-url.outputs.url - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 - with: - comment-id: ${{ steps.find-comment.outputs.comment-id }} - issue-number: ${{ steps.pr.outputs.pr-number }} - body: | - ## 🎨 Chromatic Visual Testing - - Visual testing has completed successfully! You can view the results and any visual changes at: - - **🔗 [View Chromatic Build](${{ steps.chromatic-url.outputs.url }})** - - --- - *This comment is automatically updated when visual tests run.* - edit-mode: replace - - - name: Create comment if no URL found - if: steps.chromatic-url.outputs.url == '' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 - with: - issue-number: ${{ steps.pr.outputs.pr-number }} - body: | - ## 🎨 Chromatic Visual Testing - - Visual testing completed, but the Chromatic URL could not be extracted from the workflow logs. - - Please check the [Chromatic workflow run](https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}) for details. - - --- - *This comment is automatically updated when visual tests run.* diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 1e082f9c2b..5d35923b1a 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -62,6 +62,16 @@ jobs: packages/ui/css/** packages/ui/src/**/*.css + - name: Prepare Chromatic Message + if: github.event_name == 'pull_request' && steps.chromatic.outputs.url + id: prepare-message + run: | + if [ "${{ steps.chromatic.outputs.changeCount }}" = "0" ] || [ -z "${{ steps.chromatic.outputs.changeCount }}" ]; then + echo "changes-text=No visual changes detected - [**View build in Chromatic**](${{ steps.chromatic.outputs.buildUrl }})" >> $GITHUB_OUTPUT + else + echo "changes-text=**${{ steps.chromatic.outputs.changeCount }}** visual changes are waiting for review - [**Review changes in Chromatic**](${{ steps.chromatic.outputs.buildUrl }})" >> $GITHUB_OUTPUT + fi + - name: Post Chromatic Link in PR Comment if: github.event_name == 'pull_request' && steps.chromatic.outputs.url uses: mshick/add-pr-comment@v2 @@ -69,6 +79,6 @@ jobs: message: | ## 🎨 Visual Testing with Chromatic - - **${{ steps.chromatic.outputs.changeCount }}** visual changes are waiting for review - [**Review changes in Chromatic**](${{ steps.chromatic.outputs.buildUrl }}) + - ${{ steps.prepare-message.outputs.changes-text }} - **${{ steps.chromatic.outputs.specCount}}** stories for **${{ steps.chromatic.outputs.componentCount}}** Components - [**Preview changes in Storybook**](${{ steps.chromatic.outputs.storybookUrl }}) repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/packages/ui/src/components/Button/styles.css b/packages/ui/src/components/Button/styles.css index 0704087b64..03138a7c44 100644 --- a/packages/ui/src/components/Button/styles.css +++ b/packages/ui/src/components/Button/styles.css @@ -34,7 +34,7 @@ } .bui-Button[data-variant='primary'] { - background-color: green; + background-color: var(--bui-bg-solid); color: var(--bui-fg-solid); &:hover { From 87b5e6e34a09e32c1b1910614b485851042e1573 Mon Sep 17 00:00:00 2001 From: James Brooks Date: Fri, 19 Sep 2025 12:52:31 +0100 Subject: [PATCH 059/177] Fix API error in catalog graph plugin Signed-off-by: James Brooks --- .changeset/cool-baboons-count.md | 5 +++++ plugins/catalog-graph/src/alpha.tsx | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .changeset/cool-baboons-count.md diff --git a/.changeset/cool-baboons-count.md b/.changeset/cool-baboons-count.md new file mode 100644 index 0000000000..c5dac494d9 --- /dev/null +++ b/.changeset/cool-baboons-count.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-graph': patch +--- + +Add missing API implementation for catalog graph plugin in NFS apps. diff --git a/plugins/catalog-graph/src/alpha.tsx b/plugins/catalog-graph/src/alpha.tsx index 5fc43f1b4a..9a7f15e553 100644 --- a/plugins/catalog-graph/src/alpha.tsx +++ b/plugins/catalog-graph/src/alpha.tsx @@ -15,6 +15,7 @@ */ import { + ApiBlueprint, createFrontendPlugin, PageBlueprint, } from '@backstage/frontend-plugin-api'; @@ -24,7 +25,11 @@ import { } from '@backstage/core-compat-api'; import { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha'; import { catalogGraphRouteRef, catalogEntityRouteRef } from './routes'; -import { Direction } from '@backstage/plugin-catalog-graph'; +import { + catalogGraphApiRef, + DefaultCatalogGraphApi, + Direction, +} from '@backstage/plugin-catalog-graph'; const CatalogGraphEntityCard = EntityCardBlueprint.makeWithOverrides({ name: 'relations', @@ -85,6 +90,15 @@ const CatalogGraphPage = PageBlueprint.makeWithOverrides({ }, }); +const CatalogGraphApi = ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: catalogGraphApiRef, + deps: {}, + factory: () => new DefaultCatalogGraphApi(), + }), +}); + export default createFrontendPlugin({ pluginId: 'catalog-graph', info: { packageJson: () => import('../package.json') }, @@ -94,7 +108,7 @@ export default createFrontendPlugin({ externalRoutes: { catalogEntity: convertLegacyRouteRef(catalogEntityRouteRef), }, - extensions: [CatalogGraphPage, CatalogGraphEntityCard], + extensions: [CatalogGraphPage, CatalogGraphEntityCard, CatalogGraphApi], }); export { catalogGraphTranslationRef } from './translation'; From 7abd78afb2e4f00e28fd6e7dfc47714e1c252a4c Mon Sep 17 00:00:00 2001 From: James Brooks Date: Fri, 19 Sep 2025 13:16:54 +0100 Subject: [PATCH 060/177] Update API report Signed-off-by: James Brooks --- plugins/catalog-graph/report-alpha.api.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/catalog-graph/report-alpha.api.md b/plugins/catalog-graph/report-alpha.api.md index fe852d8cf6..edf84e936a 100644 --- a/plugins/catalog-graph/report-alpha.api.md +++ b/plugins/catalog-graph/report-alpha.api.md @@ -3,11 +3,14 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AnyApiFactory } from '@backstage/frontend-plugin-api'; import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; import { Direction } from '@backstage/plugin-catalog-graph'; import { Entity } from '@backstage/catalog-model'; import { EntityCardType } from '@backstage/plugin-catalog-react/alpha'; import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha'; +import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; import { ExtensionInput } from '@backstage/frontend-plugin-api'; @@ -58,6 +61,21 @@ const _default: OverridableFrontendPlugin< }>; }, { + 'api:catalog-graph': ExtensionDefinition<{ + kind: 'api'; + name: undefined; + config: {}; + configInput: {}; + output: ExtensionDataRef; + inputs: {}; + params: < + TApi, + TImpl extends TApi, + TDeps extends { [name in string]: unknown }, + >( + params: ApiFactory, + ) => ExtensionBlueprintParams; + }>; 'entity-card:catalog-graph/relations': ExtensionDefinition<{ config: { kinds: string[] | undefined; From 22d6c66564230d4af2def59e35d2738ac63e5c4b Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 13:51:54 +0100 Subject: [PATCH 061/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 5d35923b1a..602e1bb559 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -31,7 +31,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - fetch-depth: 1000 # Required to retrieve git history + fetch-depth: 10000 # Required to retrieve git history - name: Use node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 From bb1ab60da9719c9aef2aa7beef9c5eea868a1273 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 19 Sep 2025 13:53:46 +0100 Subject: [PATCH 062/177] Update verify_chromatic.yml Signed-off-by: Charles de Dreuille --- .github/workflows/verify_chromatic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index 602e1bb559..0c9f110b4c 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -9,7 +9,7 @@ on: paths: - '.github/workflows/verify_chromatic.yml' - '.storybook/**' - - 'packages/ui/src/**' + - 'packages/ui/**' - '**/*.stories.tsx' jobs: From 2aded73e384cb97bc7ed4a663ef7e94571f4d1aa Mon Sep 17 00:00:00 2001 From: Joseph Roberto Date: Thu, 18 Sep 2025 12:45:13 -0500 Subject: [PATCH 063/177] feat: Allow configurable pagelength for Bitbucket Cloud provider Signed-off-by: Joseph Roberto --- .changeset/tame-hairs-smash.md | 6 ++++ plugins/bitbucket-cloud-common/report.api.md | 2 ++ .../src/BitbucketCloudClient.test.ts | 35 +++++++++++++++++++ .../src/BitbucketCloudClient.ts | 2 ++ .../src/pagination.test.ts | 16 ++++++++- .../bitbucket-cloud-common/src/pagination.ts | 7 ++-- .../config.d.ts | 10 ++++++ .../providers/BitbucketCloudEntityProvider.ts | 2 +- ...BitbucketCloudEntityProviderConfig.test.ts | 22 ++++++++++++ .../BitbucketCloudEntityProviderConfig.ts | 4 +++ 10 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 .changeset/tame-hairs-smash.md diff --git a/.changeset/tame-hairs-smash.md b/.changeset/tame-hairs-smash.md new file mode 100644 index 0000000000..d74b2ffeb7 --- /dev/null +++ b/.changeset/tame-hairs-smash.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-bitbucket-cloud-common': patch +--- + +Allow for passing a pagelen parameter to configure the pagelength property of the BitbucketCloudEntityProvider searchCode pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. diff --git a/plugins/bitbucket-cloud-common/report.api.md b/plugins/bitbucket-cloud-common/report.api.md index c53863b92f..11f0c93593 100644 --- a/plugins/bitbucket-cloud-common/report.api.md +++ b/plugins/bitbucket-cloud-common/report.api.md @@ -36,6 +36,7 @@ export class BitbucketCloudClient { workspace: string, query: string, options?: FilterAndSortOptions & PartialResponseOptions, + pagelen?: number, ): WithPagination; } @@ -517,6 +518,7 @@ export class WithPagination< constructor( createUrl: (options: PaginationOptions) => URL, fetch: (url: URL) => Promise, + pagelen?: number | undefined, ); // (undocumented) getPage(options?: PaginationOptions): Promise; diff --git a/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.test.ts b/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.test.ts index 7558c92138..ed696ec6fb 100644 --- a/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.test.ts +++ b/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.test.ts @@ -79,6 +79,41 @@ describe('BitbucketCloudClient', () => { expect(results[0].file!.path).toEqual('path/to/file'); }); + it('searchCode with custom pagelen', async () => { + server.use( + rest.get( + `https://api.bitbucket.org/2.0/workspaces/ws/search/code`, + (req, res, ctx) => { + const pagelen = req.url.searchParams.get('pagelen'); + expect(pagelen).toBe('50'); + + const response: Models.SearchResultPage = { + values: [ + { + content_match_count: 1, + file: { + type: 'commit_file', + path: 'path/to/file', + }, + }, + ], + }; + return res(ctx.json(response)); + }, + ), + ); + + const pagination = client.searchCode('ws', 'query', undefined, 50); + + const results = []; + for await (const result of pagination.iterateResults()) { + results.push(result); + } + + expect(results).toHaveLength(1); + expect(results[0].file!.path).toEqual('path/to/file'); + }); + it('listRepositoriesByWorkspace', async () => { server.use( rest.get( diff --git a/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.ts b/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.ts index 86f56dd70d..d1d4a35561 100644 --- a/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.ts +++ b/plugins/bitbucket-cloud-common/src/BitbucketCloudClient.ts @@ -40,6 +40,7 @@ export class BitbucketCloudClient { workspace: string, query: string, options?: FilterAndSortOptions & PartialResponseOptions, + pagelen?: number, ): WithPagination { const workspaceEnc = encodeURIComponent(workspace); return new WithPagination( @@ -50,6 +51,7 @@ export class BitbucketCloudClient { search_query: query, }), url => this.getTypeMapped(url), + pagelen, ); } diff --git a/plugins/bitbucket-cloud-common/src/pagination.test.ts b/plugins/bitbucket-cloud-common/src/pagination.test.ts index f263f51897..c355a798e4 100644 --- a/plugins/bitbucket-cloud-common/src/pagination.test.ts +++ b/plugins/bitbucket-cloud-common/src/pagination.test.ts @@ -24,7 +24,7 @@ interface TestResultItem { interface TestPage extends Models.Paginated {} describe('WithPagination', () => { - const createPagination = () => + const createPagination = (pagelen?: number) => new WithPagination( opts => new URL( @@ -45,6 +45,7 @@ describe('WithPagination', () => { ], }; }, + pagelen, ); it('iterateResults', async () => { @@ -121,4 +122,17 @@ describe('WithPagination', () => { ); }); }); + + it('uses custom pagelen when provided', async () => { + const pagination = createPagination(50); + + const page = await pagination.getPage(); + + expect(page.page).toEqual(1); + expect(page.next).toEqual('http://localhost/create-url?page=2&pagelen=50'); + expect(page.values).toHaveLength(1); + expect((page.values! as TestResultItem[])[0].url).toEqual( + 'http://localhost/create-url?page=1&pagelen=50', + ); + }); }); diff --git a/plugins/bitbucket-cloud-common/src/pagination.ts b/plugins/bitbucket-cloud-common/src/pagination.ts index 98e4f9f9d7..5d699a4a6f 100644 --- a/plugins/bitbucket-cloud-common/src/pagination.ts +++ b/plugins/bitbucket-cloud-common/src/pagination.ts @@ -30,10 +30,11 @@ export class WithPagination< constructor( private readonly createUrl: (options: PaginationOptions) => URL, private readonly fetch: (url: URL) => Promise, + private readonly pagelen?: number, ) {} getPage(options?: PaginationOptions): Promise { - const opts = { page: 1, pagelen: 100, ...options }; + const opts = { page: 1, pagelen: this.pagelen ?? 100, ...options }; const url = this.createUrl(opts); return this.fetch(url); } @@ -41,7 +42,7 @@ export class WithPagination< async *iteratePages( options?: PaginationOptions, ): AsyncGenerator { - const opts = { page: 1, pagelen: 100, ...options }; + const opts = { page: 1, pagelen: this.pagelen ?? 100, ...options }; let url: URL | undefined = this.createUrl(opts); let res; do { @@ -52,7 +53,7 @@ export class WithPagination< } async *iterateResults(options?: PaginationOptions) { - const opts = { page: 1, pagelen: 100, ...options }; + const opts = { page: 1, pagelen: this.pagelen ?? 100, ...options }; let url: URL | undefined = this.createUrl(opts); let res; do { diff --git a/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts b/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts index 1051976b24..bc6d618aa8 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts @@ -59,6 +59,11 @@ export interface Config { * (Optional) TaskScheduleDefinition for the discovery. */ schedule?: SchedulerServiceTaskScheduleDefinitionConfig; + /** + * (Optional) Number of results to fetch per page from Bitbucket API. Default to 100. + * @visibility frontend + */ + pagelen?: number; } | { [name: string]: { @@ -92,6 +97,11 @@ export interface Config { * (Optional) TaskScheduleDefinition for the discovery. */ schedule?: SchedulerServiceTaskScheduleDefinitionConfig; + /** + * (Optional) Number of results to fetch per page from Bitbucket API. Default to 100. + * @visibility frontend + */ + pagelen?: number; }; }; }; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts index 64a58c2924..33327e1f33 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts @@ -409,7 +409,7 @@ export class BitbucketCloudEntityProvider implements EntityProvider { ].join(','); const searchResults = this.client - .searchCode(workspace, query, { fields }) + .searchCode(workspace, query, { fields }, this.config.pagelen) .iterateResults(); const result: IngestionTarget[] = []; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts index 7f13616586..e039708099 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts @@ -92,6 +92,7 @@ describe('readProviderConfigs', () => { projectKey: undefined, repoSlug: undefined, }, + pagelen: undefined, }); expect(providerConfigs[1]).toEqual({ id: 'providerCustomCatalogPath', @@ -101,6 +102,7 @@ describe('readProviderConfigs', () => { projectKey: undefined, repoSlug: undefined, }, + pagelen: undefined, }); expect(providerConfigs[2]).toEqual({ id: 'providerWithProjectKeyFilter', @@ -110,6 +112,7 @@ describe('readProviderConfigs', () => { projectKey: /^projectKey.*filter$/, repoSlug: undefined, }, + pagelen: undefined, }); expect(providerConfigs[3]).toEqual({ id: 'providerWithRepoSlugFilter', @@ -119,6 +122,7 @@ describe('readProviderConfigs', () => { projectKey: undefined, repoSlug: /^repoSlug.*filter$/, }, + pagelen: undefined, }); expect(providerConfigs[4]).toEqual({ id: 'providerWithSchedule', @@ -134,6 +138,24 @@ describe('readProviderConfigs', () => { minutes: 3, }, }, + pagelen: undefined, }); }); + + it('provider config with pagelen', () => { + const config = new ConfigReader({ + catalog: { + providers: { + bitbucketCloud: { + workspace: 'test-ws', + pagelen: 50, + }, + }, + }, + }); + const providerConfigs = readProviderConfigs(config); + + expect(providerConfigs).toHaveLength(1); + expect(providerConfigs[0].pagelen).toEqual(50); + }); }); diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts index 5a806d2e0b..0a8259e4d1 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts @@ -32,6 +32,7 @@ export type BitbucketCloudEntityProviderConfig = { repoSlug?: RegExp; }; schedule?: SchedulerServiceTaskScheduleDefinition; + pagelen?: number; }; export function readProviderConfigs( @@ -72,6 +73,8 @@ function readProviderConfig( ) : undefined; + const pagelen = config.getOptionalNumber('pagelen'); + return { id, catalogPath, @@ -83,6 +86,7 @@ function readProviderConfig( repoSlug: repoSlugPattern ? compileRegExp(repoSlugPattern) : undefined, }, schedule, + pagelen, }; } From 2a3704d75ffd6fc01eceee6e0737464c966d8cbe Mon Sep 17 00:00:00 2001 From: James Brooks <52410024+jabrks@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:06:43 +0100 Subject: [PATCH 064/177] Fix translation key for owner column title (#31200) The entity table currently has two columns labelled "Type" as a regression was introduced in #30076 which used the same translation key for the owner column as well as the type column. This PR corrects the key so that both columns now have the correct labels. Signed-off-by: James Brooks --- .changeset/eager-toes-start.md | 5 +++ .../components/EntityTable/columns.test.tsx | 39 +++++++++++++++++++ .../src/components/EntityTable/columns.tsx | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 .changeset/eager-toes-start.md create mode 100644 plugins/catalog-react/src/components/EntityTable/columns.test.tsx diff --git a/.changeset/eager-toes-start.md b/.changeset/eager-toes-start.md new file mode 100644 index 0000000000..f36cb1bb0a --- /dev/null +++ b/.changeset/eager-toes-start.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Correct translation key from "type" to "owner" for owner column in entity table to ensure the right translation is loaded. diff --git a/plugins/catalog-react/src/components/EntityTable/columns.test.tsx b/plugins/catalog-react/src/components/EntityTable/columns.test.tsx new file mode 100644 index 0000000000..05c9c61c26 --- /dev/null +++ b/plugins/catalog-react/src/components/EntityTable/columns.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { render, screen } from '@testing-library/react'; +import { columnFactories } from './columns'; +import { mockApis, MockErrorApi, TestApiProvider } from '@backstage/test-utils'; +import { errorApiRef } from '@backstage/core-plugin-api'; +import { translationApiRef } from '@backstage/core-plugin-api/alpha'; + +describe('columns', () => { + it('should render owner title', async () => { + const { title } = columnFactories.createOwnerColumn(); + + render( + + {title} + , + ); + + expect(await screen.findByText('Owner')).toBeInTheDocument(); + }); +}); diff --git a/plugins/catalog-react/src/components/EntityTable/columns.tsx b/plugins/catalog-react/src/components/EntityTable/columns.tsx index 94b1141057..1bea56dc27 100644 --- a/plugins/catalog-react/src/components/EntityTable/columns.tsx +++ b/plugins/catalog-react/src/components/EntityTable/columns.tsx @@ -108,7 +108,7 @@ export const columnFactories = Object.freeze({ }, createOwnerColumn(): TableColumn { return this.createEntityRelationColumn({ - title: , + title: , relation: RELATION_OWNED_BY, defaultKind: 'group', }); From d493126c98cfae9b8daff5605b7af301bcc8dfd2 Mon Sep 17 00:00:00 2001 From: James Brooks <52410024+jabrks@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:09:27 +0100 Subject: [PATCH 065/177] Fix light mode colour token in ItemCardHeader (#31203) The text colour in the ItemCardHeader component is always white, which makes the content unreadable that when you're rendering on a white background in light mode. This switches to a semantic token instead that will dynamically adjust to whichever theme is currently set. Signed-off-by: James Brooks --- .changeset/fast-queens-guess.md | 5 +++++ .../core-components/src/layout/ItemCard/ItemCardHeader.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/fast-queens-guess.md diff --git a/.changeset/fast-queens-guess.md b/.changeset/fast-queens-guess.md new file mode 100644 index 0000000000..b2e5086e9e --- /dev/null +++ b/.changeset/fast-queens-guess.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Swap base token for semantic token in ItemCardHeader to ensure readability in light mode. diff --git a/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx b/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx index b21ac53cf6..115c9e89e1 100644 --- a/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx +++ b/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx @@ -30,7 +30,7 @@ export type ItemCardHeaderClassKey = 'root'; const styles = (theme: Theme) => createStyles({ root: { - color: theme.palette.common.white, + color: theme.palette.text.primary, padding: theme.spacing(2, 2, 3), backgroundImage: theme.getPageTheme({ themeId: 'card' }).backgroundImage, backgroundPosition: 0, From 4832f96d8f368e431ece290507292a3a51a309fb Mon Sep 17 00:00:00 2001 From: vickstrom Date: Fri, 19 Sep 2025 20:06:34 +0200 Subject: [PATCH 066/177] document azureBlob config and remove unused id field Signed-off-by: vickstrom --- .../catalog-backend-module-azure/config.d.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend-module-azure/config.d.ts b/plugins/catalog-backend-module-azure/config.d.ts index 511588fb73..0eb488734f 100644 --- a/plugins/catalog-backend-module-azure/config.d.ts +++ b/plugins/catalog-backend-module-azure/config.d.ts @@ -61,16 +61,32 @@ export interface Config { azureBlob?: | { [name: string]: { - id: string; + /** + * (Required) The Azure Blob Storage container name. + */ containerName: string; + /** + * (Required) The Azure Storage account name. + */ accountName: string; + /** + * (Optional) TaskScheduleDefinition for the refresh. + */ schedule?: SchedulerServiceTaskScheduleDefinitionConfig; }; } | { - id: string; + /** + * (Required) The Azure Blob Storage container name. + */ containerName: string; + /** + * (Required) The Azure Storage account name. + */ accountName: string; + /** + * (Optional) TaskScheduleDefinition for the refresh. + */ schedule?: SchedulerServiceTaskScheduleDefinitionConfig; }; }; From f5695351141ce9414c53185c7bd4d6b50c2dc1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=91=EC=A4=80?= Date: Sat, 20 Sep 2025 13:55:54 +0900 Subject: [PATCH 067/177] feat: add kubernetes configmap component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 김병준 --- .../src/components/Cluster/Cluster.tsx | 6 + .../ConfigmapsAccordions.tsx | 118 ++++++++++++++++++ .../ConfigmapsAccordions/ConfigmapsDrawer.tsx | 64 ++++++++++ .../components/ConfigmapsAccordions/index.ts | 16 +++ 4 files changed, 204 insertions(+) create mode 100644 plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.tsx create mode 100644 plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.tsx create mode 100644 plugins/kubernetes-react/src/components/ConfigmapsAccordions/index.ts diff --git a/plugins/kubernetes-react/src/components/Cluster/Cluster.tsx b/plugins/kubernetes-react/src/components/Cluster/Cluster.tsx index 642ed642a4..4e8c4a1947 100644 --- a/plugins/kubernetes-react/src/components/Cluster/Cluster.tsx +++ b/plugins/kubernetes-react/src/components/Cluster/Cluster.tsx @@ -30,6 +30,7 @@ import { DeploymentsAccordions } from '../DeploymentsAccordions'; import { StatefulSetsAccordions } from '../StatefulSetsAccordions'; import { IngressesAccordions } from '../IngressesAccordions'; import { ServicesAccordions } from '../ServicesAccordions'; +import { ConfigmapsAccordions } from '../ConfigmapsAccordions'; import { CronJobsAccordions } from '../CronJobsAccordions'; import { CustomResources } from '../CustomResources'; import { DaemonSetsAccordions } from '../DaemonSetsAccordions'; @@ -170,6 +171,11 @@ export const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => { ) : undefined} + {groupedResponses.configMaps.length > 0 ? ( + + + + ) : undefined} {groupedResponses.cronJobs.length > 0 ? ( diff --git a/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.tsx b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.tsx new file mode 100644 index 0000000000..81ab874737 --- /dev/null +++ b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.tsx @@ -0,0 +1,118 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useContext } from 'react'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import type { V1ConfigMap } from '@kubernetes/client-node'; +import { ConfigmapsDrawer } from './ConfigmapsDrawer.tsx'; +import { GroupedResponsesContext } from '../../hooks'; +import { StructuredMetadataTable } from '@backstage/core-components'; + +type ConfigmapSummaryProps = { + configmap: V1ConfigMap; +}; + +const ConfigmapSummary = ({ configmap }: ConfigmapSummaryProps) => { + return ( + + + + + + + + Data Count: {configmap.data ? Object.keys(configmap.data).length : 0} + + + + ); +}; + +type ConfigmapsCardProps = { + configmap: V1ConfigMap; +}; + +const ConfigmapCard = ({ configmap }: ConfigmapsCardProps) => { + const metadata: any = {}; + + metadata.data = configmap.data; + + return ( + + ); +}; + +/** + * + * + * @public + */ +export type ConfigmapsAccordionsProps = {}; + +type ConfigmapsAccordionProps = { + configmap: V1ConfigMap; +}; + +const ConfigmapsAccordion = ({ configmap }: ConfigmapsAccordionProps) => { + return ( + + }> + + + + + + + ); +}; + +/** + * + * + * @public + */ +export const ConfigmapsAccordions = ({}: ConfigmapsAccordionsProps) => { + const groupedResponses = useContext(GroupedResponsesContext); + return ( + + {groupedResponses.configMaps.map((configmap, i) => ( + + + + ))} + + ); +}; diff --git a/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.tsx b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.tsx new file mode 100644 index 0000000000..97e8aab723 --- /dev/null +++ b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.tsx @@ -0,0 +1,64 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import Chip from '@material-ui/core/Chip'; +import type { V1ConfigMap } from '@kubernetes/client-node'; + +export const ConfigmapsDrawer = ({ + configmap, + expanded, +}: { + configmap: V1ConfigMap; + expanded?: boolean; +}) => { + const namespace = configmap.metadata?.namespace; + return ( + { + return configmapObject || {}; + }} + > + + + + {configmap.metadata?.name ?? 'unknown object'} + + + + + ConfigMap + + + {namespace && ( + + + + )} + + + ); +}; diff --git a/plugins/kubernetes-react/src/components/ConfigmapsAccordions/index.ts b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/index.ts new file mode 100644 index 0000000000..25a1578a79 --- /dev/null +++ b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './ConfigmapsAccordions.tsx'; From 5787cda0b9efa66bd94b9ca3f872cc6b9d68ccba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=91=EC=A4=80?= Date: Sat, 20 Sep 2025 14:07:50 +0900 Subject: [PATCH 068/177] feat: add test for configmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 김병준 --- .../src/__fixtures__/1-configmaps.json | 26 +++++++++ .../src/__fixtures__/2-configmaps.json | 47 ++++++++++++++++ .../ConfigmapsAccordions.test.tsx | 54 +++++++++++++++++++ .../ConfigmapsDrawer.test.tsx | 37 +++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 plugins/kubernetes-react/src/__fixtures__/1-configmaps.json create mode 100644 plugins/kubernetes-react/src/__fixtures__/2-configmaps.json create mode 100644 plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.test.tsx create mode 100644 plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.test.tsx diff --git a/plugins/kubernetes-react/src/__fixtures__/1-configmaps.json b/plugins/kubernetes-react/src/__fixtures__/1-configmaps.json new file mode 100644 index 0000000000..ab0518e87d --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/1-configmaps.json @@ -0,0 +1,26 @@ +{ + "configMaps": [ + { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "app-config", + "namespace": "default", + "uid": "1ea073bc-7a4b-4b99-8321-0305bce85568", + "resourceVersion": "1362732552", + "creationTimestamp": "2021-07-16T22:39:58Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "app": "dice-roller" + }, + "annotations": {} + }, + "data": { + "database.host": "localhost", + "database.port": "5432", + "app.name": "dice-roller", + "app.version": "1.0.0" + } + } + ] +} diff --git a/plugins/kubernetes-react/src/__fixtures__/2-configmaps.json b/plugins/kubernetes-react/src/__fixtures__/2-configmaps.json new file mode 100644 index 0000000000..2c0c7f8121 --- /dev/null +++ b/plugins/kubernetes-react/src/__fixtures__/2-configmaps.json @@ -0,0 +1,47 @@ +{ + "configMaps": [ + { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "app-config", + "namespace": "default", + "uid": "1ea073bc-7a4b-4b99-8321-0305bce85568", + "resourceVersion": "1362732552", + "creationTimestamp": "2021-07-16T22:39:58Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "app": "dice-roller" + }, + "annotations": {} + }, + "data": { + "database.host": "localhost", + "database.port": "5432", + "app.name": "dice-roller", + "app.version": "1.0.0" + } + }, + { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "redis-config", + "namespace": "default", + "uid": "2ea073bc-7a4b-4b99-8321-0305bce85568", + "resourceVersion": "1362732553", + "creationTimestamp": "2021-07-16T22:40:58Z", + "labels": { + "backstage.io/kubernetes-id": "dice-roller", + "app": "redis" + }, + "annotations": {} + }, + "data": { + "redis.conf": "# Redis configuration\nmaxmemory 256mb\nmaxmemory-policy allkeys-lru", + "redis.host": "redis-service", + "redis.port": "6379" + } + } + ] +} diff --git a/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.test.tsx b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.test.tsx new file mode 100644 index 0000000000..d819a01cd9 --- /dev/null +++ b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsAccordions.test.tsx @@ -0,0 +1,54 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { screen } from '@testing-library/react'; +import { ConfigmapsAccordions } from './ConfigmapsAccordions'; +import * as oneConfigmapsFixture from '../../__fixtures__/1-configmaps.json'; +import * as twoConfigmapsFixture from '../../__fixtures__/2-configmaps.json'; +import { renderInTestApp } from '@backstage/test-utils'; +import { kubernetesProviders } from '../../hooks/test-utils'; + +describe('ConfigmapsAccordions', () => { + it('should render 1 configmap', async () => { + const wrapper = kubernetesProviders( + oneConfigmapsFixture, + new Set(), + ); + + await renderInTestApp(wrapper()); + + expect(screen.getByText('app-config')).toBeInTheDocument(); + expect(screen.getByText('ConfigMap')).toBeInTheDocument(); + expect(screen.getByText('namespace: default')).toBeInTheDocument(); + expect(screen.getByText('Data Count: 4')).toBeInTheDocument(); + }); + + it('should render 2 configmaps', async () => { + const wrapper = kubernetesProviders( + twoConfigmapsFixture, + new Set(), + ); + + await renderInTestApp(wrapper()); + + expect(screen.getByText('app-config')).toBeInTheDocument(); + expect(screen.getByText('redis-config')).toBeInTheDocument(); + expect(screen.getAllByText('ConfigMap')).toHaveLength(2); + expect(screen.getAllByText('namespace: default')).toHaveLength(2); + expect(screen.getByText('Data Count: 4')).toBeInTheDocument(); + expect(screen.getByText('Data Count: 3')).toBeInTheDocument(); + }); +}); diff --git a/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.test.tsx b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.test.tsx new file mode 100644 index 0000000000..cde7265cab --- /dev/null +++ b/plugins/kubernetes-react/src/components/ConfigmapsAccordions/ConfigmapsDrawer.test.tsx @@ -0,0 +1,37 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as oneConfigmapsFixture from '../../__fixtures__/1-configmaps.json'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { ConfigmapsDrawer } from './ConfigmapsDrawer'; +import { kubernetesClusterLinkFormatterApiRef } from '../../api'; + +describe('ConfigmapsDrawer', () => { + it('should render configmap drawer', async () => { + const { getByText, getAllByText } = await renderInTestApp( + + + , + ); + + expect(getAllByText('app-config')).toHaveLength(3); + expect(getAllByText('ConfigMap')).toHaveLength(3); + expect(getByText('YAML')).toBeInTheDocument(); + expect(getByText('namespace: default')).toBeInTheDocument(); + }); +}); From ac405f2ed726015e024cb6c8d021679b86b6bbec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=91=EC=A4=80?= Date: Sat, 20 Sep 2025 22:56:04 +0900 Subject: [PATCH 069/177] chore: add changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 김병준 --- .changeset/famous-loops-tickle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/famous-loops-tickle.md diff --git a/.changeset/famous-loops-tickle.md b/.changeset/famous-loops-tickle.md new file mode 100644 index 0000000000..ae8c9d80ee --- /dev/null +++ b/.changeset/famous-loops-tickle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-react': patch +--- + +The configmaps added to be rendered From d772b516cd40d31d3f327d8d0b42f2ee06951f79 Mon Sep 17 00:00:00 2001 From: vickstrom Date: Mon, 22 Sep 2025 10:31:01 +0200 Subject: [PATCH 070/177] remove host from azure blog storage integration type Signed-off-by: vickstrom --- .changeset/five-olives-bet.md | 5 +++++ packages/integration/config.d.ts | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 .changeset/five-olives-bet.md diff --git a/.changeset/five-olives-bet.md b/.changeset/five-olives-bet.md new file mode 100644 index 0000000000..8623e780b5 --- /dev/null +++ b/.changeset/five-olives-bet.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +remove host from azure blob storage integration type diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts index c85d87144b..298d765697 100644 --- a/packages/integration/config.d.ts +++ b/packages/integration/config.d.ts @@ -105,11 +105,9 @@ export interface Config { endpointSuffix?: string; /** - * The host of the target that this matches on, e.g., "blob.core.windows.net". + * Optional endpoint URL for custom domain. Uses default if not provided. * @visibility frontend */ - host: string; - endpoint?: string; /** * Optional credential to use for Azure Active Directory authentication. From 37f540b71db528990ab0fab590e4e9b6a1f6dcbf Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Mon, 22 Sep 2025 10:37:52 +0100 Subject: [PATCH 071/177] update test handlers to simulate checking for both project.id and project.path_with_namespace Signed-off-by: Claire Peng --- .../src/__testUtils__/handlers.ts | 44 ++++++++++++------- .../src/lib/client.test.ts | 7 ++- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts b/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts index 9af00d2564..241bc86df6 100644 --- a/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts +++ b/plugins/catalog-backend-module-gitlab/src/__testUtils__/handlers.ts @@ -266,24 +266,34 @@ const httpProjectFindByIdDynamic = all_projects_response.map(project => { return res(ctx.json(all_projects_response.find(p => p.id === project.id))); }); }); -const httpProjectCatalogDynamic = all_projects_response.map(project => { - const path: string = project.path_with_namespace - ? project.path_with_namespace!.replace(/\//g, '%2F') - : `${project.path_with_namespace}%2F${project.name}`; - return rest.head( - `${apiBaseUrl}/projects/${path}/repository/files/catalog-info.yaml`, - (req, res, ctx) => { - const branch = req.url.searchParams.get('ref'); - if ( - branch === project.default_branch || - branch === 'main' || - branch === 'develop' - ) { - return res(ctx.status(200)); - } - return res(ctx.status(404, 'Not Found')); - }, +/** + * Checks for both project id and namespaced path, as these can both be used for the :id segment in Gitlab API: + * https://docs.gitlab.com/api/repository_files/#get-file-from-repository + */ +const httpProjectCatalogDynamic = all_projects_response.flatMap(project => { + const possibleIdSegments: string[] = [ + project.id.toString(), + project.path_with_namespace ?? '', + ]; + + return possibleIdSegments.map(seg => + rest.head( + `${apiBaseUrl}/projects/${encodeURIComponent( + seg, + )}/repository/files/catalog-info.yaml`, + (req, res, ctx) => { + const branch = req.url.searchParams.get('ref'); + if ( + branch === project.default_branch || + branch === 'main' || + branch === 'develop' + ) { + return res(ctx.status(200)); + } + return res(ctx.status(404, 'Not Found')); + }, + ), ); }); diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index 9b3bac6399..5a60d18493 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -580,7 +580,12 @@ describe('hasFile', () => { }); }); - it('should find catalog file', async () => { + it('should find catalog file by id', async () => { + const hasFile = await client.hasFile('1', 'main', 'catalog-info.yaml'); + expect(hasFile).toBe(true); + }); + + it('should find catalog file by namespace path', async () => { const hasFile = await client.hasFile( 'group1/test-repo1', 'main', From 047681317a79bd32d0a7b7be46acb5ee120f65ae Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Mon, 22 Sep 2025 10:49:28 +0100 Subject: [PATCH 072/177] update jsdoc for hasFile for the projectPath param Signed-off-by: Claire Peng --- plugins/catalog-backend-module-gitlab/src/lib/client.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 3178e2c0d1..fcdf135199 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -342,8 +342,9 @@ export class GitLabClient { /** * General existence check. + * @see {@link https://docs.gitlab.com/api/repository_files/#get-file-from-repository | GitLab Repository Files API} * - * @param projectPath - The path to the project + * @param projectPath - The path to the project, either the numeric ID or the namespaced path. * @param branch - The branch used to search * @param filePath - The path to the file */ From 53aedd6a177f9db4622eb3a1ae285dd558bc3ab0 Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Mon, 22 Sep 2025 11:09:29 +0100 Subject: [PATCH 073/177] rename projectPath param to project Signed-off-by: Claire Peng --- plugins/catalog-backend-module-gitlab/src/lib/client.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index fcdf135199..7860c66d1a 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -344,17 +344,17 @@ export class GitLabClient { * General existence check. * @see {@link https://docs.gitlab.com/api/repository_files/#get-file-from-repository | GitLab Repository Files API} * - * @param projectPath - The path to the project, either the numeric ID or the namespaced path. + * @param project - The path to the project, either the numeric ID or the namespaced path. * @param branch - The branch used to search * @param filePath - The path to the file */ async hasFile( - projectPath: string, + project: string, branch: string, filePath: string, ): Promise { const endpoint: string = `/projects/${encodeURIComponent( - projectPath, + project, )}/repository/files/${encodeURIComponent(filePath)}`; const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); request.searchParams.append('ref', branch); From bcc071b2cd9c2e5b40528a489ab174573c51dd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Mon, 22 Sep 2025 12:56:11 +0200 Subject: [PATCH 074/177] fix: remove default selection of tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- packages/ui/src/components/Header/Header.stories.tsx | 6 ++++++ packages/ui/src/components/Tabs/Tabs.tsx | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/Header/Header.stories.tsx b/packages/ui/src/components/Header/Header.stories.tsx index 7ae834f82e..6ccda8bb50 100644 --- a/packages/ui/src/components/Header/Header.stories.tsx +++ b/packages/ui/src/components/Header/Header.stories.tsx @@ -57,14 +57,17 @@ const tabs: HeaderTab[] = [ { id: 'overview', label: 'Overview', + href: '/overview', }, { id: 'checks', label: 'Checks', + href: '/checks', }, { id: 'tracks', label: 'Tracks', + href: '/tracks', }, { id: 'campaigns', @@ -82,14 +85,17 @@ const tabs2: HeaderTab[] = [ { id: 'Banana', label: 'Banana', + href: '/banana', }, { id: 'Apple', label: 'Apple', + href: '/apple', }, { id: 'Orange', label: 'Orange', + href: '/orange', }, ]; diff --git a/packages/ui/src/components/Tabs/Tabs.tsx b/packages/ui/src/components/Tabs/Tabs.tsx index d4c820e529..dacb355fc9 100644 --- a/packages/ui/src/components/Tabs/Tabs.tsx +++ b/packages/ui/src/components/Tabs/Tabs.tsx @@ -117,7 +117,7 @@ export const Tabs = (props: TabsProps) => { } } } - return undefined; + return null; })(); if (!children) return null; From d84bf179485dd6ebf8d804171d2a48ab88943a1c Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Mon, 22 Sep 2025 12:49:07 +0100 Subject: [PATCH 075/177] update client.hasFile to prefer project.id, then namespacedPath, then empty string fallback Signed-off-by: Claire Peng --- plugins/catalog-backend-module-gitlab/src/lib/client.ts | 6 +++--- .../src/providers/GitlabDiscoveryEntityProvider.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 7860c66d1a..46ff54846c 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -344,17 +344,17 @@ export class GitLabClient { * General existence check. * @see {@link https://docs.gitlab.com/api/repository_files/#get-file-from-repository | GitLab Repository Files API} * - * @param project - The path to the project, either the numeric ID or the namespaced path. + * @param projectIdentifier - The identifier of the project, either the numeric ID or the namespaced path. * @param branch - The branch used to search * @param filePath - The path to the file */ async hasFile( - project: string, + projectIdentifier: string, branch: string, filePath: string, ): Promise { const endpoint: string = `/projects/${encodeURIComponent( - project, + projectIdentifier, )}/repository/files/${encodeURIComponent(filePath)}`; const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); request.searchParams.append('ref', branch); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index 11b6a0ce04..24bc5faccb 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -590,7 +590,7 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { this.config.fallbackBranch; const hasFile = await client.hasFile( - project.path_with_namespace ?? '', + project.id.toString() ?? project.path_with_namespace ?? '', project_branch, this.config.catalogFile, ); From 827340fef35da65139992bdeccbd69cab1ac42be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Mon, 22 Sep 2025 14:25:49 +0200 Subject: [PATCH 076/177] Add changeset for tab changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- .changeset/clever-papers-watch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/clever-papers-watch.md diff --git a/.changeset/clever-papers-watch.md b/.changeset/clever-papers-watch.md new file mode 100644 index 0000000000..831d4c3455 --- /dev/null +++ b/.changeset/clever-papers-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +remove default selection of tab From bcac475df24d338433e3df8e86bcd58826d8995e Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Mon, 22 Sep 2025 13:42:16 +0100 Subject: [PATCH 077/177] update shouldProcessProject to first check by namespacedPath (as previous), then check by id if failed Signed-off-by: Claire Peng --- .../src/providers/GitlabDiscoveryEntityProvider.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index 24bc5faccb..869374de07 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -589,12 +589,22 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { project.default_branch ?? this.config.fallbackBranch; - const hasFile = await client.hasFile( - project.id.toString() ?? project.path_with_namespace ?? '', + // Find file with namespaced path (most use-cases) + let hasFile = await client.hasFile( + project.path_with_namespace ?? '', project_branch, this.config.catalogFile, ); + // Find file with project id if namespace failed + if (!hasFile) { + hasFile = await client.hasFile( + project.id.toString(), + project_branch, + this.config.catalogFile, + ); + } + return hasFile; } } From 9890488abbda4b9e35cec5cb4c11be248d34c448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 22 Sep 2025 14:58:12 +0200 Subject: [PATCH 078/177] make some inputs mandatory, that are always provided nowadays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/brave-teeth-reply.md | 5 + .../DefaultCatalogProcessingEngine.test.ts | 9 + .../DefaultCatalogProcessingEngine.ts | 30 ++- .../src/service/CatalogBuilder.ts | 4 +- .../src/service/DefaultRefreshService.test.ts | 1 + .../src/service/createRouter.test.ts | 6 +- .../src/service/createRouter.ts | 179 +++++++++--------- .../src/tests/integration.test.ts | 1 + 8 files changed, 120 insertions(+), 115 deletions(-) create mode 100644 .changeset/brave-teeth-reply.md diff --git a/.changeset/brave-teeth-reply.md b/.changeset/brave-teeth-reply.md new file mode 100644 index 0000000000..8a500692a7 --- /dev/null +++ b/.changeset/brave-teeth-reply.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Internal refactor to remove remnants of the old backend system diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts index ab54a7b885..93c22aab1e 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts @@ -70,6 +70,7 @@ describe('DefaultCatalogProcessingEngine', () => { orchestrator: orchestrator, stitcher: stitcher, createHash: () => hash, + scheduler: mockServices.scheduler(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -136,6 +137,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, }); @@ -219,6 +221,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, }); @@ -296,6 +299,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, }); @@ -355,6 +359,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, }); @@ -470,6 +475,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, }); @@ -575,6 +581,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, }); @@ -658,6 +665,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, }); @@ -746,6 +754,7 @@ describe('DefaultCatalogProcessingEngine', () => { knex: {} as any, orchestrator: orchestrator, stitcher: stitcher, + scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, }); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index 266b80f9a4..7061309175 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -59,7 +59,7 @@ const stableStringifyArray = (arr: any[]) => { // is just one. export class DefaultCatalogProcessingEngine { private readonly config: Config; - private readonly scheduler?: SchedulerService; + private readonly scheduler: SchedulerService; private readonly logger: LoggerService; private readonly knex: Knex; private readonly processingDatabase: ProcessingDatabase; @@ -79,7 +79,7 @@ export class DefaultCatalogProcessingEngine { constructor(options: { config: Config; - scheduler?: SchedulerService; + scheduler: SchedulerService; logger: LoggerService; knex: Knex; processingDatabase: ProcessingDatabase; @@ -370,25 +370,17 @@ export class DefaultCatalogProcessingEngine { } }; - if (this.scheduler) { - const abortController = new AbortController(); + const abortController = new AbortController(); + this.scheduler.scheduleTask({ + id: 'catalog_orphan_cleanup', + frequency: { milliseconds: this.orphanCleanupIntervalMs }, + timeout: { milliseconds: this.orphanCleanupIntervalMs * 0.8 }, + fn: runOnce, + signal: abortController.signal, + }); - this.scheduler.scheduleTask({ - id: 'catalog_orphan_cleanup', - frequency: { milliseconds: this.orphanCleanupIntervalMs }, - timeout: { milliseconds: this.orphanCleanupIntervalMs * 0.8 }, - fn: runOnce, - signal: abortController.signal, - }); - - return () => { - abortController.abort(); - }; - } - - const intervalKey = setInterval(runOnce, this.orphanCleanupIntervalMs); return () => { - clearInterval(intervalKey); + abortController.abort(); }; } } diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index dcd677152e..40fcc3a624 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -119,10 +119,10 @@ export type CatalogEnvironment = { reader: UrlReaderService; permissions: PermissionsService | PermissionAuthorizer; permissionsRegistry?: PermissionsRegistryService; - scheduler?: SchedulerService; + scheduler: SchedulerService; auth: AuthService; httpAuth: HttpAuthService; - auditor?: AuditorService; + auditor: AuditorService; }; /** diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index a89b21f79f..f999400b8a 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -121,6 +121,7 @@ describe('DefaultRefreshService', () => { processingDatabase: db, knex: knex, stitcher: stitcher, + scheduler: mockServices.scheduler(), orchestrator: { async process(request: EntityProcessingRequest) { const entityRef = stringifyEntityRef(request.entity); diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 0246a3d56b..299395552a 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -156,12 +156,12 @@ describe('createRouter readonly disabled', () => { logger: mockServices.logger.mock(), refreshService, config: new ConfigReader(undefined), - permissionIntegrationRouter: express.Router(), auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), locationAnalyzer, permissionsService, enableRelationsCompatibility: true, // added + auditor: mockServices.auditor.mock(), }); app = await wrapServer(express().use(router)); @@ -218,12 +218,12 @@ describe('createRouter readonly disabled', () => { logger: mockServices.logger.mock(), refreshService, config: new ConfigReader(undefined), - permissionIntegrationRouter: express.Router(), auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), locationAnalyzer, permissionsService, enableRelationsCompatibility: true, + auditor: mockServices.auditor.mock(), }); app = await wrapServer(express().use(router)); entitiesCatalog.entities.mockResolvedValueOnce({ @@ -951,6 +951,7 @@ describe('createRouter readonly and raw json enabled', () => { permissionIntegrationRouter: express.Router(), auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), + orchestrator: { process: jest.fn() }, permissionsService, auditor: mockServices.auditor.mock(), }); @@ -1171,6 +1172,7 @@ describe('NextRouter permissioning', () => { }), auth: mockServices.auth(), httpAuth: mockServices.httpAuth(), + orchestrator: { process: jest.fn() }, permissionsService, auditor: mockServices.auditor.mock(), }); diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 9c9b97eb4c..dc7678a3b9 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -20,7 +20,6 @@ import { HttpAuthService, LoggerService, PermissionsService, - SchedulerService, } from '@backstage/backend-plugin-api'; import { ANNOTATION_LOCATION, @@ -70,17 +69,15 @@ export interface RouterOptions { entitiesCatalog?: EntitiesCatalog; locationAnalyzer?: LocationAnalyzer; locationService: LocationService; - orchestrator?: CatalogProcessingOrchestrator; + orchestrator: CatalogProcessingOrchestrator; refreshService?: RefreshService; - scheduler?: SchedulerService; logger: LoggerService; config: Config; permissionIntegrationRouter?: express.Router; auth: AuthService; httpAuth: HttpAuthService; permissionsService: PermissionsService; - // TODO: Require AuditorService once `backend-legacy` is removed - auditor?: AuditorService; + auditor: AuditorService; enableRelationsCompatibility?: boolean; } @@ -124,7 +121,7 @@ export async function createRouter( router.post('/refresh', async (req, res) => { const { authorizationToken, ...restBody } = req.body; - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-mutate', severityLevel: 'medium', meta: { @@ -160,7 +157,7 @@ export async function createRouter( if (entitiesCatalog) { router .get('/entities', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-fetch', request: req, meta: { @@ -258,7 +255,7 @@ export async function createRouter( } }) .get('/entities/by-query', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-fetch', request: req, meta: { @@ -311,7 +308,7 @@ export async function createRouter( .get('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-fetch', request: req, meta: { @@ -356,7 +353,7 @@ export async function createRouter( .delete('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-mutate', severityLevel: 'medium', request: req, @@ -385,7 +382,7 @@ export async function createRouter( const { kind, namespace, name } = req.params; const entityRef = stringifyEntityRef({ kind, namespace, name }); - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-fetch', request: req, meta: { @@ -420,7 +417,7 @@ export async function createRouter( const { kind, namespace, name } = req.params; const entityRef = stringifyEntityRef({ kind, namespace, name }); - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-fetch', request: req, meta: { @@ -456,7 +453,7 @@ export async function createRouter( }, ) .post('/entities/by-refs', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-fetch', request: req, meta: { @@ -495,7 +492,7 @@ export async function createRouter( } }) .get('/entity-facets', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'entity-facets', request: req, }); @@ -525,7 +522,7 @@ export async function createRouter( const location = await validateRequestBody(req, locationInput); const dryRun = yn(req.query.dryRun, { default: false }); - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'location-mutate', severityLevel: dryRun ? 'low' : 'medium', request: req, @@ -570,7 +567,7 @@ export async function createRouter( } }) .get('/locations', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'location-fetch', request: req, meta: { @@ -597,7 +594,7 @@ export async function createRouter( .get('/locations/:id', async (req, res) => { const { id } = req.params; - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'location-fetch', request: req, meta: { @@ -628,7 +625,7 @@ export async function createRouter( .delete('/locations/:id', async (req, res) => { const { id } = req.params; - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'location-mutate', severityLevel: 'medium', request: req, @@ -659,7 +656,7 @@ export async function createRouter( const { kind, namespace, name } = req.params; const locationRef = `${kind}:${namespace}/${name}`; - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'location-fetch', request: req, meta: { @@ -692,7 +689,7 @@ export async function createRouter( if (locationAnalyzer) { router.post('/analyze-location', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ + const auditorEvent = await auditor.createEvent({ eventId: 'location-analyze', request: req, }); @@ -743,86 +740,84 @@ export async function createRouter( }); } - if (orchestrator) { - router.post('/validate-entity', async (req, res) => { - const auditorEvent = await auditor?.createEvent({ - eventId: 'entity-validate', - request: req, + router.post('/validate-entity', async (req, res) => { + const auditorEvent = await auditor.createEvent({ + eventId: 'entity-validate', + request: req, + }); + + try { + const bodySchema = z.object({ + entity: z.unknown(), + location: z.string(), }); + let body: z.infer; + let entity: Entity; + let location: { type: string; target: string }; try { - const bodySchema = z.object({ - entity: z.unknown(), - location: z.string(), - }); - - let body: z.infer; - let entity: Entity; - let location: { type: string; target: string }; - try { - body = await validateRequestBody(req, bodySchema); - entity = validateEntityEnvelope(body.entity); - location = parseLocationRef(body.location); - if (location.type !== 'url') - throw new TypeError( - `Invalid location ref ${body.location}, only 'url:' is supported, e.g. url:https://host/path`, - ); - } catch (err) { - await auditorEvent?.fail({ - error: err, - }); - - return res.status(400).json({ - errors: [serializeError(err)], - }); - } - - const credentials = await httpAuth.credentials(req); - const authorizedValidationService = new AuthorizedValidationService( - orchestrator, - permissionsService, - ); - const processingResult = await authorizedValidationService.process( - { - entity: { - ...entity, - metadata: { - ...entity.metadata, - annotations: { - [ANNOTATION_LOCATION]: body.location, - [ANNOTATION_ORIGIN_LOCATION]: body.location, - ...entity.metadata.annotations, - }, - }, - }, - }, - credentials, - ); - - if (!processingResult.ok) { - const errors = processingResult.errors.map(e => serializeError(e)); - - await auditorEvent?.fail({ - // TODO(Rugvip): Seems like there aren't proper types for AggregateError yet - error: (AggregateError as any)(errors, 'Could not validate entity'), - }); - - res.status(400).json({ - errors, - }); - } - - await auditorEvent?.success(); - - return res.status(200).end(); + body = await validateRequestBody(req, bodySchema); + entity = validateEntityEnvelope(body.entity); + location = parseLocationRef(body.location); + if (location.type !== 'url') + throw new TypeError( + `Invalid location ref ${body.location}, only 'url:' is supported, e.g. url:https://host/path`, + ); } catch (err) { await auditorEvent?.fail({ error: err, }); - throw err; + + return res.status(400).json({ + errors: [serializeError(err)], + }); } - }); - } + + const credentials = await httpAuth.credentials(req); + const authorizedValidationService = new AuthorizedValidationService( + orchestrator, + permissionsService, + ); + const processingResult = await authorizedValidationService.process( + { + entity: { + ...entity, + metadata: { + ...entity.metadata, + annotations: { + [ANNOTATION_LOCATION]: body.location, + [ANNOTATION_ORIGIN_LOCATION]: body.location, + ...entity.metadata.annotations, + }, + }, + }, + }, + credentials, + ); + + if (!processingResult.ok) { + const errors = processingResult.errors.map(e => serializeError(e)); + + await auditorEvent?.fail({ + // TODO(Rugvip): Seems like there aren't proper types for AggregateError yet + error: (AggregateError as any)(errors, 'Could not validate entity'), + }); + + res.status(400).json({ + errors, + }); + } + + await auditorEvent?.success(); + + return res.status(200).end(); + } catch (err) { + await auditorEvent?.fail({ + error: err, + }); + throw err; + } + }); return router; } diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index 719c5e6ccf..486d1bfb99 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -296,6 +296,7 @@ class TestHarness { knex: options.db, orchestrator, stitcher, + scheduler: mockServices.scheduler(), createHash: () => createHash('sha1'), pollingIntervalMs: 50, onProcessingError: event => { From a919ca34b50bc4213dfed70062e87448f9340809 Mon Sep 17 00:00:00 2001 From: Stanislav Cherkasov <150145013+stanislav-c@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:31:19 +0200 Subject: [PATCH 079/177] feat: truncate document text to fit PostgreSQL index size limit (#30943) Signed-off-by: Stanislav C <150145013+stanislav-c@users.noreply.github.com> --- .changeset/brown-falcons-own.md | 5 +++ .../search-backend-module-pg/report.api.md | 12 +++++- .../PgSearchEngineIndexer.test.ts | 43 ++++++++++++++++++- .../PgSearchEngine/PgSearchEngineIndexer.ts | 37 +++++++++++----- .../database/DatabaseDocumentStore.test.ts | 27 ++++++++++++ .../src/database/DatabaseDocumentStore.ts | 19 ++++++-- .../src/database/types.ts | 6 ++- 7 files changed, 131 insertions(+), 18 deletions(-) create mode 100644 .changeset/brown-falcons-own.md diff --git a/.changeset/brown-falcons-own.md b/.changeset/brown-falcons-own.md new file mode 100644 index 0000000000..e38f3bbfbc --- /dev/null +++ b/.changeset/brown-falcons-own.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-pg': patch +--- + +Truncate long docs to fit PG index size limit diff --git a/plugins/search-backend-module-pg/report.api.md b/plugins/search-backend-module-pg/report.api.md index ff2129b4bb..67e60b7822 100644 --- a/plugins/search-backend-module-pg/report.api.md +++ b/plugins/search-backend-module-pg/report.api.md @@ -24,7 +24,11 @@ export type ConcretePgSearchQuery = { export class DatabaseDocumentStore implements DatabaseStore { constructor(db: Knex); // (undocumented) - completeInsert(tx: Knex.Transaction, type: string): Promise; + completeInsert( + tx: Knex.Transaction, + type: string, + truncate?: boolean, + ): Promise; // (undocumented) static create(database: DatabaseService): Promise; // (undocumented) @@ -51,7 +55,11 @@ export class DatabaseDocumentStore implements DatabaseStore { // @public (undocumented) export interface DatabaseStore { // (undocumented) - completeInsert(tx: Knex.Transaction, type: string): Promise; + completeInsert( + tx: Knex.Transaction, + type: string, + truncate?: boolean, + ): Promise; // (undocumented) getTransaction(): Promise; // (undocumented) diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts index 37af4f00f0..7554cebfd7 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.test.ts @@ -65,11 +65,50 @@ describe('PgSearchEngineIndexer', () => { 'my-type', documents, ); - expect(database.completeInsert).toHaveBeenCalledWith(tx, 'my-type'); + expect(database.completeInsert).toHaveBeenCalledWith(tx, 'my-type', false); expect(tx.commit).toHaveBeenCalled(); expect(tx.rollback).not.toHaveBeenCalled(); }); + it('should insert documents that are too long for tsvector', async () => { + const documents = [ + { title: 'Hello World', text: 'Lorem Ipsum', location: 'location-1' }, + { + location: 'location-2', + text: 'Hello World', + title: 'Dolor sit amet', + }, + ]; + + const tsvectorError = new Error('string is too long for tsvector'); + database.completeInsert.mockRejectedValueOnce(tsvectorError); + + await TestPipeline.fromIndexer(indexer).withDocuments(documents).execute(); + + expect(database.getTransaction).toHaveBeenCalledTimes(1); + expect(database.prepareInsert).toHaveBeenCalledTimes(1); + expect(database.insertDocuments).toHaveBeenCalledWith( + tx, + 'my-type', + documents, + ); + expect(database.completeInsert).toHaveBeenCalledTimes(2); + expect(database.completeInsert).toHaveBeenNthCalledWith( + 1, + tx, + 'my-type', + false, + ); + expect(database.completeInsert).toHaveBeenNthCalledWith( + 2, + tx, + 'my-type', + true, + ); + expect(tx.commit).toHaveBeenCalled(); + expect(tx.rollback).toHaveBeenCalledTimes(1); + }); + it('should batch insert documents', async () => { const documents = range(350).map(i => ({ title: `Hello World ${i}`, @@ -82,7 +121,7 @@ describe('PgSearchEngineIndexer', () => { expect(database.getTransaction).toHaveBeenCalledTimes(1); expect(database.prepareInsert).toHaveBeenCalledTimes(1); expect(database.insertDocuments).toHaveBeenCalledTimes(4); - expect(database.completeInsert).toHaveBeenCalledWith(tx, 'my-type'); + expect(database.completeInsert).toHaveBeenCalledWith(tx, 'my-type', false); }); it('should rollback transaction if no documents indexed', async () => { diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.ts index 2e1997c42c..ad8c4f093f 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngineIndexer.ts @@ -85,16 +85,33 @@ export class PgSearchEngineIndexer extends BatchSearchEngineIndexer { return; } - // Attempt to complete and commit the transaction. - try { - await this.store.completeInsert(this.tx!, this.type); - this.tx!.commit(); - } catch (e) { - // Otherwise, rollback the transaction and re-throw the error so that the - // stream can be closed and destroyed properly. - this.tx!.rollback!(e); - throw e; - } + // Do not truncate text by default + let retryTruncated = false; + + do { + // Attempt to complete and commit the transaction. + try { + await this.store.completeInsert(this.tx!, this.type, retryTruncated); + this.tx!.commit(); + retryTruncated = false; + } catch (e) { + // Otherwise, rollback the transaction and re-throw the error so that the + // stream can be closed and destroyed properly. + this.tx!.rollback!(e); + + if ( + e instanceof Error && + e.message.includes('string is too long for tsvector') && + !retryTruncated + ) { + // If the error is due to a string being too long for tsvector, we + // retry the operation with truncated text. + retryTruncated = true; + } else { + throw e; + } + } + } while (retryTruncated); } /** diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts index 0029b67bd6..f25351b3a5 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.test.ts @@ -22,6 +22,7 @@ import { import { IndexableDocument } from '@backstage/plugin-search-common'; import { PgSearchHighlightOptions } from '../PgSearchEngine'; import { DatabaseDocumentStore } from './DatabaseDocumentStore'; +import { v4 as uuidv4 } from 'uuid'; const highlightOptions: PgSearchHighlightOptions = { preTag: '', @@ -122,6 +123,32 @@ describe('DatabaseDocumentStore', () => { }, ); + it.each(databases.eachSupportedId())( + 'should insert truncated documents, %p', + async databaseId => { + const { store, knex } = await createStore(databaseId); + + await store.transaction(async tx => { + await store.prepareInsert(tx); + + await store.insertDocuments(tx, 'my-type', [ + { + title: 'TITLE 1', + text: Array.from({ length: 100000 }) + .map(() => uuidv4()) // text tokens should be unique to overflow the tsvector indexing and trigger truncation + .join(' '), + location: 'LOCATION-1', + }, + ]); + await store.completeInsert(tx, 'my-type', true); + }); + + expect( + await knex.count('*').where('type', 'my-type').from('documents'), + ).toEqual([{ count: '1' }]); + }, + ); + it.each(databases.eachSupportedId())( 'should insert documents in batches, %p', async databaseId => { diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts index 8bff8c0a60..0c0e838f0d 100644 --- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts +++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts @@ -102,13 +102,23 @@ export class DatabaseDocumentStore implements DatabaseStore { ); } - async completeInsert(tx: Knex.Transaction, type: string): Promise { + async completeInsert( + tx: Knex.Transaction, + type: string, + truncate = false, + ): Promise { + const documentSelect = truncate + ? tx.raw( + `jsonb_set(document, '{text}', to_jsonb(LEFT(document->>'text', 50000))) as document`, + ) + : 'document'; + // Copy all new rows into the documents table await tx .insert( tx('documents_to_insert').select( 'type', - 'document', + documentSelect, 'hash', ), ) @@ -139,7 +149,10 @@ export class DatabaseDocumentStore implements DatabaseStore { await tx('documents_to_insert').insert( documents.map(document => ({ type, - document, + document: { + ...document, + // text: truncateDocsText(document.text), + }, })), ); } diff --git a/plugins/search-backend-module-pg/src/database/types.ts b/plugins/search-backend-module-pg/src/database/types.ts index 5093a170ac..f8529fbebe 100644 --- a/plugins/search-backend-module-pg/src/database/types.ts +++ b/plugins/search-backend-module-pg/src/database/types.ts @@ -38,7 +38,11 @@ export interface DatabaseStore { type: string, documents: IndexableDocument[], ): Promise; - completeInsert(tx: Knex.Transaction, type: string): Promise; + completeInsert( + tx: Knex.Transaction, + type: string, + truncate?: boolean, + ): Promise; query( tx: Knex.Transaction, pgQuery: PgSearchQuery, From 498332ae5348bcabdbb63f0e4dccf565466e82fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 22 Sep 2025 16:45:41 +0200 Subject: [PATCH 080/177] remove more unused things MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../DefaultProcessingDatabase.test.ts | 1 + .../src/database/DefaultProcessingDatabase.ts | 12 ++--- .../DefaultCatalogProcessingEngine.test.ts | 9 ++++ .../DefaultCatalogProcessingEngine.ts | 10 ++-- ...faultCatalogProcessingOrchestrator.test.ts | 9 +--- .../DefaultCatalogProcessingOrchestrator.ts | 4 -- .../src/service/CatalogBuilder.ts | 53 ++----------------- .../src/service/CatalogPlugin.ts | 3 +- .../src/service/DefaultRefreshService.test.ts | 2 + .../src/tests/integration.test.ts | 3 +- .../getProcessableEntitiesPerformance.test.ts | 1 + 11 files changed, 32 insertions(+), 75 deletions(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index a09e938575..790762a428 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -58,6 +58,7 @@ describe('DefaultProcessingDatabase', () => { minSeconds: 100, maxSeconds: 150, }), + events: mockServices.events.mock(), }), }; } diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 81c26c66ab..50c3cbb1c8 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -42,11 +42,7 @@ import { checkLocationKeyConflict } from './operations/refreshState/checkLocatio import { insertUnprocessedEntity } from './operations/refreshState/insertUnprocessedEntity'; import { updateUnprocessedEntity } from './operations/refreshState/updateUnprocessedEntity'; import { generateStableHash, generateTargetKey } from './util'; -import { - EventBroker, - EventParams, - EventsService, -} from '@backstage/plugin-events-node'; +import { EventParams, EventsService } from '@backstage/plugin-events-node'; import { DateTime } from 'luxon'; import { CATALOG_CONFLICTS_TOPIC } from '../constants'; import { CatalogConflictEventPayload } from '../catalog/types'; @@ -64,7 +60,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { database: Knex; logger: LoggerService; refreshInterval: ProcessingIntervalFunction; - eventBroker?: EventBroker | EventsService; + events: EventsService; }, ) { initDatabaseMetrics(options.database); @@ -367,7 +363,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { this.options.logger.warn( `Detected conflicting entityRef ${entityRef} already referenced by ${conflictingKey} and now also ${locationKey}`, ); - if (this.options.eventBroker && locationKey) { + if (locationKey) { const eventParams: EventParams = { topic: CATALOG_CONFLICTS_TOPIC, eventPayload: { @@ -378,7 +374,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { lastConflictAt: DateTime.now().toISO()!, }, }; - await this.options.eventBroker?.publish(eventParams); + await this.options.events.publish(eventParams); } } } diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts index 93c22aab1e..5e6312ec4a 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts @@ -71,6 +71,7 @@ describe('DefaultCatalogProcessingEngine', () => { stitcher: stitcher, createHash: () => hash, scheduler: mockServices.scheduler(), + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -139,6 +140,7 @@ describe('DefaultCatalogProcessingEngine', () => { stitcher: stitcher, scheduler: mockServices.scheduler(), createHash: () => hash, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -223,6 +225,7 @@ describe('DefaultCatalogProcessingEngine', () => { stitcher: stitcher, scheduler: mockServices.scheduler(), createHash: () => hash, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -301,6 +304,7 @@ describe('DefaultCatalogProcessingEngine', () => { stitcher: stitcher, scheduler: mockServices.scheduler(), createHash: () => hash, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -362,6 +366,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -478,6 +483,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -584,6 +590,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -668,6 +675,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -757,6 +765,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, pollingIntervalMs: 100, + events: mockServices.events.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index 7061309175..b2a562ea6a 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -36,7 +36,7 @@ import { withActiveSpan, } from '../util/opentelemetry'; import { deleteOrphanedEntities } from '../database/operations/util/deleteOrphanedEntities'; -import { EventBroker, EventsService } from '@backstage/plugin-events-node'; +import { EventsService } from '@backstage/plugin-events-node'; import { CATALOG_ERRORS_TOPIC } from '../constants'; import { LoggerService, SchedulerService } from '@backstage/backend-plugin-api'; @@ -73,7 +73,7 @@ export class DefaultCatalogProcessingEngine { errors: Error[]; }) => Promise | void; private readonly tracker: ProgressTracker; - private readonly eventBroker?: EventBroker | EventsService; + private readonly events: EventsService; private stopFunc?: () => void; @@ -93,7 +93,7 @@ export class DefaultCatalogProcessingEngine { errors: Error[]; }) => Promise | void; tracker?: ProgressTracker; - eventBroker?: EventBroker | EventsService; + events: EventsService; }) { this.config = options.config; this.scheduler = options.scheduler; @@ -107,7 +107,7 @@ export class DefaultCatalogProcessingEngine { this.orphanCleanupIntervalMs = options.orphanCleanupIntervalMs ?? 30_000; this.onProcessingError = options.onProcessingError; this.tracker = options.tracker ?? progressTracker(); - this.eventBroker = options.eventBroker; + this.events = options.events; this.stopFunc = undefined; } @@ -201,7 +201,7 @@ export class DefaultCatalogProcessingEngine { const location = unprocessedEntity?.metadata?.annotations?.[ANNOTATION_LOCATION]; if (result.errors.length) { - this.eventBroker?.publish({ + this.events.publish({ topic: CATALOG_ERRORS_TOPIC, eventPayload: { entity: entityRef, diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts index 31d7c34b94..beb3611206 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts @@ -97,7 +97,6 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser: defaultEntityDataParser, policy: EntityPolicies.allOf([]), rulesEnforcer: { isAllowed: () => true }, - legacySingleProcessorValidation: false, }); it('runs a minimal processing', async () => { @@ -192,7 +191,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => { }); }); - it('runs all processor validations when asked to', async () => { + it('runs all processor validations', async () => { const validate = jest.fn(async () => true); const processor1: CatalogProcessor = { getProcessorName: () => 'processor1', @@ -213,7 +212,6 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser: defaultEntityDataParser, policy: EntityPolicies.allOf([]), rulesEnforcer: { isAllowed: () => true }, - legacySingleProcessorValidation: true, }); const modern = new DefaultCatalogProcessingOrchestrator({ @@ -226,13 +224,12 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser: defaultEntityDataParser, policy: EntityPolicies.allOf([]), rulesEnforcer: { isAllowed: () => true }, - legacySingleProcessorValidation: false, }); await expect(legacy.process({ entity })).resolves.toMatchObject({ ok: true, }); - expect(validate).toHaveBeenCalledTimes(1); + expect(validate).toHaveBeenCalledTimes(2); validate.mockClear(); @@ -291,7 +288,6 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser, policy: EntityPolicies.allOf([]), rulesEnforcer, - legacySingleProcessorValidation: false, }); rulesEnforcer.isAllowed.mockReturnValueOnce(true); @@ -333,7 +329,6 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser, policy: EntityPolicies.allOf([new FailingEntityPolicy()]), rulesEnforcer, - legacySingleProcessorValidation: false, }); await expect( diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index b1fcba5d40..79873264a3 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -95,7 +95,6 @@ export class DefaultCatalogProcessingOrchestrator parser: CatalogProcessorParser; policy: EntityPolicy; rulesEnforcer: CatalogRulesEnforcer; - legacySingleProcessorValidation: boolean; }, ) {} @@ -309,9 +308,6 @@ export class DefaultCatalogProcessingOrchestrator ); if (thisValid) { valid = true; - if (this.options.legacySingleProcessorValidation) { - break; - } } } catch (e) { throw new InputError( diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 40fcc3a624..0b35e84102 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -55,7 +55,7 @@ import { PlaceholderResolver, ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; -import { EventBroker, EventsService } from '@backstage/plugin-events-node'; +import { EventsService } from '@backstage/plugin-events-node'; import { Permission, PermissionAuthorizer, @@ -123,6 +123,7 @@ export type CatalogEnvironment = { auth: AuthService; httpAuth: HttpAuthService; auditor: AuditorService; + events: EventsService; }; /** @@ -168,8 +169,6 @@ export class CatalogBuilder { private readonly permissions: Permission[]; private readonly permissionRules: CatalogPermissionRuleInput[]; private allowedLocationType: string[]; - private legacySingleProcessorValidation = false; - private eventBroker?: EventBroker | EventsService; /** * Creates a catalog builder. @@ -216,31 +215,6 @@ export class CatalogBuilder { return this; } - /** - * Processing interval determines how often entities should be processed. - * Seconds provided will be multiplied by 1.5 - * The default processing interval is 100-150 seconds. - * setting this too low will potentially deplete request quotas to upstream services. - */ - setProcessingIntervalSeconds(seconds: number): CatalogBuilder { - this.processingInterval = createRandomProcessingInterval({ - minSeconds: seconds, - maxSeconds: seconds * 1.5, - }); - return this; - } - - /** - * Overwrites the default processing interval function used to spread - * entity updates in the catalog. - */ - setProcessingInterval( - processingInterval: ProcessingIntervalFunction, - ): CatalogBuilder { - this.processingInterval = processingInterval; - return this; - } - /** * Overwrites the default location analyzer. */ @@ -427,23 +401,6 @@ export class CatalogBuilder { return this; } - /** - * Enables the legacy behaviour of canceling validation early whenever only a - * single processor declares an entity kind to be valid. - */ - useLegacySingleProcessorValidation(): this { - this.legacySingleProcessorValidation = true; - return this; - } - - /** - * Enables the publishing of events for conflicts in the DefaultProcessingDatabase - */ - setEventBroker(broker: EventBroker | EventsService): CatalogBuilder { - this.eventBroker = broker; - return this; - } - /** * Wires up and returns all of the component parts of the catalog */ @@ -461,6 +418,7 @@ export class CatalogBuilder { auditor, auth, httpAuth, + events, } = this.env; const enableRelationsCompatibility = Boolean( @@ -485,8 +443,8 @@ export class CatalogBuilder { const processingDatabase = new DefaultProcessingDatabase({ database: dbClient, logger, + events, refreshInterval: this.processingInterval, - eventBroker: this.eventBroker, }); const providerDatabase = new DefaultProviderDatabase({ database: dbClient, @@ -523,7 +481,6 @@ export class CatalogBuilder { logger, parser, policy, - legacySingleProcessorValidation: this.legacySingleProcessorValidation, }); const entitiesCatalog = new AuthorizedEntitiesCatalog( @@ -588,7 +545,7 @@ export class CatalogBuilder { onProcessingError: event => { this.onProcessingError?.(event); }, - eventBroker: this.eventBroker, + events, }); const locationAnalyzer = diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index a9bb2c9285..24147e3cc5 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -271,10 +271,9 @@ export const catalogPlugin = createBackendPlugin({ auth, httpAuth, auditor, + events, }); - builder.setEventBroker(events); - if (processingExtensions.onProcessingErrorHandler) { builder.subscribe({ onProcessingError: processingExtensions.onProcessingErrorHandler, diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index f999400b8a..29519e9e6b 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -57,6 +57,7 @@ describe('DefaultRefreshService', () => { database: knex, logger, refreshInterval: () => 100, + events: mockServices.events.mock(), }), catalogDb: new DefaultCatalogDatabase({ database: knex, @@ -162,6 +163,7 @@ describe('DefaultRefreshService', () => { }, createHash: () => createHash('sha1'), pollingIntervalMs: 50, + events: mockServices.events.mock(), }); return engine; diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index 486d1bfb99..39871583af 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -244,6 +244,7 @@ class TestHarness { const processingDatabase = new DefaultProcessingDatabase({ database: options.db, logger, + events: mockServices.events.mock(), refreshInterval: () => 0.05, }); @@ -273,7 +274,6 @@ class TestHarness { logger, parser: defaultEntityDataParser, policy: EntityPolicies.allOf([]), - legacySingleProcessorValidation: false, }); const stitcher = DefaultStitcher.fromConfig(config, { knex: options.db, @@ -303,6 +303,7 @@ class TestHarness { proxyProgressTracker.reportError(event.unprocessedEntity, event.errors); }, tracker: proxyProgressTracker, + events: mockServices.events.mock(), }); const refresh = new DefaultRefreshService({ database: catalogDatabase }); diff --git a/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts b/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts index e2ed160b42..a1cc1d3238 100644 --- a/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts +++ b/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts @@ -79,6 +79,7 @@ describePerformanceTest('getProcessableEntities', () => { const sut = new DefaultProcessingDatabase({ database: knex, logger: mockServices.logger.mock(), + events: mockServices.events.mock(), refreshInterval: () => 0, }); From 35718b2c10b30eb768610a726de59174a122c461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 22 Sep 2025 20:03:47 +0200 Subject: [PATCH 081/177] Update .changeset/tame-hairs-smash.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/tame-hairs-smash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tame-hairs-smash.md b/.changeset/tame-hairs-smash.md index d74b2ffeb7..db05708132 100644 --- a/.changeset/tame-hairs-smash.md +++ b/.changeset/tame-hairs-smash.md @@ -3,4 +3,4 @@ '@backstage/plugin-bitbucket-cloud-common': patch --- -Allow for passing a pagelen parameter to configure the pagelength property of the BitbucketCloudEntityProvider searchCode pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. +Allow for passing a `pagelen` parameter to configure the `pagelength` property of the `BitbucketCloudEntityProvider` `searchCode` pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. From 8d15a51b3ec5a29cebdf87a609c2ef8530b37075 Mon Sep 17 00:00:00 2001 From: yu-kkurii <32046496+yu-kkurii@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:37:29 +0200 Subject: [PATCH 082/177] update pg search sanitize list (#31083) Signed-off-by: Vladimir Kobzev --- .changeset/nice-readers-judge.md | 5 +++++ .../src/PgSearchEngine/PgSearchEngine.test.ts | 2 +- .../src/PgSearchEngine/PgSearchEngine.ts | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/nice-readers-judge.md diff --git a/.changeset/nice-readers-judge.md b/.changeset/nice-readers-judge.md new file mode 100644 index 0000000000..a70ee8e501 --- /dev/null +++ b/.changeset/nice-readers-judge.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-pg': patch +--- + +Added the < character to the query filter regexp diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts index c56816b475..bc3df76692 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts @@ -133,7 +133,7 @@ describe('PgSearchEngine', () => { it('should sanitize query term', async () => { const actualTranslatedQuery = searchEngine.translator( { - term: 'H&e|l!l*o W\0o(r)l:d', + term: 'H&e|l!l*o < W\0o(r)l:d', pageCursor: '', }, { highlightOptions }, diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index 5b24d71100..57c22fd19f 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -196,7 +196,7 @@ export class PgSearchEngine implements SearchEngine { pgQuery: { pgTerm: query.term .split(/\s/) - .map(p => p.replace(/[\0()|&:*!]/g, '').trim()) + .map(p => p.replace(/[\0()|&:*!<]/g, '').trim()) .filter(p => p !== '') .map(p => `(${JSON.stringify(p)} | ${JSON.stringify(p)}:*)`) .join('&'), From 226ef498e224ceb58c2c90b98683c0607785d644 Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Tue, 23 Sep 2025 08:51:35 +0100 Subject: [PATCH 083/177] simplify client.hasFile to always use project.id in shouldProcessProject Signed-off-by: Claire Peng --- .../src/providers/GitlabDiscoveryEntityProvider.ts | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index 869374de07..e52c231d46 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -589,22 +589,12 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { project.default_branch ?? this.config.fallbackBranch; - // Find file with namespaced path (most use-cases) - let hasFile = await client.hasFile( - project.path_with_namespace ?? '', + const hasFile = await client.hasFile( + project.id.toString(), project_branch, this.config.catalogFile, ); - // Find file with project id if namespace failed - if (!hasFile) { - hasFile = await client.hasFile( - project.id.toString(), - project_branch, - this.config.catalogFile, - ); - } - return hasFile; } } From 0443119e7a3a1dd1b086d715a0bf0ff10aa29cf5 Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Tue, 23 Sep 2025 09:16:57 +0100 Subject: [PATCH 084/177] add changeset Signed-off-by: Claire Peng --- .changeset/twelve-oranges-grin.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .changeset/twelve-oranges-grin.md diff --git a/.changeset/twelve-oranges-grin.md b/.changeset/twelve-oranges-grin.md new file mode 100644 index 0000000000..b508a59b0b --- /dev/null +++ b/.changeset/twelve-oranges-grin.md @@ -0,0 +1,20 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Update GitlabDiscoveryEntityProvider to use `project.id` rather than `project.path_with_namespace` for `hasFile` check in `shouldProcessProject` + +Solves [#30147](https://github.com/backstage/backstage/issues/30147): + +> Use of project.id avoids edgecases caused by path encoding or project structure changes +> [...] +> It also simplifies reasoning about the GitLab API usage, since IDs are immutable, while paths are not. + +```diff +const hasFile = await client.hasFile( +- project.path_with_namespace, ++ project.id.toString(), + project_branch, + this.config.catalogFile, +); +``` From baf1cab204a6b4050e015a8222a38b24e6a2ecf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Jerna=C5=9B?= Date: Tue, 23 Sep 2025 11:17:46 +0200 Subject: [PATCH 085/177] docs(scaffolder-gcp): Fix docstrings to mention GCP instead of Azure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Łukasz Jernaś --- .changeset/itchy-falcons-leave.md | 5 +++++ plugins/scaffolder-backend-module-gcp/src/index.ts | 2 +- plugins/scaffolder-backend-module-gcp/src/module.ts | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/itchy-falcons-leave.md diff --git a/.changeset/itchy-falcons-leave.md b/.changeset/itchy-falcons-leave.md new file mode 100644 index 0000000000..93618be48c --- /dev/null +++ b/.changeset/itchy-falcons-leave.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gcp': patch +--- + +Fix docstrings to mention GCP instead of Azure diff --git a/plugins/scaffolder-backend-module-gcp/src/index.ts b/plugins/scaffolder-backend-module-gcp/src/index.ts index 05498e3edd..5e3eced7a4 100644 --- a/plugins/scaffolder-backend-module-gcp/src/index.ts +++ b/plugins/scaffolder-backend-module-gcp/src/index.ts @@ -15,7 +15,7 @@ */ /** - * A module for the scaffolder backend that lets you interact with azure + * A module for the scaffolder backend that lets you interact with GCP * * @packageDocumentation */ diff --git a/plugins/scaffolder-backend-module-gcp/src/module.ts b/plugins/scaffolder-backend-module-gcp/src/module.ts index 0f2f37f5af..ad9ebcecee 100644 --- a/plugins/scaffolder-backend-module-gcp/src/module.ts +++ b/plugins/scaffolder-backend-module-gcp/src/module.ts @@ -22,7 +22,7 @@ import { GcpBucketWorkspaceProvider } from './providers/GcpBucketWorkspaceProvid /** * @public - * The Azure Module for the Scaffolder Backend + * The GCP Module for the Scaffolder Backend */ export const gcpBucketModule = createBackendModule({ moduleId: 'gcp', From 2d3e2b279569c7313cc57ac719dd6765e0003994 Mon Sep 17 00:00:00 2001 From: vickstrom Date: Tue, 23 Sep 2025 10:12:16 +0200 Subject: [PATCH 086/177] implement support for direct url for AzureBlobStorageUrlReader search function Signed-off-by: vickstrom --- .changeset/calm-trains-tie.md | 5 +++ .../backend-defaults/report-urlReader.api.md | 5 ++- .../lib/AzureBlobStorageUrlReader.ts | 40 +++++++++++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 .changeset/calm-trains-tie.md diff --git a/.changeset/calm-trains-tie.md b/.changeset/calm-trains-tie.md new file mode 100644 index 0000000000..8c399ba123 --- /dev/null +++ b/.changeset/calm-trains-tie.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': minor +--- + +implement support for direct url for AzureBlobStorageUrlReader search function diff --git a/packages/backend-defaults/report-urlReader.api.md b/packages/backend-defaults/report-urlReader.api.md index 03a112abc7..039d51808d 100644 --- a/packages/backend-defaults/report-urlReader.api.md +++ b/packages/backend-defaults/report-urlReader.api.md @@ -87,7 +87,10 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { options?: UrlReaderServiceReadUrlOptions, ): Promise; // (undocumented) - search(): Promise; + search( + url: string, + options?: UrlReaderServiceSearchOptions, + ): Promise; // (undocumented) toString(): string; } diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts index e04e2c5b47..1953beabe9 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts @@ -21,7 +21,11 @@ import { StorageSharedKeyCredential, } from '@azure/storage-blob'; import { ReaderFactory, ReadTreeResponseFactory } from './types'; -import { ForwardedError, NotModifiedError } from '@backstage/errors'; +import { + assertError, + ForwardedError, + NotModifiedError, +} from '@backstage/errors'; import { Readable } from 'stream'; import { relative } from 'path/posix'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; @@ -37,6 +41,7 @@ import { UrlReaderServiceReadTreeResponse, UrlReaderServiceReadUrlOptions, UrlReaderServiceReadUrlResponse, + UrlReaderServiceSearchOptions, UrlReaderServiceSearchResponse, } from '@backstage/backend-plugin-api'; @@ -190,13 +195,13 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { const { path, container } = parseUrl(url); const containerClient = await this.createContainerClient(container); - const blobs = containerClient.listBlobsFlat({ prefix: path }); const responses = []; for await (const blob of blobs) { const blobClient = containerClient.getBlobClient(blob.name); + const downloadBlockBlobResponse = await blobClient.download( undefined, undefined, @@ -221,8 +226,35 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { } } - async search(): Promise { - throw new Error('AzureBlobStorageUrlReader does not implement search'); + async search( + url: string, + options?: UrlReaderServiceSearchOptions, + ): Promise { + const { path } = parseUrl(url); + + if (path.match(/[*?]/)) { + throw new Error( + 'Glob search pattern not implemented for AzureBlobStorageUrlReader', + ); + } + + try { + const data = await this.readUrl(url, options); + + return { + files: [ + { + url: url, + content: data.buffer, + lastModifiedAt: data.lastModifiedAt, + }, + ], + etag: data.etag ?? '', + }; + } catch (error) { + assertError(error); + throw error; + } } toString() { From 06eaf14c052a556e2aa6f119f0549954db80c2bc Mon Sep 17 00:00:00 2001 From: vickstrom Date: Tue, 23 Sep 2025 10:38:07 +0200 Subject: [PATCH 087/177] add test for AzureBlobStorageUrlReader Signed-off-by: vickstrom --- .../lib/AzureBlobStorageUrlReader.test.ts | 359 ++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.test.ts diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.test.ts new file mode 100644 index 0000000000..93f0d81441 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.test.ts @@ -0,0 +1,359 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as AzureStorage from '@azure/storage-blob'; +import { ConfigReader } from '@backstage/config'; +import { JsonObject } from '@backstage/types'; +import { DefaultReadTreeResponseFactory } from './tree'; +import { + AzureBlobStorageUrlReader, + parseUrl, +} from './AzureBlobStorageUrlReader'; +import { + DefaultAzureCredentialsManager, + ScmIntegrations, +} from '@backstage/integration'; +import { UrlReaderPredicateTuple } from './types'; +import { mockServices } from '@backstage/backend-test-utils'; +import { Readable } from 'stream'; + +// Mock Azure Blob Storage SDK +const mockBlobDownload = jest.fn(); +const mockGetBlobClient = jest.fn(() => ({ + download: mockBlobDownload, +})); +const mockListBlobsFlat = jest.fn(); + +class MockContainerClient { + getBlobClient = mockGetBlobClient; + listBlobsFlat = mockListBlobsFlat; +} + +class MockBlobServiceClient { + getContainerClient = jest.fn(() => new MockContainerClient()); +} + +jest + .spyOn(AzureStorage, 'BlobServiceClient') + .mockReturnValue(new MockBlobServiceClient() as any); +jest + .spyOn(AzureStorage, 'StorageSharedKeyCredential') + .mockReturnValue({} as any); + +const treeResponseFactory = DefaultReadTreeResponseFactory.create({ + config: new ConfigReader({}), +}); + +describe('parseUrl', () => { + it('parses Azure Blob Storage URLs correctly', () => { + expect( + parseUrl( + 'https://test-account.blob.core.windows.net/mycontainer/path/to/file.yaml', + ), + ).toEqual({ + path: 'path/to/file.yaml', + container: 'mycontainer', + }); + + expect( + parseUrl( + 'https://test-account.blob.core.windows.net/mycontainer/file.yaml', + ), + ).toEqual({ + path: 'file.yaml', + container: 'mycontainer', + }); + }); + + it('handles URLs with no path correctly', () => { + expect( + parseUrl('https://test-account.blob.core.windows.net/mycontainer/'), + ).toEqual({ + path: '', + container: 'mycontainer', + }); + }); + + it('throws error for invalid URLs', () => { + expect(() => + parseUrl('https://test-account.blob.core.windows.net/'), + ).toThrow('Invalid Azure Blob Storage URL format'); + }); +}); + +describe('AzureBlobStorageUrlReader', () => { + const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => { + return AzureBlobStorageUrlReader.factory({ + config: new ConfigReader(config), + logger: mockServices.logger.mock(), + treeResponseFactory, + }); + }; + + it('creates a reader with minimal config', () => { + const entries = createReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + }, + ], + }, + }); + + expect(entries).toHaveLength(1); + }); + + describe('predicates', () => { + const readers = createReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + }, + ], + }, + }); + const predicate = readers[0].predicate; + + it('returns true for the correct azure blob storage host', () => { + expect( + predicate(new URL('https://test-account.blob.core.windows.net')), + ).toBe(true); + }); + + it('returns false for an incorrect host', () => { + expect( + predicate(new URL('https://wrongaccount.blob.core.windows.net')), + ).toBe(false); + }); + }); + + describe('toString', () => { + it('returns a string representation with account name and auth status', () => { + const config = new ConfigReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + accountKey: 'test-key', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const credsManager = + DefaultAzureCredentialsManager.fromIntegrations(integrations); + const reader = new AzureBlobStorageUrlReader( + credsManager, + integrations.azureBlobStorage.list()[0], + { treeResponseFactory }, + ); + + expect(reader.toString()).toBe( + 'azureBlobStorage{accountName=test-account,authed=true}', + ); + }); + + it('shows authed=false when no account key provided', () => { + const config = new ConfigReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const credsManager = + DefaultAzureCredentialsManager.fromIntegrations(integrations); + const reader = new AzureBlobStorageUrlReader( + credsManager, + integrations.azureBlobStorage.list()[0], + { treeResponseFactory }, + ); + + expect(reader.toString()).toBe( + 'azureBlobStorage{accountName=test-account,authed=false}', + ); + }); + }); + + describe('readUrl', () => { + const [{ reader }] = createReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + accountKey: 'test-key', + }, + ], + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('returns contents of a blob via buffer', async () => { + mockBlobDownload.mockResolvedValue({ + readableStreamBody: Readable.from( + Buffer.from('site_name: Test Azure Blob'), + ), + etag: '"etag"', + lastModified: new Date('2025-01-01T00:00:00Z'), + }); + + const { buffer, etag, lastModifiedAt } = await reader.readUrl( + 'https://test-account.blob.core.windows.net/test-container/test-file.yaml', + ); + + expect(etag).toBe('"etag"'); + expect(lastModifiedAt).toEqual(new Date('2025-01-01T00:00:00Z')); + const response = await buffer(); + expect(response.toString()).toBe('site_name: Test Azure Blob'); + }); + + it('handles Azure SDK errors', async () => { + mockBlobDownload.mockRejectedValue(new Error('Blob not found')); + + await expect( + reader.readUrl( + 'https://test-account.blob.core.windows.net/test-container/nonexistent.yaml', + ), + ).rejects.toThrow('Could not retrieve file from Azure Blob Storage'); + }); + }); + + describe('readTree', () => { + const [{ reader }] = createReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + accountKey: 'test-key', + }, + ], + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + const mockBlobs = [ + { + name: 'prefix/file1.yaml', + properties: { + lastModified: new Date('2025-01-01T00:00:00Z'), + }, + }, + { + name: 'prefix/subdir/file2.yaml', + properties: { + lastModified: new Date('2024-01-01T00:00:00Z'), + }, + }, + ]; + + mockBlobDownload.mockResolvedValue({ + readableStreamBody: Readable.from( + Buffer.from('site_name: Test Azure Blob'), + ), + }); + + mockListBlobsFlat.mockReturnValue({ + [Symbol.asyncIterator]: async function* generateBlobs() { + for (const blob of mockBlobs) { + yield blob; + } + }, + }); + }); + + it('returns contents of blobs in a container', async () => { + const response = await reader.readTree( + 'https://test-account.blob.core.windows.net/test-container/prefix', + ); + const files = await response.files(); + + expect(files).toHaveLength(2); + const file1Content = await files[0].content(); + expect(file1Content.toString()).toBe('site_name: Test Azure Blob'); + }); + }); + + describe('search', () => { + const [{ reader }] = createReader({ + integrations: { + azureBlobStorage: [ + { + accountName: 'test-account', + accountKey: 'test-key', + }, + ], + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return a file when given an exact valid url', async () => { + mockBlobDownload.mockResolvedValue({ + readableStreamBody: Readable.from( + Buffer.from('site_name: Test Azure Blob'), + ), + etag: '"etag"', + lastModified: new Date('2025-01-01T00:00:00Z'), + }); + + const data = await reader.search( + 'https://test-account.blob.core.windows.net/test-container/test-file.yaml', + ); + + expect(data.etag).toBe('"etag"'); + expect(data.files.length).toBe(1); + expect(data.files[0].url).toBe( + 'https://test-account.blob.core.windows.net/test-container/test-file.yaml', + ); + expect((await data.files[0].content()).toString()).toEqual( + 'site_name: Test Azure Blob', + ); + }); + + it('should handle Azure SDK errors from readUrl', async () => { + mockBlobDownload.mockRejectedValue(new Error('Blob not found')); + + await expect( + reader.search( + 'https://test-account.blob.core.windows.net/test-container/missing.yaml', + ), + ).rejects.toThrow('Could not retrieve file from Azure Blob Storage'); + }); + + it('throws if given URL with wildcard', async () => { + await expect( + reader.search( + 'https://test-account.blob.core.windows.net/test-container/test-*.yaml', + ), + ).rejects.toThrow( + 'Glob search pattern not implemented for AzureBlobStorageUrlReader', + ); + }); + }); +}); From a9b88beaaae397c4146bb11999ed98d10f0ccbba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Tue, 23 Sep 2025 12:08:01 +0200 Subject: [PATCH 088/177] fix(bui): Enable tooltips on disabled buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- .changeset/moody-singers-deny.md | 5 +++++ .../ui/src/components/Button/Button.stories.tsx | 10 ++++++++++ packages/ui/src/components/Button/Button.tsx | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 .changeset/moody-singers-deny.md diff --git a/.changeset/moody-singers-deny.md b/.changeset/moody-singers-deny.md new file mode 100644 index 0000000000..28072baf4b --- /dev/null +++ b/.changeset/moody-singers-deny.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Enable tooltips on disabled buttons with automatic wrapper diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index db8e999f98..1604c04eb4 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -19,6 +19,7 @@ import { Button } from './Button'; import { Flex } from '../Flex'; import { Text } from '../Text'; import { Icon } from '../Icon'; +import { Tooltip, TooltipTrigger } from '../Tooltip'; const meta = { title: 'Backstage UI/Button', @@ -216,3 +217,12 @@ export const Playground: Story = {
), }; + +export const DisabledWithTooltips: Story = { + render: () => ( + + + Why this is disabled + + ), +}; diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index 40879e51ed..9f658fd00a 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -16,7 +16,7 @@ import clsx from 'clsx'; import { forwardRef, Ref } from 'react'; -import { Button as RAButton } from 'react-aria-components'; +import { Button as RAButton, Focusable } from 'react-aria-components'; import type { ButtonProps } from './types'; import { useStyles } from '../../hooks/useStyles'; @@ -30,6 +30,7 @@ export const Button = forwardRef( iconEnd, children, className, + isDisabled, ...rest } = props; @@ -38,18 +39,29 @@ export const Button = forwardRef( variant, }); - return ( + const btn = ( {iconStart} {children} {iconEnd} ); + + return isDisabled ? ( + + + {btn} + + + ) : ( + btn + ); }, ); From dbb8c3b26e36599c06ead57f7f7a78f0a69a9f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 23 Sep 2025 13:16:52 +0200 Subject: [PATCH 089/177] Update .changeset/itchy-falcons-leave.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/itchy-falcons-leave.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/itchy-falcons-leave.md b/.changeset/itchy-falcons-leave.md index 93618be48c..07188e08c5 100644 --- a/.changeset/itchy-falcons-leave.md +++ b/.changeset/itchy-falcons-leave.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-backend-module-gcp': patch --- -Fix docstrings to mention GCP instead of Azure +Fix documentation strings to mention GCP instead of Azure From 4adbb03a272089649fbfbda3d834644fb0b9e971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Tue, 23 Sep 2025 14:26:18 +0200 Subject: [PATCH 090/177] fix(bui): Fix SearchField onChange prop and add onChange story MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- .changeset/tired-mice-cheer.md | 5 ++++ .../SearchField/SearchField.stories.tsx | 24 ++++++++++++++++++- .../components/SearchField/SearchField.tsx | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changeset/tired-mice-cheer.md diff --git a/.changeset/tired-mice-cheer.md b/.changeset/tired-mice-cheer.md new file mode 100644 index 0000000000..929aae0f59 --- /dev/null +++ b/.changeset/tired-mice-cheer.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Avoid overriding onChange when spreading props diff --git a/packages/ui/src/components/SearchField/SearchField.stories.tsx b/packages/ui/src/components/SearchField/SearchField.stories.tsx index a811d2a451..7cb89dfbfb 100644 --- a/packages/ui/src/components/SearchField/SearchField.stories.tsx +++ b/packages/ui/src/components/SearchField/SearchField.stories.tsx @@ -51,6 +51,7 @@ export const Default: Story = { style: { maxWidth: '300px', }, + 'aria-label': 'Search', }, }; @@ -192,7 +193,7 @@ export const InHeader: Story = { size="small" variant="secondary" /> - + } @@ -272,3 +273,24 @@ export const StartCollapsedWithButtons: Story = { ), }; + +export const StartCollapsedWithOnChange: Story = { + args: { + ...StartCollapsed.args, + }, + render: args => { + const handleChange = (value: string) => { + console.log('Search value:', value); + }; + + return ( + + + + ); + }, +}; diff --git a/packages/ui/src/components/SearchField/SearchField.tsx b/packages/ui/src/components/SearchField/SearchField.tsx index e497cecd49..1c4bb7fa18 100644 --- a/packages/ui/src/components/SearchField/SearchField.tsx +++ b/packages/ui/src/components/SearchField/SearchField.tsx @@ -39,6 +39,7 @@ export const SearchField = forwardRef( secondaryLabel, description, isRequired, + onChange, placeholder = 'Search', startCollapsed = false, 'aria-label': ariaLabel, From e489661c82a6112e8dd685b45dfbea7e9cb46489 Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Tue, 23 Sep 2025 15:13:58 +0300 Subject: [PATCH 091/177] fix(catalog): config for priority and enabled Signed-off-by: Hellgren Heikki --- .changeset/fast-heads-brake.md | 25 ++++++++++ .../software-catalog/configuration.md | 29 +++++++++++ plugins/catalog-backend/config.d.ts | 30 ++++++------ .../src/service/CatalogBuilder.ts | 48 ++++++------------- 4 files changed, 82 insertions(+), 50 deletions(-) create mode 100644 .changeset/fast-heads-brake.md diff --git a/.changeset/fast-heads-brake.md b/.changeset/fast-heads-brake.md new file mode 100644 index 0000000000..bc9f525520 --- /dev/null +++ b/.changeset/fast-heads-brake.md @@ -0,0 +1,25 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Moved catalog processor and provider disabling and priorities under own config objects. + +This is due to issue with some existing providers, such as GitHub, using array syntax for the provider configuration. + +The new config format is not backwards compatible, so users will need to update their config files. The new format +is as follows: + +```yaml +catalog: + providerOptions: + providerA: + disabled: false + providerB: + disabled: true + processorOptions: + processorA: + disabled: false + priority: 10 + processorB: + disabled: true +``` diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md index f8de3034fd..5b293cce1c 100644 --- a/docs/features/software-catalog/configuration.md +++ b/docs/features/software-catalog/configuration.md @@ -90,6 +90,35 @@ also write a _custom processor_ to convert between the existing system and Backstage's descriptor format. This is documented in [External Integrations](external-integrations.md). +### Processor configuration + +You can configure processors under the `catalog.processorOptions` key. You can define +options for each processor by its name. With the processor options you can disable +a processor or set its priority. + +```yaml +catalog: + processorOptions: + processorName: + disabled: false # Defaults to false + priority: 100 +``` + +The priority is a number defining the order in which processors are executed. The lower the number, +the higher the priority. The default priority is `20`. + +## Provider configuration + +It's possible to also disable entity providers using the config. You can configure providers +under the `catalog.providerOptions` key. The key is the provider name. + +```yaml +catalog: + providerOptions: + providerName: + disabled: true +``` + ## Catalog Rules By default, the catalog will only allow the ingestion of entities with the kind diff --git a/plugins/catalog-backend/config.d.ts b/plugins/catalog-backend/config.d.ts index f1b72e5b45..95d28d1eae 100644 --- a/plugins/catalog-backend/config.d.ts +++ b/plugins/catalog-backend/config.d.ts @@ -223,38 +223,36 @@ export interface Config { processingInterval?: HumanDuration | false; /** - * Catalog provide specific configuration. - * Additional configuration for providers are specified in the catalog - * modules. + * Provider-specific additional configuration options. */ - providers?: { + providerOptions?: { /** - * Name is the provider ID, e.g. "bitbucketServer" + * Key is the provider name, value is an object with additional configuration */ [name: string]: { /** - * Whether the provider is enabled or not. Defaults to true. + * Determines whether this provider is disabled or not. If not specified, + * defaults to false. */ - enabled?: boolean; + disabled?: boolean; }; }; + /** - * Configuration for entity processors. Additional configuration for - * processors are specified in the catalog modules. + * Processor-specific additional configuration options. */ - processors?: { + processorOptions?: { /** - * Name is the processor ID, e.g. "catalog-processor" + * Key is the processor name, value is an object with additional configuration */ [name: string]: { /** - * Whether the processor is enabled or not. Defaults to true. + * Determines whether this processor is disabled or not. If not specified, + * defaults to false. */ - enabled?: boolean; + disabled?: boolean; /** - * The priority of the processor, which is used to determine the order in which - * processors are run. The default priority is 20, and lower value means - * that the processor runs earlier. + * The default priority is 20, and lower value means that the processor runs earlier. */ priority?: number; }; diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index dcd677152e..989c2b7184 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -736,13 +736,13 @@ export class CatalogBuilder { try { return ( config.getOptionalNumber( - `catalog.processors.${processor.getProcessorName()}.priority`, + `catalog.processorOptions.${processor.getProcessorName()}.priority`, ) ?? processor.getPriority?.() ?? 20 ); } catch (_) { - // In case the processor config is not an object, just return default priority + // In case the processor config throws, just return default priority return 20; } }; @@ -757,22 +757,12 @@ export class CatalogBuilder { private filterProcessors(processors: CatalogProcessor[]) { const { config } = this.env; - const processorsConfig = config.getOptionalConfig('catalog.processors'); - if (!processorsConfig) { - return processors; - } - - return processors.filter(p => { - try { - const processorConfig = processorsConfig.getOptionalConfig( - p.getProcessorName(), - ); - return processorConfig?.getOptionalBoolean('enabled') ?? true; - } catch (_) { - // In case the processor config is not an object, just include the processor - return true; - } - }); + return processors.filter( + p => + config.getOptionalBoolean( + `catalog.processorOptions.${p.getProcessorName()}.disabled`, + ) !== true, + ); } // TODO(Rugvip): These old processors are removed, for a while we'll be throwing @@ -887,22 +877,12 @@ export class CatalogBuilder { private filterProviders(providers: EntityProvider[]) { const { config } = this.env; - const providersConfig = config.getOptionalConfig('catalog.providers'); - if (!providersConfig) { - return providers; - } - - return providers.filter(p => { - try { - const providerConfig = providersConfig.getOptionalConfig( - p.getProviderName(), - ); - return providerConfig?.getOptionalBoolean('enabled') ?? true; - } catch (_) { - // In case the provider config is not an object, just include the provider - return true; - } - }); + return providers.filter( + p => + config.getOptionalBoolean( + `catalog.providerOptions.${p.getProviderName()}.disabled`, + ) !== true, + ); } private static getDefaultProcessingInterval( From 23829e022c5bd9eb7ead7efd1ef5056744db2e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sofia=20Sj=C3=B6blad?= Date: Tue, 23 Sep 2025 15:13:32 +0200 Subject: [PATCH 092/177] fix(bui): Add missing Cell component props to table documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sofia Sjöblad --- docs-ui/src/content/components/table.props.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs-ui/src/content/components/table.props.ts b/docs-ui/src/content/components/table.props.ts index 1b40055849..d46c6b8ea7 100644 --- a/docs-ui/src/content/components/table.props.ts +++ b/docs-ui/src/content/components/table.props.ts @@ -212,6 +212,11 @@ export const cellPropDefs: Record = { description: "A string representation of the cell's contents, used for features like typeahead.", }, + leadingIcon: { + type: 'enum', + values: ['ReactNode'], + description: 'Optional icon to display before the cell content.', + }, ...classNamePropDefs, ...stylePropDefs, }; From 6ea23c9c6d99f0b04216329198575cae20311b73 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 15:49:58 +0200 Subject: [PATCH 093/177] chore: remove deprecated types and making breaking changes Signed-off-by: benjdlambert --- plugins/scaffolder-backend/report.api.md | 373 ------------------ plugins/scaffolder-backend/src/index.ts | 4 +- .../actions/TemplateActionRegistry.ts | 3 +- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 6 +- .../tasks/NunjucksWorkflowRunner.ts | 2 +- .../src/scaffolder/tasks/StorageTaskBroker.ts | 4 +- .../src/scaffolder/tasks/TaskWorker.ts | 8 +- .../src/scaffolder/tasks/types.ts | 50 +-- plugins/scaffolder-node/report.api.md | 13 +- plugins/scaffolder-node/src/tasks/types.ts | 16 +- 10 files changed, 24 insertions(+), 455 deletions(-) diff --git a/plugins/scaffolder-backend/report.api.md b/plugins/scaffolder-backend/report.api.md index 918718e495..8f9249cc5e 100644 --- a/plugins/scaffolder-backend/report.api.md +++ b/plugins/scaffolder-backend/report.api.md @@ -3,45 +3,21 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AuditorService } from '@backstage/backend-plugin-api'; -import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; -import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { CatalogService } from '@backstage/plugin-catalog-node'; -import { Config } from '@backstage/config'; -import { DatabaseService } from '@backstage/backend-plugin-api'; import { Duration } from 'luxon'; -import { EventsService } from '@backstage/plugin-events-node'; import { HumanDuration } from '@backstage/types'; -import { JsonObject } from '@backstage/types'; -import { Knex } from 'knex'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { PermissionCriteria } from '@backstage/plugin-permission-common'; -import { PermissionEvaluator } from '@backstage/plugin-permission-common'; import { PermissionRule } from '@backstage/plugin-permission-node'; import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { RESOURCE_TYPE_SCAFFOLDER_ACTION } from '@backstage/plugin-scaffolder-common/alpha'; import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha'; import { ScmIntegrations } from '@backstage/integration'; -import { SerializedTask } from '@backstage/plugin-scaffolder-node'; -import { SerializedTaskEvent } from '@backstage/plugin-scaffolder-node'; -import { TaskBroker } from '@backstage/plugin-scaffolder-node'; -import { TaskCompletionState } from '@backstage/plugin-scaffolder-node'; -import { TaskContext } from '@backstage/plugin-scaffolder-node'; -import { TaskFilters } from '@backstage/plugin-scaffolder-node'; -import { TaskRecovery } from '@backstage/plugin-scaffolder-common'; -import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; -import { TaskSpec } from '@backstage/plugin-scaffolder-common'; -import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TaskStatus } from '@backstage/plugin-scaffolder-node'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { TemplateEntityStepV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateFilter } from '@backstage/plugin-scaffolder-node'; import { TemplateGlobal } from '@backstage/plugin-scaffolder-node'; import { TemplateParametersV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { UpdateTaskCheckpointOptions } from '@backstage/plugin-scaffolder-node/alpha'; import { UrlReaderService } from '@backstage/backend-plugin-api'; -import { WorkspaceProvider } from '@backstage/plugin-scaffolder-node/alpha'; // @public (undocumented) export type ActionPermissionRuleInput< @@ -267,359 +243,10 @@ export function createWaitAction(options?: { 'v2' >; -// @public @deprecated -export type CreateWorkerOptions = { - taskBroker: TaskBroker; - actionRegistry: TemplateActionRegistry; - integrations: ScmIntegrations; - workingDirectory: string; - logger: LoggerService; - auditor?: AuditorService; - config?: Config; - additionalTemplateFilters?: Record; - concurrentTasksLimit?: number; - additionalTemplateGlobals?: Record; - permissions?: PermissionEvaluator; - gracefulShutdown?: boolean; -}; - -// @public -export interface CurrentClaimedTask { - createdBy?: string; - secrets?: TaskSecrets; - spec: TaskSpec; - state?: JsonObject; - taskId: string; - workspace?: Promise; -} - -// @public @deprecated -export class DatabaseTaskStore implements TaskStore { - // (undocumented) - cancelTask( - options: TaskStoreEmitOptions< - { - message: string; - } & JsonObject - >, - ): Promise; - // (undocumented) - claimTask(): Promise; - // (undocumented) - cleanWorkspace({ taskId }: { taskId: string }): Promise; - // (undocumented) - completeTask(options: { - taskId: string; - status: TaskStatus; - eventBody: JsonObject; - }): Promise; - // (undocumented) - static create(options: DatabaseTaskStoreOptions): Promise; - // (undocumented) - createTask( - options: TaskStoreCreateTaskOptions, - ): Promise; - // (undocumented) - emitLogEvent( - options: TaskStoreEmitOptions< - { - message: string; - } & JsonObject - >, - ): Promise; - // (undocumented) - getTask(taskId: string): Promise; - // (undocumented) - getTaskState({ taskId }: { taskId: string }): Promise< - | { - state: JsonObject; - } - | undefined - >; - // (undocumented) - heartbeatTask(taskId: string): Promise; - // (undocumented) - list(options: { - createdBy?: string; - status?: TaskStatus; - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - order?: { - order: 'asc' | 'desc'; - field: string; - }[]; - permissionFilters?: PermissionCriteria; - }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; - // (undocumented) - listEvents(options: TaskStoreListEventsOptions): Promise<{ - events: SerializedTaskEvent[]; - }>; - // (undocumented) - listStaleTasks(options: { timeoutS: number }): Promise<{ - tasks: { - taskId: string; - recovery?: TaskRecovery; - }[]; - }>; - // (undocumented) - recoverTasks(options: TaskStoreRecoverTaskOptions): Promise<{ - ids: string[]; - }>; - // (undocumented) - rehydrateWorkspace(options: { - taskId: string; - targetPath: string; - }): Promise; - // (undocumented) - retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise; - // (undocumented) - saveTaskState(options: { taskId: string; state?: JsonObject }): Promise; - // (undocumented) - serializeWorkspace(options: { path: string; taskId: string }): Promise; - // (undocumented) - shutdownTask(options: TaskStoreShutDownTaskOptions): Promise; -} - -// @public @deprecated -export type DatabaseTaskStoreOptions = { - database: DatabaseService | Knex; - events?: EventsService; -}; - // @public const scaffolderPlugin: BackendFeature; export default scaffolderPlugin; -// @public @deprecated -export class TaskManager implements TaskContext { - // (undocumented) - get cancelSignal(): AbortSignal; - // (undocumented) - cleanWorkspace?(): Promise; - // (undocumented) - complete(result: TaskCompletionState, metadata?: JsonObject): Promise; - // (undocumented) - static create( - task: CurrentClaimedTask, - storage: TaskStore, - abortSignal: AbortSignal, - logger: LoggerService, - auth?: AuthService, - config?: Config, - additionalWorkspaceProviders?: Record, - ): TaskManager; - // (undocumented) - get createdBy(): string | undefined; - // (undocumented) - get done(): boolean; - // (undocumented) - emitLog(message: string, logMetadata?: JsonObject): Promise; - // (undocumented) - getInitiatorCredentials(): Promise; - // (undocumented) - getTaskState?(): Promise< - | { - state?: JsonObject; - } - | undefined - >; - // (undocumented) - getWorkspaceName(): Promise; - // (undocumented) - rehydrateWorkspace?(options: { - taskId: string; - targetPath: string; - }): Promise; - // (undocumented) - get secrets(): TaskSecrets | undefined; - // (undocumented) - serializeWorkspace?(options: { path: string }): Promise; - // (undocumented) - get spec(): TaskSpecV1beta3; - // (undocumented) - get taskId(): string; - // (undocumented) - updateCheckpoint?(options: UpdateTaskCheckpointOptions): Promise; -} - -// @public @deprecated -export interface TaskStore { - // (undocumented) - cancelTask?(options: TaskStoreEmitOptions): Promise; - // (undocumented) - claimTask(): Promise; - // (undocumented) - cleanWorkspace?({ taskId }: { taskId: string }): Promise; - // (undocumented) - completeTask(options: { - taskId: string; - status: TaskStatus; - eventBody: JsonObject; - }): Promise; - // (undocumented) - createTask( - options: TaskStoreCreateTaskOptions, - ): Promise; - // (undocumented) - emitLogEvent(options: TaskStoreEmitOptions): Promise; - // (undocumented) - getTask(taskId: string): Promise; - // (undocumented) - getTaskState?({ taskId }: { taskId: string }): Promise< - | { - state: JsonObject; - } - | undefined - >; - // (undocumented) - heartbeatTask(taskId: string): Promise; - // (undocumented) - list?(options: { - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - permissionFilters?: PermissionCriteria; - order?: { - order: 'asc' | 'desc'; - field: string; - }[]; - }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; - // @deprecated (undocumented) - list?(options: { - createdBy?: string; - status?: TaskStatus; - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - order?: { - order: 'asc' | 'desc'; - field: string; - }[]; - }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; - // (undocumented) - listEvents(options: TaskStoreListEventsOptions): Promise<{ - events: SerializedTaskEvent[]; - }>; - // (undocumented) - listStaleTasks(options: { timeoutS: number }): Promise<{ - tasks: { - taskId: string; - }[]; - }>; - // (undocumented) - recoverTasks?(options: TaskStoreRecoverTaskOptions): Promise<{ - ids: string[]; - }>; - // (undocumented) - rehydrateWorkspace?(options: { - taskId: string; - targetPath: string; - }): Promise; - // (undocumented) - retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise; - // (undocumented) - saveTaskState?(options: { - taskId: string; - state?: JsonObject; - }): Promise; - // (undocumented) - serializeWorkspace?({ - path, - taskId, - }: { - path: string; - taskId: string; - }): Promise; - // (undocumented) - shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; -} - -// @public @deprecated -export type TaskStoreCreateTaskOptions = { - spec: TaskSpec; - createdBy?: string; - secrets?: TaskSecrets; -}; - -// @public @deprecated -export type TaskStoreCreateTaskResult = { - taskId: string; -}; - -// @public @deprecated -export type TaskStoreEmitOptions = { - taskId: string; - body: TBody; -}; - -// @public @deprecated -export type TaskStoreListEventsOptions = { - isTaskRecoverable?: boolean; - taskId: string; - after?: number | undefined; -}; - -// @public @deprecated -export type TaskStoreRecoverTaskOptions = { - timeout: HumanDuration; -}; - -// @public @deprecated -export type TaskStoreShutDownTaskOptions = { - taskId: string; -}; - -// @public @deprecated -export class TaskWorker { - // (undocumented) - static create(options: CreateWorkerOptions): Promise; - // (undocumented) - protected onReadyToClaimTask(): Promise; - // (undocumented) - recoverTasks(): Promise; - // (undocumented) - runOneTask(task: TaskContext): Promise; - // (undocumented) - start(): void; - // (undocumented) - stop(): Promise; -} - -// @public @deprecated -export class TemplateActionRegistry { - // (undocumented) - get(actionId: string): TemplateAction; - // (undocumented) - list(): TemplateAction[]; - // (undocumented) - register(action: TemplateAction): void; -} - // @public (undocumented) export type TemplatePermissionRuleInput< TParams extends PermissionRuleParams = PermissionRuleParams, diff --git a/plugins/scaffolder-backend/src/index.ts b/plugins/scaffolder-backend/src/index.ts index 4273ed8197..d911d51536 100644 --- a/plugins/scaffolder-backend/src/index.ts +++ b/plugins/scaffolder-backend/src/index.ts @@ -21,7 +21,9 @@ */ export { scaffolderPlugin as default } from './ScaffolderPlugin'; -export * from './scaffolder'; + +export * from './scaffolder/actions/builtin'; + export { type TemplatePermissionRuleInput, type ActionPermissionRuleInput, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts index c819d4c21f..d6d7685a21 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/TemplateActionRegistry.ts @@ -16,10 +16,9 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; + /** * Registry of all registered template actions. - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export class TemplateActionRegistry { private readonly actions = new Map(); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index fdcaa8613e..22ce3e83b7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -85,8 +85,6 @@ export type RawDbTaskEventRow = { /** * DatabaseTaskStore - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export type DatabaseTaskStoreOptions = { database: DatabaseService | Knex; @@ -118,8 +116,6 @@ const parseSqlDateToIsoString = (input: T): T | string => { /** * DatabaseTaskStore - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export class DatabaseTaskStore implements TaskStore { private readonly db: Knex; @@ -723,7 +719,7 @@ export class DatabaseTaskStore implements TaskStore { }); } - async retryTask?(options: { + async retryTask(options: { secrets?: TaskSecrets; taskId: string; }): Promise { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index d069a6bc1c..bcae93fb4d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -33,7 +33,7 @@ import { SecureTemplater, SecureTemplateRenderer, } from '../../lib/templating/SecureTemplater'; -import { TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions/TemplateActionRegistry'; import { generateExampleOutput, isTruthy } from './helper'; import { TaskTrackType, WorkflowResponse, WorkflowRunner } from './types'; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 5b4d568144..2c2c176770 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -50,8 +50,6 @@ type TaskState = { }; /** * TaskManager - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export class TaskManager implements TaskContext { private isDone = false; @@ -488,7 +486,7 @@ export class StorageTaskBroker implements TaskBroker { }); } - async retry?(options: { + async retry(options: { secrets?: TaskSecrets; taskId: string; }): Promise { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 9abe5f3ba6..adfdf0b553 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -25,7 +25,7 @@ import { TemplateGlobal, } from '@backstage/plugin-scaffolder-node'; import PQueue from 'p-queue'; -import { TemplateActionRegistry } from '../actions'; +import { TemplateActionRegistry } from '../actions/TemplateActionRegistry'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; import { WorkflowRunner } from './types'; import { setTimeout } from 'timers/promises'; @@ -36,8 +36,6 @@ const DEFAULT_TASK_PARAMETER_MAX_LENGTH = 256; /** * TaskWorkerOptions - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export type TaskWorkerOptions = { taskBroker: TaskBroker; @@ -54,8 +52,6 @@ export type TaskWorkerOptions = { /** * CreateWorkerOptions - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export type CreateWorkerOptions = { taskBroker: TaskBroker; @@ -86,8 +82,6 @@ export type CreateWorkerOptions = { /** * TaskWorker - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. - * @public */ export class TaskWorker { private taskQueue: PQueue; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 62ffb171ff..874e32b838 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -30,8 +30,6 @@ import { PermissionCriteria } from '@backstage/plugin-permission-common'; /** * TaskStoreEmitOptions * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreEmitOptions = { taskId: string; @@ -41,8 +39,6 @@ export type TaskStoreEmitOptions = { /** * TaskStoreListEventsOptions * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreListEventsOptions = { isTaskRecoverable?: boolean; @@ -53,8 +49,6 @@ export type TaskStoreListEventsOptions = { /** * TaskStoreShutDownTaskOptions * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreShutDownTaskOptions = { taskId: string; @@ -62,8 +56,6 @@ export type TaskStoreShutDownTaskOptions = { /** * The options passed to {@link TaskStore.createTask} - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreCreateTaskOptions = { spec: TaskSpec; @@ -73,8 +65,6 @@ export type TaskStoreCreateTaskOptions = { /** * The options passed to {@link TaskStore.recoverTasks} - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreRecoverTaskOptions = { timeout: HumanDuration; @@ -82,8 +72,6 @@ export type TaskStoreRecoverTaskOptions = { /** * The response from {@link TaskStore.createTask} - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export type TaskStoreCreateTaskResult = { taskId: string; @@ -92,19 +80,17 @@ export type TaskStoreCreateTaskResult = { /** * TaskStore * - * @public - * @deprecated this type is deprecated, and there will be a new way to create Workers in the next major version. */ export interface TaskStore { - cancelTask?(options: TaskStoreEmitOptions): Promise; + cancelTask(options: TaskStoreEmitOptions): Promise; createTask( options: TaskStoreCreateTaskOptions, ): Promise; - retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise; + retryTask(options: { secrets?: TaskSecrets; taskId: string }): Promise; - recoverTasks?( + recoverTasks( options: TaskStoreRecoverTaskOptions, ): Promise<{ ids: string[] }>; @@ -137,51 +123,31 @@ export interface TaskStore { order?: { order: 'asc' | 'desc'; field: string }[]; }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; - /** - * @deprecated Make sure to pass `createdBy` and `status` in the `filters` parameter instead - */ - list?(options: { - createdBy?: string; - status?: TaskStatus; - filters?: { - createdBy?: string | string[]; - status?: TaskStatus | TaskStatus[]; - }; - pagination?: { - limit?: number; - offset?: number; - }; - order?: { order: 'asc' | 'desc'; field: string }[]; - }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; - emitLogEvent(options: TaskStoreEmitOptions): Promise; - getTaskState?({ taskId }: { taskId: string }): Promise< + getTaskState({ taskId }: { taskId: string }): Promise< | { state: JsonObject; } | undefined >; - saveTaskState?(options: { - taskId: string; - state?: JsonObject; - }): Promise; + saveTaskState(options: { taskId: string; state?: JsonObject }): Promise; listEvents( options: TaskStoreListEventsOptions, ): Promise<{ events: SerializedTaskEvent[] }>; - shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; + shutdownTask(options: TaskStoreShutDownTaskOptions): Promise; rehydrateWorkspace?(options: { taskId: string; targetPath: string; }): Promise; - cleanWorkspace?({ taskId }: { taskId: string }): Promise; + cleanWorkspace({ taskId }: { taskId: string }): Promise; - serializeWorkspace?({ + serializeWorkspace({ path, taskId, }: { diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index c97344867a..fa0163b245 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -356,7 +356,7 @@ export type SerializedTaskEvent = { // @public export interface TaskBroker { // (undocumented) - cancel?(taskId: string): Promise; + cancel(taskId: string): Promise; // (undocumented) claim(): Promise; // (undocumented) @@ -370,7 +370,7 @@ export interface TaskBroker { // (undocumented) get(taskId: string): Promise; // (undocumented) - list?(options?: { + list(options?: { filters?: { createdBy?: string | string[]; status?: TaskStatus | TaskStatus[]; @@ -388,15 +388,10 @@ export interface TaskBroker { tasks: SerializedTask[]; totalTasks?: number; }>; - // @deprecated (undocumented) - list?(options: { createdBy?: string; status?: TaskStatus }): Promise<{ - tasks: SerializedTask[]; - totalTasks?: number; - }>; // (undocumented) - recoverTasks?(): Promise; + recoverTasks(): Promise; // (undocumented) - retry?(options: { secrets?: TaskSecrets; taskId: string }): Promise; + retry(options: { secrets?: TaskSecrets; taskId: string }): Promise; // (undocumented) vacuumTasks(options: { timeoutS: number }): Promise; } diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index aaac468fce..fd80d547c1 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -177,13 +177,13 @@ export interface TaskContext { * @public */ export interface TaskBroker { - cancel?(taskId: string): Promise; + cancel(taskId: string): Promise; - retry?(options: { secrets?: TaskSecrets; taskId: string }): Promise; + retry(options: { secrets?: TaskSecrets; taskId: string }): Promise; claim(): Promise; - recoverTasks?(): Promise; + recoverTasks(): Promise; dispatch( options: TaskBrokerDispatchOptions, @@ -198,7 +198,7 @@ export interface TaskBroker { get(taskId: string): Promise; - list?(options?: { + list(options?: { filters?: { createdBy?: string | string[]; status?: TaskStatus | TaskStatus[]; @@ -210,12 +210,4 @@ export interface TaskBroker { order?: { order: 'asc' | 'desc'; field: string }[]; permissionFilters?: PermissionCriteria; }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; - - /** - * @deprecated Make sure to pass `createdBy` and `status` in the `filters` parameter instead - */ - list?(options: { - createdBy?: string; - status?: TaskStatus; - }): Promise<{ tasks: SerializedTask[]; totalTasks?: number }>; } From 9b81a90b91d7973660952489257eb231af992b96 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 15:51:25 +0200 Subject: [PATCH 094/177] chore: changesets Signed-off-by: benjdlambert --- .changeset/ready-poems-change.md | 5 +++++ .changeset/wet-spiders-wait.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/ready-poems-change.md create mode 100644 .changeset/wet-spiders-wait.md diff --git a/.changeset/ready-poems-change.md b/.changeset/ready-poems-change.md new file mode 100644 index 0000000000..e716779b95 --- /dev/null +++ b/.changeset/ready-poems-change.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': minor +--- + +Making fields required diff --git a/.changeset/wet-spiders-wait.md b/.changeset/wet-spiders-wait.md new file mode 100644 index 0000000000..49cb2a56ac --- /dev/null +++ b/.changeset/wet-spiders-wait.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': major +--- + +Removing the deprecated types and interfaces From 55b0b7e48e6b111d0ea547cc9a6886b8a8acdf80 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 15:58:42 +0200 Subject: [PATCH 095/177] chore: update changeset for scaffolder-backend Signed-off-by: benjdlambert --- .changeset/wet-spiders-wait.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.changeset/wet-spiders-wait.md b/.changeset/wet-spiders-wait.md index 49cb2a56ac..6db9dfc1a1 100644 --- a/.changeset/wet-spiders-wait.md +++ b/.changeset/wet-spiders-wait.md @@ -2,4 +2,6 @@ '@backstage/plugin-scaffolder-backend': major --- -Removing the deprecated types and interfaces +Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. + +Affected types: `CreateWorkerOptions`, `CurrentClaimedTask`, `DatabaseTaskStore`, `DatabaseTaskStoreOptions`, `TaskManager`, `TaskStore`, `TaskStoreCreateTaskOptions`, `TaskStoreCreateTaskResult`, `TaskStoreEmitOptions`, `TaskStoreListEventsOptions`, `TaskStoreRecoverTaskOptions`, `TaskStoreShutDownTaskOptions`, `TaskWorker` and `TemplateActionRegistry`. From 62e3e83bb44c39c76e9e3fe6ecb309babba24965 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 16:01:55 +0200 Subject: [PATCH 096/177] chore: fix Signed-off-by: benjdlambert --- .changeset/ready-poems-change.md | 6 +++++- .changeset/wet-spiders-wait.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.changeset/ready-poems-change.md b/.changeset/ready-poems-change.md index e716779b95..fc95ddb99a 100644 --- a/.changeset/ready-poems-change.md +++ b/.changeset/ready-poems-change.md @@ -2,4 +2,8 @@ '@backstage/plugin-scaffolder-node': minor --- -Making fields required +**BREAKING** - Marking optional fields as required in the `TaskBroker`, these can be fixed with a no-op `() => void` if you don't want to implement the functions. + +- `cancel`, `recoverTasks` and `retry` are the required methods on the `TaskBroker` interface. + +**NOTE**: If you're affected by this breaking change, please reach out to us in an issue as we're thinking about completely removing the `TaskBroker` extension point soon and would like to hear your use cases for the upcoming re-architecture of the `scaffolder-backend` plugin. diff --git a/.changeset/wet-spiders-wait.md b/.changeset/wet-spiders-wait.md index 6db9dfc1a1..aaffc92013 100644 --- a/.changeset/wet-spiders-wait.md +++ b/.changeset/wet-spiders-wait.md @@ -2,6 +2,6 @@ '@backstage/plugin-scaffolder-backend': major --- -Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. +**BREAKING** - Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. Affected types: `CreateWorkerOptions`, `CurrentClaimedTask`, `DatabaseTaskStore`, `DatabaseTaskStoreOptions`, `TaskManager`, `TaskStore`, `TaskStoreCreateTaskOptions`, `TaskStoreCreateTaskResult`, `TaskStoreEmitOptions`, `TaskStoreListEventsOptions`, `TaskStoreRecoverTaskOptions`, `TaskStoreShutDownTaskOptions`, `TaskWorker` and `TemplateActionRegistry`. From 6e2bda78bd711adc097e39aa51ae8514b1a0bfce Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 16:15:36 +0200 Subject: [PATCH 097/177] chore: moar deprecations Signed-off-by: benjdlambert --- .changeset/solid-bikes-leave.md | 9 ++++++++ plugins/scaffolder-node/report-alpha.api.md | 2 +- plugins/scaffolder-node/report.api.md | 22 +++++++++--------- plugins/scaffolder-node/src/alpha/index.ts | 1 + plugins/scaffolder-node/src/tasks/types.ts | 25 ++++++++++++++++++++- 5 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 .changeset/solid-bikes-leave.md diff --git a/.changeset/solid-bikes-leave.md b/.changeset/solid-bikes-leave.md new file mode 100644 index 0000000000..6f1bfe0b2f --- /dev/null +++ b/.changeset/solid-bikes-leave.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +**DEPRECATION**: We're going to be working on refactoring a lot of the internals of the Scaffolder backend plugin, and with that comes a lot of deprecations and removals for public types that are making these things hard. + +If you're using these types, please reach out to us either on Discord or a GitHub issue with your use cases. + +- `SerializedTask`, `SerializedTaskEvent`, `TaskBroker`, `TaskContext`, `TaskBrokerDispatchOptions`, `TaskBrokerDispatchResult`, `TaskCompletionState`, `TaskEventType`, `TaskFilter`, `TaskFilters`, `TaskStatus` are the types that have now been marked as deprecated, and will be removed in a future release. diff --git a/plugins/scaffolder-node/report-alpha.api.md b/plugins/scaffolder-node/report-alpha.api.md index 09541fbc56..c5ac6ce79d 100644 --- a/plugins/scaffolder-node/report-alpha.api.md +++ b/plugins/scaffolder-node/report-alpha.api.md @@ -147,7 +147,7 @@ export interface ScaffolderAutocompleteExtensionPoint { // @alpha export const scaffolderAutocompleteExtensionPoint: ExtensionPoint; -// @alpha +// @alpha @deprecated export interface ScaffolderTaskBrokerExtensionPoint { // (undocumented) setTaskBroker(taskBroker: TaskBroker): void; diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index fa0163b245..027d57ede4 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -327,7 +327,7 @@ export function serializeDirectoryContents( }, ): Promise; -// @public +// @public @deprecated export type SerializedTask = { id: string; spec: TaskSpec; @@ -339,7 +339,7 @@ export type SerializedTask = { state?: JsonObject; }; -// @public +// @public @deprecated export type SerializedTaskEvent = { id: number; isTaskRecoverable?: boolean; @@ -353,7 +353,7 @@ export type SerializedTaskEvent = { createdAt: string; }; -// @public +// @public @deprecated export interface TaskBroker { // (undocumented) cancel(taskId: string): Promise; @@ -396,22 +396,22 @@ export interface TaskBroker { vacuumTasks(options: { timeoutS: number }): Promise; } -// @public +// @public @deprecated export type TaskBrokerDispatchOptions = { spec: TaskSpec; secrets?: TaskSecrets; createdBy?: string; }; -// @public +// @public @deprecated export type TaskBrokerDispatchResult = { taskId: string; }; -// @public +// @public @deprecated export type TaskCompletionState = 'failed' | 'completed'; -// @public +// @public @deprecated export interface TaskContext { // (undocumented) cancelSignal: AbortSignal; @@ -455,16 +455,16 @@ export interface TaskContext { updateCheckpoint?(options: UpdateTaskCheckpointOptions): Promise; } -// @public +// @public @deprecated export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; -// @public +// @public @deprecated export type TaskFilter = { key: string; values?: string[]; }; -// @public +// @public @deprecated export type TaskFilters = | { anyOf: TaskFilter[]; @@ -482,7 +482,7 @@ export type TaskSecrets = Record & { backstageToken?: string; }; -// @public +// @public @deprecated export type TaskStatus = | 'cancelled' | 'completed' diff --git a/plugins/scaffolder-node/src/alpha/index.ts b/plugins/scaffolder-node/src/alpha/index.ts index 30f95f116a..2147085983 100644 --- a/plugins/scaffolder-node/src/alpha/index.ts +++ b/plugins/scaffolder-node/src/alpha/index.ts @@ -53,6 +53,7 @@ export const scaffolderActionsExtensionPoint = * Extension point for replacing the scaffolder task broker. * * @alpha + * @deprecated this extension point is planned to be removed, please reach out to us in an issue if you're using this extension point and your use cases. */ export interface ScaffolderTaskBrokerExtensionPoint { setTaskBroker(taskBroker: TaskBroker): void; diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts index fd80d547c1..d6e4bb2dd9 100644 --- a/plugins/scaffolder-node/src/tasks/types.ts +++ b/plugins/scaffolder-node/src/tasks/types.ts @@ -33,6 +33,8 @@ export type TaskSecrets = Record & { * The status of each step of the Task * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskStatus = | 'cancelled' @@ -46,6 +48,8 @@ export type TaskStatus = * The state of a completed task. * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export type TaskCompletionState = 'failed' | 'completed'; @@ -53,6 +57,8 @@ export type TaskCompletionState = 'failed' | 'completed'; * SerializedTask * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type SerializedTask = { id: string; @@ -69,6 +75,8 @@ export type SerializedTask = { * TaskEventType * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; @@ -76,6 +84,8 @@ export type TaskEventType = 'completion' | 'log' | 'cancelled' | 'recovered'; * SerializedTaskEvent * * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type SerializedTaskEvent = { id: number; @@ -94,6 +104,8 @@ export type SerializedTaskEvent = { * The result of {@link TaskBroker.dispatch} * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export type TaskBrokerDispatchResult = { taskId: string; @@ -104,6 +116,8 @@ export type TaskBrokerDispatchResult = { * Currently a spec and optional secrets * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export type TaskBrokerDispatchOptions = { spec: TaskSpec; @@ -114,6 +128,8 @@ export type TaskBrokerDispatchOptions = { /** * TaskFilter * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskFilter = { key: string; @@ -123,6 +139,8 @@ export type TaskFilter = { /** * TaskFilters * @public + * @deprecated this type is planned to be removed. + * Please reach out to us in an issue if you're using this type and your use cases. */ export type TaskFilters = | { anyOf: TaskFilter[] } @@ -131,9 +149,12 @@ export type TaskFilters = | TaskFilter; /** - * Task + * TaskContext * * @public + * + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export interface TaskContext { taskId?: string; @@ -175,6 +196,8 @@ export interface TaskContext { * TaskBroker * * @public + * @deprecated this interface is planned to be removed. + * Please reach out to us in an issue if you're using this interface and your use cases. */ export interface TaskBroker { cancel(taskId: string): Promise; From 236d42720d56cafe31927a244fd48e72028152c6 Mon Sep 17 00:00:00 2001 From: Beth Griggs Date: Tue, 23 Sep 2025 15:25:31 +0100 Subject: [PATCH 098/177] fixup! remove fallback number parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Beth Griggs --- .../rootHttpRouter/rootHttpRouterServiceFactory.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts index 1bbf986a98..b0cc9d160e 100644 --- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -146,15 +146,7 @@ const rootHttpRouterServiceFactoryWithOptions = ( `ISO duration (e.g., 'PT30S'), or duration object (e.g., {seconds: 30}). ` + `Falling back to number parsing.`, ); - // Fallback to reading as number if duration parsing fails - const fallbackValue = serverConfig.getOptionalNumber(key); - if (fallbackValue === undefined && typeof value === 'string') { - logger.error( - `backend.server.${key} value '${value}' could not be parsed as either ` + - `a duration or a number. This setting will be ignored.`, - ); - } - return fallbackValue; + return undefined; } }; From c8aa21077c765901e3a2b1e69d7cacbbf8a5fad9 Mon Sep 17 00:00:00 2001 From: benjdlambert Date: Tue, 23 Sep 2025 16:38:54 +0200 Subject: [PATCH 099/177] chore: last bits Signed-off-by: benjdlambert --- .changeset/legal-eagles-jog.md | 18 ++++++++++ .changeset/red-times-bet.md | 13 +++++++ .../src/module.ts | 2 +- .../src/module.ts | 6 ++-- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 6 ++-- .../src/module.ts | 6 ++-- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/module.ts | 2 +- .../src/ScaffolderPlugin.ts | 7 ++-- plugins/scaffolder-node/report-alpha.api.md | 12 +------ plugins/scaffolder-node/report.api.md | 10 ++++++ plugins/scaffolder-node/src/alpha/index.ts | 21 +---------- plugins/scaffolder-node/src/extensions.ts | 36 +++++++++++++++++++ plugins/scaffolder-node/src/index.ts | 1 + 22 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 .changeset/legal-eagles-jog.md create mode 100644 .changeset/red-times-bet.md create mode 100644 plugins/scaffolder-node/src/extensions.ts diff --git a/.changeset/legal-eagles-jog.md b/.changeset/legal-eagles-jog.md new file mode 100644 index 0000000000..5b520af91f --- /dev/null +++ b/.changeset/legal-eagles-jog.md @@ -0,0 +1,18 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch +'@backstage/plugin-scaffolder-backend-module-notifications': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket': patch +'@backstage/plugin-scaffolder-backend-module-gerrit': patch +'@backstage/plugin-scaffolder-backend-module-github': patch +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +'@backstage/plugin-scaffolder-backend-module-sentry': patch +'@backstage/plugin-scaffolder-backend-module-yeoman': patch +'@backstage/plugin-scaffolder-backend-module-azure': patch +'@backstage/plugin-scaffolder-backend-module-gitea': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +--- + +Updating import for the `scaffolderActionsExtensionPoint` to be the main export diff --git a/.changeset/red-times-bet.md b/.changeset/red-times-bet.md new file mode 100644 index 0000000000..29e89fb07f --- /dev/null +++ b/.changeset/red-times-bet.md @@ -0,0 +1,13 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +**BREAKING ALPHA**: We've moved the `scaffolderActionsExtensionPoint` from `/alpha` to the main export. + +```tsx +// before +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; + +// after +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; +``` diff --git a/plugins/scaffolder-backend-module-azure/src/module.ts b/plugins/scaffolder-backend-module-azure/src/module.ts index 40ca3f0978..937d806932 100644 --- a/plugins/scaffolder-backend-module-azure/src/module.ts +++ b/plugins/scaffolder-backend-module-azure/src/module.ts @@ -18,7 +18,7 @@ import { coreServices, } from '@backstage/backend-plugin-api'; import { ScmIntegrations } from '@backstage/integration'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishAzureAction } from './actions'; /** diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts b/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts index 4001c064da..04ac3b7a56 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/src/module.ts @@ -17,10 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { - scaffolderActionsExtensionPoint, - scaffolderAutocompleteExtensionPoint, -} from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderAutocompleteExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createBitbucketCloudBranchRestrictionAction } from './actions/bitbucketCloudBranchRestriction'; import { createBitbucketPipelinesRunAction, @@ -29,6 +26,7 @@ import { } from './actions'; import { ScmIntegrations } from '@backstage/integration'; import { handleAutocompleteRequest } from './autocomplete/autocomplete'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; /** * @public diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts index d3d457cb1f..21159759d4 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishBitbucketServerAction, createPublishBitbucketServerPullRequestAction, diff --git a/plugins/scaffolder-backend-module-bitbucket/src/module.ts b/plugins/scaffolder-backend-module-bitbucket/src/module.ts index db27d0b7b9..884c8be004 100644 --- a/plugins/scaffolder-backend-module-bitbucket/src/module.ts +++ b/plugins/scaffolder-backend-module-bitbucket/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createBitbucketPipelinesRunAction, createPublishBitbucketCloudAction, diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts index 402f56c951..3b18ef8294 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/module.ts @@ -17,7 +17,7 @@ import { createBackendModule, coreServices, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createConfluenceToMarkdownAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/module.ts b/plugins/scaffolder-backend-module-cookiecutter/src/module.ts index df1b201518..3caa9259f2 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/module.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createFetchCookiecutterAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-gerrit/src/module.ts b/plugins/scaffolder-backend-module-gerrit/src/module.ts index 32607431f3..f0bbed9649 100644 --- a/plugins/scaffolder-backend-module-gerrit/src/module.ts +++ b/plugins/scaffolder-backend-module-gerrit/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishGerritAction, createPublishGerritReviewAction, diff --git a/plugins/scaffolder-backend-module-gitea/src/module.ts b/plugins/scaffolder-backend-module-gitea/src/module.ts index 658f240471..b087e1637e 100644 --- a/plugins/scaffolder-backend-module-gitea/src/module.ts +++ b/plugins/scaffolder-backend-module-gitea/src/module.ts @@ -17,7 +17,7 @@ import { createBackendModule, coreServices, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createPublishGiteaAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-github/src/module.ts b/plugins/scaffolder-backend-module-github/src/module.ts index 67bda58fc4..964bc018ae 100644 --- a/plugins/scaffolder-backend-module-github/src/module.ts +++ b/plugins/scaffolder-backend-module-github/src/module.ts @@ -17,10 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { - scaffolderActionsExtensionPoint, - scaffolderAutocompleteExtensionPoint, -} from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderAutocompleteExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createGithubActionsDispatchAction, createGithubAutolinksAction, @@ -42,6 +39,7 @@ import { } from '@backstage/integration'; import { createHandleAutocompleteRequest } from './autocomplete/autocomplete'; import { catalogServiceRef } from '@backstage/plugin-catalog-node'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; /** * @public diff --git a/plugins/scaffolder-backend-module-gitlab/src/module.ts b/plugins/scaffolder-backend-module-gitlab/src/module.ts index 7dbfddfc1b..3c04f57077 100644 --- a/plugins/scaffolder-backend-module-gitlab/src/module.ts +++ b/plugins/scaffolder-backend-module-gitlab/src/module.ts @@ -18,10 +18,7 @@ import { createBackendModule, } from '@backstage/backend-plugin-api'; import { ScmIntegrations } from '@backstage/integration'; -import { - scaffolderActionsExtensionPoint, - scaffolderAutocompleteExtensionPoint, -} from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderAutocompleteExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; import { createGitlabGroupEnsureExistsAction, createGitlabIssueAction, @@ -36,6 +33,7 @@ import { } from './actions'; import { createGitlabProjectMigrateAction } from './actions/gitlabProjectMigrate'; import { createHandleAutocompleteRequest } from './autocomplete/autocomplete'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; /** * @public diff --git a/plugins/scaffolder-backend-module-notifications/src/module.ts b/plugins/scaffolder-backend-module-notifications/src/module.ts index e8b6823e99..4639175229 100644 --- a/plugins/scaffolder-backend-module-notifications/src/module.ts +++ b/plugins/scaffolder-backend-module-notifications/src/module.ts @@ -15,7 +15,7 @@ */ import { createBackendModule } from '@backstage/backend-plugin-api'; import { notificationService } from '@backstage/plugin-notifications-node'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createSendNotificationAction } from './actions'; /** diff --git a/plugins/scaffolder-backend-module-rails/src/module.ts b/plugins/scaffolder-backend-module-rails/src/module.ts index ec70610cd3..eb14c47977 100644 --- a/plugins/scaffolder-backend-module-rails/src/module.ts +++ b/plugins/scaffolder-backend-module-rails/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createFetchRailsAction } from './actions'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/scaffolder-backend-module-sentry/src/module.ts b/plugins/scaffolder-backend-module-sentry/src/module.ts index dcde344262..2b343edbc7 100644 --- a/plugins/scaffolder-backend-module-sentry/src/module.ts +++ b/plugins/scaffolder-backend-module-sentry/src/module.ts @@ -17,7 +17,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createSentryCreateProjectAction } from './actions/createProject'; /** diff --git a/plugins/scaffolder-backend-module-yeoman/src/module.ts b/plugins/scaffolder-backend-module-yeoman/src/module.ts index 1fdbda28a3..0564d69369 100644 --- a/plugins/scaffolder-backend-module-yeoman/src/module.ts +++ b/plugins/scaffolder-backend-module-yeoman/src/module.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createBackendModule } from '@backstage/backend-plugin-api'; -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; +import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; import { createRunYeomanAction } from './actions'; /** diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index a00da9e524..39bab85c7e 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -21,7 +21,11 @@ import { import { ScmIntegrations } from '@backstage/integration'; import { catalogServiceRef } from '@backstage/plugin-catalog-node'; import { eventsServiceRef } from '@backstage/plugin-events-node'; -import { TaskBroker, TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + scaffolderActionsExtensionPoint, + TaskBroker, + TemplateAction, +} from '@backstage/plugin-scaffolder-node'; import { AutocompleteHandler, CreatedTemplateFilter, @@ -29,7 +33,6 @@ import { createTemplateFilter, createTemplateGlobalFunction, createTemplateGlobalValue, - scaffolderActionsExtensionPoint, scaffolderAutocompleteExtensionPoint, scaffolderTaskBrokerExtensionPoint, scaffolderTemplatingExtensionPoint, diff --git a/plugins/scaffolder-node/report-alpha.api.md b/plugins/scaffolder-node/report-alpha.api.md index c5ac6ce79d..e1d49f571a 100644 --- a/plugins/scaffolder-node/report-alpha.api.md +++ b/plugins/scaffolder-node/report-alpha.api.md @@ -6,7 +6,6 @@ import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonValue } from '@backstage/types'; import { TaskBroker } from '@backstage/plugin-scaffolder-node'; -import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { TemplateFilter as TemplateFilter_2 } from '@backstage/plugin-scaffolder-node'; import { TemplateGlobal as TemplateGlobal_2 } from '@backstage/plugin-scaffolder-node'; import { z } from 'zod'; @@ -123,15 +122,6 @@ export const restoreWorkspace: (opts: { buffer?: Buffer; }) => Promise; -// @alpha -export interface ScaffolderActionsExtensionPoint { - // (undocumented) - addActions(...actions: TemplateAction[]): void; -} - -// @alpha -export const scaffolderActionsExtensionPoint: ExtensionPoint; - // @alpha export interface ScaffolderAutocompleteExtensionPoint { // (undocumented) @@ -153,7 +143,7 @@ export interface ScaffolderTaskBrokerExtensionPoint { setTaskBroker(taskBroker: TaskBroker): void; } -// @alpha +// @alpha @deprecated export const scaffolderTaskBrokerExtensionPoint: ExtensionPoint; // @alpha diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index 027d57ede4..7f70c9d786 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -6,6 +6,7 @@ import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { CheckpointContext } from '@backstage/plugin-scaffolder-node/alpha'; import { Expand } from '@backstage/types'; +import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { LoggerService } from '@backstage/backend-plugin-api'; @@ -306,6 +307,15 @@ export const parseRepoUrl: ( project?: string; }; +// @public +export interface ScaffolderActionsExtensionPoint { + // (undocumented) + addActions(...actions: TemplateAction[]): void; +} + +// @public +export const scaffolderActionsExtensionPoint: ExtensionPoint; + // @public (undocumented) export interface SerializedFile { // (undocumented) diff --git a/plugins/scaffolder-node/src/alpha/index.ts b/plugins/scaffolder-node/src/alpha/index.ts index 2147085983..9d0b9efafd 100644 --- a/plugins/scaffolder-node/src/alpha/index.ts +++ b/plugins/scaffolder-node/src/alpha/index.ts @@ -17,7 +17,6 @@ import { createExtensionPoint } from '@backstage/backend-plugin-api'; import { TaskBroker, - TemplateAction, TemplateFilter, TemplateGlobal, } from '@backstage/plugin-scaffolder-node'; @@ -30,25 +29,6 @@ export * from './globals'; export * from './types'; export * from './checkpoints'; -/** - * Extension point for managing scaffolder actions. - * - * @alpha - */ -export interface ScaffolderActionsExtensionPoint { - addActions(...actions: TemplateAction[]): void; -} - -/** - * Extension point for managing scaffolder actions. - * - * @alpha - */ -export const scaffolderActionsExtensionPoint = - createExtensionPoint({ - id: 'scaffolder.actions', - }); - /** * Extension point for replacing the scaffolder task broker. * @@ -63,6 +43,7 @@ export interface ScaffolderTaskBrokerExtensionPoint { * Extension point for replacing the scaffolder task broker. * * @alpha + * @deprecated this extension point is planned to be removed, please reach out to us in an issue if you're using this extension point and your use cases. */ export const scaffolderTaskBrokerExtensionPoint = createExtensionPoint({ diff --git a/plugins/scaffolder-node/src/extensions.ts b/plugins/scaffolder-node/src/extensions.ts new file mode 100644 index 0000000000..94b366fceb --- /dev/null +++ b/plugins/scaffolder-node/src/extensions.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { TemplateAction } from './actions'; + +/** + * Extension point for managing scaffolder actions. + * + * @public + */ +export interface ScaffolderActionsExtensionPoint { + addActions(...actions: TemplateAction[]): void; +} + +/** + * Extension point for managing scaffolder actions. + * + * @public + */ +export const scaffolderActionsExtensionPoint = + createExtensionPoint({ + id: 'scaffolder.actions', + }); diff --git a/plugins/scaffolder-node/src/index.ts b/plugins/scaffolder-node/src/index.ts index 5d49ee874c..a9aa77ba4e 100644 --- a/plugins/scaffolder-node/src/index.ts +++ b/plugins/scaffolder-node/src/index.ts @@ -24,3 +24,4 @@ export * from './actions'; export * from './tasks'; export * from './files'; export * from './types'; +export * from './extensions'; From c73bfa46d48fe995f988e211e6dfd35f223af418 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Sep 2025 15:00:29 +0000 Subject: [PATCH 100/177] Version Packages (next) --- .changeset/create-app-1758639549.md | 5 + .changeset/pre.json | 30 +- docs/releases/v1.44.0-next.0-changelog.md | 1578 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 11 + packages/app-defaults/package.json | 2 +- packages/app-next-example-plugin/CHANGELOG.md | 8 + packages/app-next-example-plugin/package.json | 2 +- packages/app-next/CHANGELOG.md | 47 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 42 + packages/app/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 30 + packages/backend-defaults/package.json | 2 +- .../CHANGELOG.md | 25 + .../package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 15 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 41 + packages/backend/package.json | 2 +- packages/cli/CHANGELOG.md | 17 + packages/cli/package.json | 2 +- packages/core-compat-api/CHANGELOG.md | 10 + packages/core-compat-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 13 + packages/core-components/package.json | 2 +- packages/create-app/CHANGELOG.md | 8 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 14 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 9 + packages/e2e-test/package.json | 2 +- packages/frontend-app-api/CHANGELOG.md | 14 + packages/frontend-app-api/package.json | 2 +- packages/frontend-defaults/CHANGELOG.md | 12 + packages/frontend-defaults/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- packages/frontend-internal/CHANGELOG.md | 9 + packages/frontend-internal/package.json | 2 +- packages/frontend-plugin-api/CHANGELOG.md | 10 + packages/frontend-plugin-api/package.json | 2 +- packages/frontend-test-utils/CHANGELOG.md | 13 + packages/frontend-test-utils/package.json | 2 +- packages/integration-react/CHANGELOG.md | 9 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 10 + packages/integration/package.json | 2 +- packages/scaffolder-internal/CHANGELOG.md | 8 + packages/scaffolder-internal/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 19 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 11 + packages/techdocs-cli/package.json | 2 +- packages/ui/CHANGELOG.md | 7 + packages/ui/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 27 + plugins/api-docs/package.json | 2 +- plugins/app-visualizer/CHANGELOG.md | 9 + plugins/app-visualizer/package.json | 2 +- plugins/app/CHANGELOG.md | 14 + plugins/app/package.json | 2 +- plugins/auth-react/CHANGELOG.md | 9 + plugins/auth-react/package.json | 2 +- plugins/auth/CHANGELOG.md | 10 + plugins/auth/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 8 + plugins/bitbucket-cloud-common/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 16 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 12 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 11 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../catalog-backend-module-gitea/CHANGELOG.md | 12 + .../catalog-backend-module-gitea/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../catalog-backend-module-logs/CHANGELOG.md | 9 + .../catalog-backend-module-logs/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 43 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 16 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 18 + plugins/catalog-import/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 21 + plugins/catalog-react/package.json | 2 +- .../catalog-unprocessed-entities/CHANGELOG.md | 12 + .../catalog-unprocessed-entities/package.json | 2 +- plugins/catalog/CHANGELOG.md | 24 + plugins/catalog/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 10 + plugins/config-schema/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 16 + plugins/devtools-backend/package.json | 2 +- plugins/devtools/CHANGELOG.md | 13 + plugins/devtools/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 11 + .../events-backend-module-github/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 8 + plugins/example-todo-list/package.json | 2 +- plugins/home-react/CHANGELOG.md | 9 + plugins/home-react/package.json | 2 +- plugins/home/CHANGELOG.md | 17 + plugins/home/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 19 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 13 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-common/CHANGELOG.md | 10 + plugins/kubernetes-common/package.json | 2 +- plugins/kubernetes-node/CHANGELOG.md | 10 + plugins/kubernetes-node/package.json | 2 +- plugins/kubernetes-react/CHANGELOG.md | 12 + plugins/kubernetes-react/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 15 + plugins/kubernetes/package.json | 2 +- plugins/mcp-actions-backend/CHANGELOG.md | 12 + plugins/mcp-actions-backend/package.json | 2 +- plugins/notifications/CHANGELOG.md | 15 + plugins/notifications/package.json | 2 +- plugins/org-react/CHANGELOG.md | 11 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 13 + plugins/org/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 37 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 11 + plugins/scaffolder-common/package.json | 2 +- .../scaffolder-node-test-utils/CHANGELOG.md | 10 + .../scaffolder-node-test-utils/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 37 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 17 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 24 + plugins/scaffolder/package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 12 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- plugins/search-backend/CHANGELOG.md | 16 + plugins/search-backend/package.json | 2 +- plugins/search-react/CHANGELOG.md | 13 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 16 + plugins/search/package.json | 2 +- plugins/signals/CHANGELOG.md | 13 + plugins/signals/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 15 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 20 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 14 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 13 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 23 + plugins/techdocs/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 13 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 18 + plugins/user-settings/package.json | 2 +- 214 files changed, 3291 insertions(+), 107 deletions(-) create mode 100644 .changeset/create-app-1758639549.md create mode 100644 docs/releases/v1.44.0-next.0-changelog.md diff --git a/.changeset/create-app-1758639549.md b/.changeset/create-app-1758639549.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1758639549.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/pre.json b/.changeset/pre.json index 12e4285e7c..7003364d39 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -205,5 +205,33 @@ "@backstage/plugin-user-settings-backend": "0.3.6", "@backstage/plugin-user-settings-common": "0.0.1" }, - "changesets": [] + "changesets": [ + "brave-teeth-reply", + "brown-falcons-own", + "calm-trains-tie", + "clever-papers-watch", + "cold-coats-show", + "cool-baboons-count", + "create-app-1758639549", + "eager-toes-start", + "fast-heads-brake", + "fast-queens-guess", + "five-olives-bet", + "hungry-crews-fetch", + "itchy-falcons-leave", + "kind-places-reply", + "legal-eagles-jog", + "nice-readers-judge", + "public-sites-admire", + "rare-states-pay", + "ready-poems-change", + "ready-pots-arrive", + "red-times-bet", + "salty-words-wash", + "short-aliens-invite", + "solid-bikes-leave", + "tame-hairs-smash", + "tender-cups-tap", + "wet-spiders-wait" + ] } diff --git a/docs/releases/v1.44.0-next.0-changelog.md b/docs/releases/v1.44.0-next.0-changelog.md new file mode 100644 index 0000000000..601ea2b234 --- /dev/null +++ b/docs/releases/v1.44.0-next.0-changelog.md @@ -0,0 +1,1578 @@ +# Release v1.44.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.44.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.44.0-next.0) + +## @backstage/plugin-scaffolder-backend@3.0.0-next.0 + +### Major Changes + +- 9b81a90: **BREAKING** - Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. + + Affected types: `CreateWorkerOptions`, `CurrentClaimedTask`, `DatabaseTaskStore`, `DatabaseTaskStoreOptions`, `TaskManager`, `TaskStore`, `TaskStoreCreateTaskOptions`, `TaskStoreCreateTaskResult`, `TaskStoreEmitOptions`, `TaskStoreListEventsOptions`, `TaskStoreRecoverTaskOptions`, `TaskStoreShutDownTaskOptions`, `TaskWorker` and `TemplateActionRegistry`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.15-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.9.6-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.14-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.0 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/backend-defaults@0.13.0-next.0 + +### Minor Changes + +- 2d3e2b2: implement support for direct url for AzureBlobStorageUrlReader search function +- 8b91238: Adds support for configuring server-level HTTP options through the + `app-config.yaml` file under the `backend.server` key. Supported options + include `headersTimeout`, `keepAliveTimeout`, `requestTimeout`, `timeout`, + `maxHeadersCount`, and `maxRequestsPerSocket`. + + These are passed directly to the underlying Node.js HTTP server. + If omitted, Node.js defaults are used. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-app-api@1.2.7 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/cli-node@0.2.14 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-api-docs@0.13.0-next.0 + +### Minor Changes + +- b8a381e: Remove explicit dependency on `isomorphic-form-data`. + + This explicit dependency was added to address [an issue](https://github.com/swagger-api/swagger-ui/issues/7436) in the + dependency `swagger-ui-react`. That [issue has since been resolved](https://github.com/swagger-api/swagger-ui/issues/7436#issuecomment-889792304), + and `isomorphic-form-data` no longer needs to be declared. + + Additionally, this changeset updates the `swagger-ui-react` dependency to version `5.19.0` or higher, which includes + [compatibility](https://github.com/swagger-api/swagger-ui?tab=readme-ov-file#compatibility) with the latest versions of + the OpenAPI specification. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-scaffolder-node@0.12.0-next.0 + +### Minor Changes + +- 9b81a90: **BREAKING** - Marking optional fields as required in the `TaskBroker`, these can be fixed with a no-op `() => void` if you don't want to implement the functions. + + - `cancel`, `recoverTasks` and `retry` are the required methods on the `TaskBroker` interface. + + **NOTE**: If you're affected by this breaking change, please reach out to us in an issue as we're thinking about completely removing the `TaskBroker` extension point soon and would like to hear your use cases for the upcoming re-architecture of the `scaffolder-backend` plugin. + +### Patch Changes + +- c8aa210: **BREAKING ALPHA**: We've moved the `scaffolderActionsExtensionPoint` from `/alpha` to the main export. + + ```tsx + // before + import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; + + // after + import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; + ``` + +- 6e2bda7: **DEPRECATION**: We're going to be working on refactoring a lot of the internals of the Scaffolder backend plugin, and with that comes a lot of deprecations and removals for public types that are making these things hard. + + If you're using these types, please reach out to us either on Discord or a GitHub issue with your use cases. + + - `SerializedTask`, `SerializedTaskEvent`, `TaskBroker`, `TaskContext`, `TaskBrokerDispatchOptions`, `TaskBrokerDispatchResult`, `TaskCompletionState`, `TaskEventType`, `TaskFilter`, `TaskFilters`, `TaskStatus` are the types that have now been marked as deprecated, and will be removed in a future release. + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/app-defaults@1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/backend-dynamic-feature-service@0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-events-backend@0.5.6 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.14 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.37 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + +## @backstage/backend-test-utils@1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-app-api@1.2.7 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/cli@0.34.4-next.0 + +### Patch Changes + +- 6ebc1ea: Fixed module federation config by only setting `import: false` on shared libraries for remote. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.14 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.1.11 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + +## @backstage/core-compat-api@0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/version-bridge@1.0.11 + +## @backstage/core-components@0.18.2-next.0 + +### Patch Changes + +- d493126: Swap base token for semantic token in ItemCardHeader to ensure readability in light mode. +- 6981ae6: Fixed DependencyGraph `svg` size not adapting to the container size +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/version-bridge@1.0.11 + +## @backstage/create-app@0.7.5-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + +## @backstage/dev-utils@1.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + +## @backstage/frontend-app-api@0.13.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-defaults@0.3.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/frontend-defaults@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-app@0.3.1-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/frontend-app-api@0.13.1-next.0 + +## @backstage/frontend-dynamic-feature-loader@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/config@1.3.3 + +## @backstage/frontend-plugin-api@0.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/frontend-test-utils@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-app@0.3.1-next.0 + - @backstage/config@1.3.3 + - @backstage/frontend-app-api@0.13.1-next.0 + - @backstage/test-utils@1.7.11 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/integration@1.18.1-next.0 + +### Patch Changes + +- d772b51: remove host from azure blob storage integration type +- 84443f1: Adds config definitions for Azure Blob Storage. +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/integration-react@1.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + +## @techdocs/cli@1.9.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-techdocs-node@1.13.8-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.3 + +## @backstage/ui@0.7.2-next.0 + +### Patch Changes + +- 827340f: remove default selection of tab +- 9a47125: Improved SearchField component flex layout and animations. Fixed SearchField behavior in Header components by switching from width-based transitions to flex-basis transitions for better responsive behavior. Added new Storybook stories to test SearchField integration with Header component. + +## @backstage/plugin-app@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-app-visualizer@0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + +## @backstage/plugin-auth@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + +## @backstage/plugin-auth-react@0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + +## @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + +### Patch Changes + +- 2aded73: Allow for passing a `pagelen` parameter to configure the `pagelength` property of the `BitbucketCloudEntityProvider` `searchCode` pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + +## @backstage/plugin-catalog@1.31.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-catalog-backend@3.1.1-next.0 + +### Patch Changes + +- 9890488: Internal refactor to remove remnants of the old backend system + +- 2aaf01a: Fix for duplicate search results in entity-facets API call + +- e489661: Moved catalog processor and provider disabling and priorities under own config objects. + + This is due to issue with some existing providers, such as GitHub, using array syntax for the provider configuration. + + The new config format is not backwards compatible, so users will need to update their config files. The new format + is as follows: + + ```yaml + catalog: + providerOptions: + providerA: + disabled: false + providerB: + disabled: true + processorOptions: + processorA: + disabled: false + priority: 10 + processorB: + disabled: true + ``` + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.10-next.0 + +### Patch Changes + +- 84443f1: Adds config definitions for Azure Blob Storage. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.4-next.0 + +### Patch Changes + +- 2aded73: Allow for passing a `pagelen` parameter to configure the `pagelength` property of the `BitbucketCloudEntityProvider` `searchCode` pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-backend-module-github@0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.11.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.7.4-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/plugin-catalog-backend-module-logs@0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-catalog-graph@0.5.2-next.0 + +### Patch Changes + +- 87b5e6e: Add missing API implementation for catalog graph plugin in NFS apps. +- 6981ae6: Fixed DependencyGraph `svg` size not adapting to the container size +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-import@0.13.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + +## @backstage/plugin-catalog-react@1.21.2-next.0 + +### Patch Changes + +- 2a3704d: Correct translation key from "type" to "owner" for owner column in entity table to ensure the right translation is loaded. +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-test-utils@0.3.7-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + +## @backstage/plugin-config-schema@0.1.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-devtools@0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-devtools-common@0.1.17 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-devtools-backend@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.17 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/plugin-events-backend-module-github@0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + +## @backstage/plugin-home@0.8.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-home-react@0.1.31-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + +## @backstage/plugin-home-react@0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + +## @backstage/plugin-kubernetes@0.12.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.12-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-kubernetes-backend@0.20.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-kubernetes-node@0.3.5-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/plugin-kubernetes-cluster@0.0.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/plugin-kubernetes-react@0.5.12-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-kubernetes-common@0.9.7-next.0 + +### Patch Changes + +- bdd7f95: Make SERVICEACCOUNT_CA_PATH public so it can be imported by external modules. +- Updated dependencies + - @backstage/catalog-model@1.7.5 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/plugin-kubernetes-node@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/types@1.2.2 + +## @backstage/plugin-kubernetes-react@0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-mcp-actions-backend@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-notifications@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.1.0 + - @backstage/plugin-signals-react@0.0.15 + +## @backstage/plugin-org@0.6.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-catalog-common@1.1.5 + +## @backstage/plugin-org-react@0.1.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + +## @backstage/plugin-scaffolder@1.34.2-next.0 + +### Patch Changes + +- e0ffe84: Add missing `templatingExtensions` option to RouterProps.contextMenu to allow global control across scaffolder pages +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.15-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.16-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.14-next.0 + +### Patch Changes + +- baf1cab: Fix documentation strings to mention GCP instead of Azure +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.9.6-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.15-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-notifications-common@0.1.0 + - @backstage/plugin-notifications-node@0.2.19 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.15-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node-test-utils@0.3.4-next.0 + +## @backstage/plugin-scaffolder-common@1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-test-utils@1.9.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-react@1.19.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.36 + +## @backstage/plugin-search@1.4.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.19 + +## @backstage/plugin-search-backend@2.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + +## @backstage/plugin-search-backend-module-pg@0.5.49-next.0 + +### Patch Changes + +- a919ca3: Truncate long docs to fit PG index size limit +- 8d15a51: Added the < character to the query filter regexp +- Updated dependencies + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/plugin-search-common@1.2.19 + +## @backstage/plugin-search-backend-module-techdocs@0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/plugin-techdocs-node@1.13.8-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + +## @backstage/plugin-search-react@1.9.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.19 + +## @backstage/plugin-signals@0.0.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.15 + +## @backstage/plugin-techdocs@1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-addons-test-utils@1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/test-utils@1.7.11 + +## @backstage/plugin-techdocs-backend@2.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-techdocs-node@1.13.8-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.0 + +## @backstage/plugin-techdocs-node@1.13.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-react@1.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-user-settings@0.8.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.15 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-node@0.1.24 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.114-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.7.2-next.0 + - @backstage/plugin-catalog-graph@0.5.2-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-scaffolder@1.34.2-next.0 + - @backstage/plugin-api-docs@0.13.0-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-catalog-import@0.13.6-next.0 + - @backstage/plugin-home@0.8.13-next.0 + - @backstage/plugin-kubernetes@0.12.12-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.0 + - @backstage/plugin-org@0.6.45-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/plugin-search@1.4.31-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.0 + - @backstage/plugin-user-settings@0.8.27-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.0 + - @backstage/plugin-devtools@0.1.32-next.0 + - @backstage/plugin-notifications@0.5.10-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-signals@0.0.24-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/frontend-app-api@0.13.1-next.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + +## example-app-next@0.0.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.7.2-next.0 + - @backstage/plugin-catalog-graph@0.5.2-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-scaffolder@1.34.2-next.0 + - @backstage/plugin-api-docs@0.13.0-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-catalog-import@0.13.6-next.0 + - @backstage/plugin-home@0.8.13-next.0 + - @backstage/plugin-kubernetes@0.12.12-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.0 + - @backstage/plugin-org@0.6.45-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/plugin-search@1.4.31-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.0 + - @backstage/plugin-user-settings@0.8.27-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/frontend-defaults@0.3.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-app@0.3.1-next.0 + - @backstage/plugin-app-visualizer@0.1.24-next.0 + - @backstage/plugin-auth@0.1.1-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.0 + - @backstage/plugin-notifications@0.5.10-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-signals@0.0.24-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/frontend-app-api@0.13.1-next.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + +## app-next-example-plugin@0.0.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + +## example-backend@0.0.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.15-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.0 + - @backstage/plugin-scaffolder-backend@3.0.0-next.0 + - @backstage/plugin-app-backend@0.5.6 + - @backstage/plugin-auth-backend@0.25.4 + - @backstage/plugin-auth-backend-module-github-provider@0.3.7 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-devtools-backend@0.5.10-next.0 + - @backstage/plugin-events-backend@0.5.6 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.4 + - @backstage/plugin-kubernetes-backend@0.20.3-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.4-next.0 + - @backstage/plugin-notifications-backend@0.5.10 + - @backstage/plugin-permission-backend@0.7.4 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-proxy-backend@0.6.6 + - @backstage/plugin-search-backend@2.0.7-next.0 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/plugin-signals-backend@0.3.8 + - @backstage/plugin-techdocs-backend@2.1.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.15-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.12 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.6 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.4 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.12 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-backend-module-catalog@0.3.8 + - @backstage/plugin-search-backend-module-explore@0.3.7 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.0 + +## e2e-test@0.2.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.7.5-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.7 + +## @internal/frontend@0.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @internal/scaffolder@0.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + +## techdocs-cli-embedded-app@0.2.113-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/test-utils@1.7.11 + - @backstage/theme@0.6.8 + +## @internal/plugin-todo-list@1.0.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 diff --git a/package.json b/package.json index 5904f0f305..c58f5fb3d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.43.0", + "version": "1.44.0-next.0", "backstage": { "cli": { "new": { diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 02f126bcf5..e5d901b279 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-permission-react@0.4.36 + ## 1.7.0 ### Minor Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 37973fbf0f..e872055314 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.7.0", + "version": "1.7.1-next.0", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md index 7949e120fa..4dfaaa596d 100644 --- a/packages/app-next-example-plugin/CHANGELOG.md +++ b/packages/app-next-example-plugin/CHANGELOG.md @@ -1,5 +1,13 @@ # app-next-example-plugin +## 0.0.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + ## 0.0.27 ### Patch Changes diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json index 3b76202029..384911f923 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-next-example-plugin/package.json @@ -1,6 +1,6 @@ { "name": "app-next-example-plugin", - "version": "0.0.27", + "version": "0.0.28-next.0", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index 7e66d0d041..c1abb0f661 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,52 @@ # example-app-next +## 0.0.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.7.2-next.0 + - @backstage/plugin-catalog-graph@0.5.2-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-scaffolder@1.34.2-next.0 + - @backstage/plugin-api-docs@0.13.0-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-catalog-import@0.13.6-next.0 + - @backstage/plugin-home@0.8.13-next.0 + - @backstage/plugin-kubernetes@0.12.12-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.0 + - @backstage/plugin-org@0.6.45-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/plugin-search@1.4.31-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.0 + - @backstage/plugin-user-settings@0.8.27-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/frontend-defaults@0.3.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-app@0.3.1-next.0 + - @backstage/plugin-app-visualizer@0.1.24-next.0 + - @backstage/plugin-auth@0.1.1-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.0 + - @backstage/plugin-notifications@0.5.10-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-signals@0.0.24-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/frontend-app-api@0.13.1-next.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + ## 0.0.27 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 461b5673fc..99b0a23f51 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.27", + "version": "0.0.28-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 533f4ab84c..daa56a15da 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,47 @@ # example-app +## 0.2.114-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.7.2-next.0 + - @backstage/plugin-catalog-graph@0.5.2-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-scaffolder@1.34.2-next.0 + - @backstage/plugin-api-docs@0.13.0-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-catalog-import@0.13.6-next.0 + - @backstage/plugin-home@0.8.13-next.0 + - @backstage/plugin-kubernetes@0.12.12-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.0 + - @backstage/plugin-org@0.6.45-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/plugin-search@1.4.31-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.0 + - @backstage/plugin-user-settings@0.8.27-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.0 + - @backstage/plugin-devtools@0.1.32-next.0 + - @backstage/plugin-notifications@0.5.10-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-signals@0.0.24-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/frontend-app-api@0.13.1-next.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + ## 0.2.113 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 90ffcd0b3b..0d0ad4e1c2 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.113", + "version": "0.2.114-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 1adfd0f80e..e390e71e79 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/backend-defaults +## 0.13.0-next.0 + +### Minor Changes + +- 2d3e2b2: implement support for direct url for AzureBlobStorageUrlReader search function +- 8b91238: Adds support for configuring server-level HTTP options through the + `app-config.yaml` file under the `backend.server` key. Supported options + include `headersTimeout`, `keepAliveTimeout`, `requestTimeout`, `timeout`, + `maxHeadersCount`, and `maxRequestsPerSocket`. + + These are passed directly to the underlying Node.js HTTP server. + If omitted, Node.js defaults are used. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-app-api@1.2.7 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-dev-utils@0.1.5 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/cli-node@0.2.14 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + ## 0.12.1 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 013e32db59..4a27d65c33 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.12.1", + "version": "0.13.0-next.0", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index e3f857785d..2e2a966438 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/backend-dynamic-feature-service +## 0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-events-backend@0.5.6 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.14 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.37 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + ## 0.7.4 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 04577cbf43..268d54c180 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dynamic-feature-service", - "version": "0.7.4", + "version": "0.7.5-next.0", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index cc82ef5593..d81c184682 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/backend-test-utils +## 1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-app-api@1.2.7 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + ## 1.9.0 ### Minor Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index 868c98a8f2..a9b160bcd8 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "1.9.0", + "version": "1.9.1-next.0", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 398465966e..a1e68bd8e7 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,46 @@ # example-backend +## 0.0.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.15-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.0 + - @backstage/plugin-scaffolder-backend@3.0.0-next.0 + - @backstage/plugin-app-backend@0.5.6 + - @backstage/plugin-auth-backend@0.25.4 + - @backstage/plugin-auth-backend-module-github-provider@0.3.7 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-devtools-backend@0.5.10-next.0 + - @backstage/plugin-events-backend@0.5.6 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.4 + - @backstage/plugin-kubernetes-backend@0.20.3-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.4-next.0 + - @backstage/plugin-notifications-backend@0.5.10 + - @backstage/plugin-permission-backend@0.7.4 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-proxy-backend@0.6.6 + - @backstage/plugin-search-backend@2.0.7-next.0 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/plugin-signals-backend@0.3.8 + - @backstage/plugin-techdocs-backend@2.1.1-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.15-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.12 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.6 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.4 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.12 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-backend-module-catalog@0.3.8 + - @backstage/plugin-search-backend-module-explore@0.3.7 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.0 + ## 0.0.42 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 8bca4f3b22..15bfab297f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.42", + "version": "0.0.43-next.0", "backstage": { "role": "backend" }, diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 7947c15cbb..8c35d62164 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/cli +## 0.34.4-next.0 + +### Patch Changes + +- 6ebc1ea: Fixed module federation config by only setting `import: false` on shared libraries for remote. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/cli-common@0.1.15 + - @backstage/cli-node@0.2.14 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.1.11 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + ## 0.34.2 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index f50a5601eb..99a4c56b58 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.34.2", + "version": "0.34.4-next.0", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index eb4c7d051f..a1d9a3d37d 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-compat-api +## 0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/version-bridge@1.0.11 + ## 0.5.2 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index acab8947c8..1ccb842a9c 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-compat-api", - "version": "0.5.2", + "version": "0.5.3-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 63e6e45065..adb205392f 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/core-components +## 0.18.2-next.0 + +### Patch Changes + +- d493126: Swap base token for semantic token in ItemCardHeader to ensure readability in light mode. +- 6981ae6: Fixed DependencyGraph `svg` size not adapting to the container size +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/version-bridge@1.0.11 + ## 0.18.0 ### Minor Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index d369052e99..4e16285cfb 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.18.0", + "version": "0.18.2-next.0", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 5d317d4afa..245cd34a46 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.7.5-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.15 + ## 0.7.4 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 263d65e5c8..0330fb9663 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.4", + "version": "0.7.5-next.0", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 47ec659481..10177c7c7d 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/dev-utils +## 1.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + ## 1.1.14 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 40882a898b..055f4f94b7 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.14", + "version": "1.1.15-next.0", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 471c2fc53e..fae3f16eb4 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.7.5-next.0 + - @backstage/cli-common@0.1.15 + - @backstage/errors@1.2.7 + ## 0.2.32 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 6b255f43b1..80a2ea7d3f 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.32", + "version": "0.2.33-next.0", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 1a23d4b535..80591e1bd9 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/frontend-app-api +## 0.13.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-defaults@0.3.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 0.13.0 ### Minor Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 3f2dab8571..bd52912d55 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.13.0", + "version": "0.13.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 65713fac5f..2ebae3e384 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/frontend-defaults +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-app@0.3.1-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/frontend-app-api@0.13.1-next.0 + ## 0.3.1 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 6a8b100c0d..06efcf0576 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.3.1", + "version": "0.3.2-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-dynamic-feature-loader/CHANGELOG.md b/packages/frontend-dynamic-feature-loader/CHANGELOG.md index 0e7886365d..fd185af296 100644 --- a/packages/frontend-dynamic-feature-loader/CHANGELOG.md +++ b/packages/frontend-dynamic-feature-loader/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/frontend-dynamic-feature-loader +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/config@1.3.3 + ## 0.1.5 ### Patch Changes diff --git a/packages/frontend-dynamic-feature-loader/package.json b/packages/frontend-dynamic-feature-loader/package.json index 7ed00c92de..bda6b0686c 100644 --- a/packages/frontend-dynamic-feature-loader/package.json +++ b/packages/frontend-dynamic-feature-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-dynamic-feature-loader", - "version": "0.1.5", + "version": "0.1.6-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index 7de465f8c0..c0e28a9529 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/frontend +## 0.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 0.0.13 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 2399eaa453..41943f4e89 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.13", + "version": "0.0.14-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 647bd8f6f1..537939e8a5 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/frontend-plugin-api +## 0.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 0.12.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 1e261787fb..714cd0471a 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.12.0", + "version": "0.12.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 4e96c27dd3..6f17abe709 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/frontend-test-utils +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-app@0.3.1-next.0 + - @backstage/config@1.3.3 + - @backstage/frontend-app-api@0.13.1-next.0 + - @backstage/test-utils@1.7.11 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 0.3.6 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index ba71540d7a..7aab8a9265 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.3.6", + "version": "0.3.7-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index b152cf511b..efc73ec308 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + ## 1.2.10 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index a3d8000f94..fe6c47f736 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.10", + "version": "1.2.11-next.0", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 946e392c0b..b03eff3ebc 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/integration +## 1.18.1-next.0 + +### Patch Changes + +- d772b51: remove host from azure blob storage integration type +- 84443f1: Adds config definitions for Azure Blob Storage. +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 1.18.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 68289e2079..8d7f655e2b 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.18.0", + "version": "1.18.1-next.0", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index de8c725e03..e636e2ccc8 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/scaffolder +## 0.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + ## 0.0.13 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index abbd487103..9f490a8b62 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.13", + "version": "0.0.14-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 76a8f81a63..5eda7ebcaf 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.113-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/test-utils@1.7.11 + - @backstage/theme@0.6.8 + ## 0.2.112 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 09e974ed88..577426d02c 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.112", + "version": "0.2.113-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 1fb32bec51..9d47af4de6 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.9.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-techdocs-node@1.13.8-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.3 + ## 1.9.8 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 7ce62cd803..4a4675c6e1 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.9.8", + "version": "1.9.9-next.0", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 0fcd9d2ff6..4c9d6f833b 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/ui +## 0.7.2-next.0 + +### Patch Changes + +- 827340f: remove default selection of tab +- 9a47125: Improved SearchField component flex layout and animations. Fixed SearchField behavior in Header components by switching from width-based transitions to flex-basis transitions for better responsive behavior. Added new Storybook stories to test SearchField integration with Header component. + ## 0.7.1 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 80192895d9..b4432c8b6b 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/ui", - "version": "0.7.1", + "version": "0.7.2-next.0", "backstage": { "role": "web-library" }, diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 4a40848ced..817b60fd0c 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-api-docs +## 0.13.0-next.0 + +### Minor Changes + +- b8a381e: Remove explicit dependency on `isomorphic-form-data`. + + This explicit dependency was added to address [an issue](https://github.com/swagger-api/swagger-ui/issues/7436) in the + dependency `swagger-ui-react`. That [issue has since been resolved](https://github.com/swagger-api/swagger-ui/issues/7436#issuecomment-889792304), + and `isomorphic-form-data` no longer needs to be declared. + + Additionally, this changeset updates the `swagger-ui-react` dependency to version `5.19.0` or higher, which includes + [compatibility](https://github.com/swagger-api/swagger-ui?tab=readme-ov-file#compatibility) with the latest versions of + the OpenAPI specification. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + ## 0.12.11 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 810279ed39..0012ec9b54 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.12.11", + "version": "0.13.0-next.0", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index bc5ac063cc..85876e49b2 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-app-visualizer +## 0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + ## 0.1.23 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 4affb81b50..b0ce29d3c8 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.1.23", + "version": "0.1.24-next.0", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index c1026add86..615f644cc4 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-app +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.36 + ## 0.3.0 ### Minor Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index d17d903b0a..c0934f7c54 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.3.0", + "version": "0.3.1-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index 88440f314b..86662ef3f3 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-react +## 0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + ## 0.1.19 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index 77b01bfdd1..a41ccd3432 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-react", - "version": "0.1.19", + "version": "0.1.20-next.0", "description": "Web library for the auth plugin", "backstage": { "role": "web-library", diff --git a/plugins/auth/CHANGELOG.md b/plugins/auth/CHANGELOG.md index 7092c0bf3c..506006165a 100644 --- a/plugins/auth/CHANGELOG.md +++ b/plugins/auth/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + ## 0.1.0 ### Minor Changes diff --git a/plugins/auth/package.json b/plugins/auth/package.json index dffb0eb8ff..578a7246ec 100644 --- a/plugins/auth/package.json +++ b/plugins/auth/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth", - "version": "0.1.0", + "version": "0.1.1-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "auth", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 31345b723c..4c7a9afb60 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.3.3-next.0 + +### Patch Changes + +- 2aded73: Allow for passing a `pagelen` parameter to configure the `pagelength` property of the `BitbucketCloudEntityProvider` `searchCode` pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + ## 0.3.2 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 1c72ef31b9..2375f46dc2 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.3.2", + "version": "0.3.3-next.0", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 0836bee10d..582cea0429 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.4.15 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 3f21de8eb1..48088f2529 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.15", + "version": "0.4.16-next.0", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 842d0498cf..7b58ca6a0b 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.10-next.0 + +### Patch Changes + +- 84443f1: Adds config definitions for Azure Blob Storage. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.3.9 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index 17c66699a5..bc337337f0 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.9", + "version": "0.3.10-next.0", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 45d3c5ed5b..531418dc68 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.5.4-next.0 + +### Patch Changes + +- 2aded73: Allow for passing a `pagelen` parameter to configure the `pagelength` property of the `BitbucketCloudEntityProvider` `searchCode` pagination to resolve [bug](https://jira.atlassian.com/browse/BCLOUD-23644) pertaining to duplicate results being returned. +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + ## 0.5.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 68dfbaa619..562911f1bd 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.5.3", + "version": "0.5.4-next.0", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 1df0cda05b..72f0f277ed 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + ## 0.5.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index ce3ec49ae8..abbd7be1aa 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.5.3", + "version": "0.5.4-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index 4d06b61dbe..c02fe65bd5 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 8fb1acd48f..1123f00416 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.12", + "version": "0.3.13-next.0", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 097e4f344f..c26520ccc5 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 1c4d7e8aa7..2586dda386 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.3.6", + "version": "0.3.7-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gitea/CHANGELOG.md b/plugins/catalog-backend-module-gitea/CHANGELOG.md index 3274f6c9f1..09f2a60401 100644 --- a/plugins/catalog-backend-module-gitea/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gitea +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json index c9dacc7b64..3fac7944e1 100644 --- a/plugins/catalog-backend-module-gitea/package.json +++ b/plugins/catalog-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitea", - "version": "0.1.4", + "version": "0.1.5-next.0", "license": "Apache-2.0", "description": "The gitea backend module for the catalog plugin.", "main": "src/index.ts", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index 6198a1942e..ad55f9a4f5 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.11.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + ## 0.3.14 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index f9c1f516fb..a862c80768 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.14", + "version": "0.3.15-next.0", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 718a0035e8..c4cfc67865 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-github +## 0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + ## 0.11.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 5187103233..cf564acfe1 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.11.0", + "version": "0.11.1-next.0", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index 022eb1445a..654d97b7c1 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.7.4-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + ## 0.2.13 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index 09f6ee7811..09d9796167 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 2610055302..d4f3382f60 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + ## 0.7.3 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index c18be1028b..4a48f14bd6 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", - "version": "0.7.3", + "version": "0.7.4-next.0", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index aa22c5aad7..d25514e90f 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + ## 0.7.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index ffc675fcff..7aa7c5e7b1 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.7.4", + "version": "0.7.5-next.0", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index fbc0b1dfa7..2f62c77773 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.1.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-events-node@0.4.15 + ## 0.1.14 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index 3b27e9cd79..74c71fd3fe 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.14", + "version": "0.1.15-next.0", "description": "A module that subscribes to catalog related events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 6cef384c74..72eecbb0df 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.2.14 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 155c24115d..e8d9a5b741 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.14", + "version": "0.2.15-next.0", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index a654ff5c3d..6cddd6166b 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index beed6b3028..5f1f4277d2 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 54be12f4cb..0ec926a05c 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,48 @@ # @backstage/plugin-catalog-backend +## 3.1.1-next.0 + +### Patch Changes + +- 9890488: Internal refactor to remove remnants of the old backend system +- 2aaf01a: Fix for duplicate search results in entity-facets API call +- e489661: Moved catalog processor and provider disabling and priorities under own config objects. + + This is due to issue with some existing providers, such as GitHub, using array syntax for the provider configuration. + + The new config format is not backwards compatible, so users will need to update their config files. The new format + is as follows: + + ```yaml + catalog: + providerOptions: + providerA: + disabled: false + providerB: + disabled: true + processorOptions: + processorA: + disabled: false + priority: 10 + processorB: + disabled: true + ``` + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + ## 3.1.0 ### Minor Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index a880cc224f..ec09efc9a3 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "3.1.0", + "version": "3.1.1-next.0", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 8d19916dab..4293e64516 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-graph +## 0.5.2-next.0 + +### Patch Changes + +- 87b5e6e: Add missing API implementation for catalog graph plugin in NFS apps. +- 6981ae6: Fixed DependencyGraph `svg` size not adapting to the container size +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/types@1.2.2 + ## 0.5.0 ### Minor Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 86bd930095..aa66e4a234 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.5.0", + "version": "0.5.2-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 9c8778e168..10252aadbe 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-import +## 0.13.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.5 + ## 0.13.5 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 97b7283ab9..8065881127 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.13.5", + "version": "0.13.6-next.0", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index f5e4d26638..bfc54981fa 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-react +## 1.21.2-next.0 + +### Patch Changes + +- 2a3704d: Correct translation key from "type" to "owner" for owner column in entity table to ensure the right translation is loaded. +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-test-utils@0.3.7-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-permission-react@0.4.36 + ## 1.21.0 ### Minor Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index dabfb55d11..b645537a7e 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.21.0", + "version": "1.21.2-next.0", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 31667429ca..3483042a69 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + ## 0.2.21 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 9fdd8b5e29..0abe8ae2be 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.2.21", + "version": "0.2.22-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 8ae3b4c8da..a10136e79b 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog +## 1.31.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.31.3 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 2a7a956c37..580b6abdb9 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.31.3", + "version": "1.31.4-next.0", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 74c7a68e58..5e94cbe988 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-config-schema +## 0.1.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.1.72 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 78addfd9c2..c49c1e9087 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-config-schema", - "version": "0.1.72", + "version": "0.1.73-next.0", "description": "A Backstage plugin that lets you browse the configuration schema of your app", "backstage": { "role": "frontend-plugin", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index eeaeda6605..9213c182e9 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-devtools-backend +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/cli-common@0.1.15 + - @backstage/config@1.3.3 + - @backstage/config-loader@1.10.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.17 + - @backstage/plugin-permission-common@0.9.1 + ## 0.5.9 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index c3892d274f..3a95c1dbf9 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.5.9", + "version": "0.5.10-next.0", "backstage": { "role": "backend-plugin", "pluginId": "devtools", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index de537019e3..7f5ad6310d 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-devtools +## 0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-devtools-common@0.1.17 + - @backstage/plugin-permission-react@0.4.36 + ## 0.1.31 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 9629d30370..ea69e09e86 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.31", + "version": "0.1.32-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 28495671fb..483afda21f 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-github +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + ## 0.4.4 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index aebbc6eddf..d9cd60cedc 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.4.4", + "version": "0.4.5-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 621859a9ab..564ed40cb9 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-plugin-api@1.11.0 + ## 1.0.43 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index f0273e482b..c8f75da342 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.43", + "version": "1.0.44-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index b4fff66b63..37c1ac8b57 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-home-react +## 0.1.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + ## 0.1.30 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index bce8419b08..dbc036029b 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.30", + "version": "0.1.31-next.0", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 5731706ece..1ce162951b 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-home +## 0.8.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-home-react@0.1.31-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + ## 0.8.12 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index a348b8eff9..70bba26ce4 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.8.12", + "version": "0.8.13-next.0", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 1ede69fa30..c67593601c 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-kubernetes-backend +## 0.20.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-kubernetes-node@0.3.5-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-permission-common@0.9.1 + ## 0.20.2 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 6d029eae95..51ea136593 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.20.2", + "version": "0.20.3-next.0", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 7f7cf88809..4d05386487 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/plugin-kubernetes-react@0.5.12-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-permission-react@0.4.36 + ## 0.0.29 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index e789c3edaf..8d65670f28 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.29", + "version": "0.0.30-next.0", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 64ea6455e4..0ec9185623 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-common +## 0.9.7-next.0 + +### Patch Changes + +- bdd7f95: Make SERVICEACCOUNT_CA_PATH public so it can be imported by external modules. +- Updated dependencies + - @backstage/catalog-model@1.7.5 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + ## 0.9.6 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index cde58de050..f78da14fa6 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-common", - "version": "0.9.6", + "version": "0.9.7-next.0", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index d7366fa90c..8870323c75 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-node +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/types@1.2.2 + ## 0.3.4 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index 2c4c043ec5..cd204be633 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.3.4", + "version": "0.3.5-next.0", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index c542907fe6..033d51737b 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-react +## 0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.5.11 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index 82e3d59d8b..c417938b40 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.5.11", + "version": "0.5.12-next.0", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 627226fee0..991781331c 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-kubernetes +## 0.12.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-kubernetes-react@0.5.12-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-permission-react@0.4.36 + ## 0.12.11 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index e9da7b47ec..aaf3c0f65d 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.11", + "version": "0.12.12-next.0", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/mcp-actions-backend/CHANGELOG.md b/plugins/mcp-actions-backend/CHANGELOG.md index 8f079b5dd6..dbc8326e1a 100644 --- a/plugins/mcp-actions-backend/CHANGELOG.md +++ b/plugins/mcp-actions-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-mcp-actions-backend +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.1.3 ### Patch Changes diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index 4b8bbd3b72..cf2b5e1d74 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mcp-actions-backend", - "version": "0.1.3", + "version": "0.1.4-next.0", "backstage": { "role": "backend-plugin", "pluginId": "mcp-actions", diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 9ce2086421..1c1e910e44 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-notifications +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.1.0 + - @backstage/plugin-signals-react@0.0.15 + ## 0.5.9 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index e6d66a5ec7..092a26c3ba 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.5.9", + "version": "0.5.10-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index aee4c9702e..dd586ca211 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org-react +## 0.1.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + ## 0.1.42 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index c177584968..94d8e62962 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.42", + "version": "0.1.43-next.0", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 6a62f12664..b9fa9ec4d6 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-org +## 0.6.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-catalog-common@1.1.5 + ## 0.6.44 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 9d1c60072c..0868489426 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.44", + "version": "0.6.45-next.0", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index fc6d08bf48..c4c021f726 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index c1db900f79..837b6e4d8c 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index cc61bd54fd..3648ebf879 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index a68a30da84..b2d9b1b92c 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index ff9e8a84d1..3e573f638d 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 452653afb7..97f8abc1aa 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index 25ff743f3c..535f4bab5c 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.15-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.3.14 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index b88bfcc259..957dff0afc 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.14", + "version": "0.3.15-next.0", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 354a075745..fb5bbbfaf5 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.3.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index a708176e47..e4ef5be916 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.13", + "version": "0.3.14-next.0", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 24b6ca0dd4..a9dbde5b6f 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.16-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.3.15 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 6300973618..530732acd0 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.15", + "version": "0.3.16-next.0", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index e7c99d1075..83e72c1e3a 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.14-next.0 + +### Patch Changes + +- baf1cab: Fix documentation strings to mention GCP instead of Azure +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index bc3a2cbabb..0a4609c457 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index c6b2802b91..58877701b2 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 3a4013a54e..928c3965f3 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index 4c76e53bf5..f6309bd70b 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index acc972343f..cc6e18fbd2 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.13", + "version": "0.2.14-next.0", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 7f7ba5a597..1a2f46d3fb 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.9.1-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + ## 0.9.0 ### Minor Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 50fc1646e0..49851f967a 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.9.0", + "version": "0.9.1-next.0", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index df082eb7eb..1b371afb91 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.9.6-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.9.5 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index f8194a434c..64eb919a59 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.9.5", + "version": "0.9.6-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index bf28a5d88f..5937669786 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.15-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-notifications-common@0.1.0 + - @backstage/plugin-notifications-node@0.2.19 + ## 0.1.14 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 22aaa22396..4220fc14ba 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.14", + "version": "0.1.15-next.0", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 5970f3f8a2..f8cf3b6e3f 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.5.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index c6f57ae2a4..589b4cf729 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.13", + "version": "0.5.14-next.0", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 097b7f38f3..fca74f3951 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.2.14-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + ## 0.2.13 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 55930738b6..f07e77413f 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.2.13", + "version": "0.2.14-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 9ac2c16a7e..449503e901 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.15-next.0 + +### Patch Changes + +- c8aa210: Updating import for the `scaffolderActionsExtensionPoint` to be the main export +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node-test-utils@0.3.4-next.0 + ## 0.4.14 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index e5b60c405d..295b154103 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.14", + "version": "0.4.15-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 94b1ed5e93..1e3fbe7bf1 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-scaffolder-backend +## 3.0.0-next.0 + +### Major Changes + +- 9b81a90: **BREAKING** - Removing the deprecated types and interfaces, there's no replacement for these types, and hopefully not currently used as they offer no value with the plugin being on the new backend system and no way to consume them. + + Affected types: `CreateWorkerOptions`, `CurrentClaimedTask`, `DatabaseTaskStore`, `DatabaseTaskStoreOptions`, `TaskManager`, `TaskStore`, `TaskStoreCreateTaskOptions`, `TaskStoreCreateTaskResult`, `TaskStoreEmitOptions`, `TaskStoreListEventsOptions`, `TaskStoreRecoverTaskOptions`, `TaskStoreShutDownTaskOptions`, `TaskWorker` and `TemplateActionRegistry`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.15-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.9.6-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.14-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.14-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.3-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.0 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + ## 2.2.1 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 53aab2b891..99faf1bf5b 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "2.2.1", + "version": "3.0.0-next.0", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 2c8133b33c..67e4b5058d 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-common +## 1.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + ## 1.7.1 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 63ddd99e9e..3a4eef3e03 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-common", - "version": "1.7.1", + "version": "1.7.2-next.0", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index d14226a463..2520b628e7 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.0-next.0 + - @backstage/backend-test-utils@1.9.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/types@1.2.2 + ## 0.3.3 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index 8baac6e67f..3cbae20d33 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.3.3", + "version": "0.3.4-next.0", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index c322aa5700..750fd7ce98 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-scaffolder-node +## 0.12.0-next.0 + +### Minor Changes + +- 9b81a90: **BREAKING** - Marking optional fields as required in the `TaskBroker`, these can be fixed with a no-op `() => void` if you don't want to implement the functions. + + - `cancel`, `recoverTasks` and `retry` are the required methods on the `TaskBroker` interface. + + **NOTE**: If you're affected by this breaking change, please reach out to us in an issue as we're thinking about completely removing the `TaskBroker` extension point soon and would like to hear your use cases for the upcoming re-architecture of the `scaffolder-backend` plugin. + +### Patch Changes + +- c8aa210: **BREAKING ALPHA**: We've moved the `scaffolderActionsExtensionPoint` from `/alpha` to the main export. + + ```tsx + // before + import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; + + // after + import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node'; + ``` + +- 6e2bda7: **DEPRECATION**: We're going to be working on refactoring a lot of the internals of the Scaffolder backend plugin, and with that comes a lot of deprecations and removals for public types that are making these things hard. + + If you're using these types, please reach out to us either on Discord or a GitHub issue with your use cases. + + - `SerializedTask`, `SerializedTaskEvent`, `TaskBroker`, `TaskContext`, `TaskBrokerDispatchOptions`, `TaskBrokerDispatchResult`, `TaskCompletionState`, `TaskEventType`, `TaskFilter`, `TaskFilters`, `TaskStatus` are the types that have now been marked as deprecated, and will be removed in a future release. + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + ## 0.11.1 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index a3ae56d3d5..88a7ebf8ce 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.11.1", + "version": "0.12.0-next.0", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 12061a9561..cda6c9b6a6 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-scaffolder-react +## 1.19.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.36 + ## 1.19.1 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index f33c6e0a70..ac452d2205 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.19.1", + "version": "1.19.2-next.0", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 5b331f64d3..d4b6a5bd15 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-scaffolder +## 1.34.2-next.0 + +### Patch Changes + +- e0ffe84: Add missing `templatingExtensions` option to RouterProps.contextMenu to allow global control across scaffolder pages +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.34.1 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 6190cefbac..fe2c88e3ed 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.34.1", + "version": "1.34.2-next.0", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 14afeae46a..2b148f8542 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.49-next.0 + +### Patch Changes + +- a919ca3: Truncate long docs to fit PG index size limit +- 8d15a51: Added the < character to the query filter regexp +- Updated dependencies + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/plugin-search-common@1.2.19 + ## 0.5.48 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 4a385fffeb..312783ddc3 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.48", + "version": "0.5.49-next.0", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 1a952bbb9b..a23f555d67 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/plugin-techdocs-node@1.13.8-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + ## 0.4.6 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 89bb5f964c..4a4a13d3e6 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.4.6", + "version": "0.4.7-next.0", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 323d97127b..9bef273db2 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend +## 2.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + ## 2.0.6 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 1802646e5d..4e61e05ce6 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "2.0.6", + "version": "2.0.7-next.0", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index d8133c742e..6a23e79db4 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-react +## 1.9.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.19 + ## 1.9.4 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 2fbfa9267f..7bd07a786e 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.9.4", + "version": "1.9.5-next.0", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 5bd43fd7c4..d3119d0c9a 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search +## 1.4.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-search-common@1.2.19 + ## 1.4.30 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 6ecbb32437..48f462897d 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.30", + "version": "1.4.31-next.0", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index cb5c18da48..4d878217e4 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-signals +## 0.0.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.15 + ## 0.0.23 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index c3a3f9ad66..d4ecc528c5 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.23", + "version": "0.0.24-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "signals", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 11f82bfe63..32d6473083 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/test-utils@1.7.11 + ## 1.1.0 ### Minor Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 2de0951a9c..0c24577409 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.1.0", + "version": "1.1.1-next.0", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 1234dd5b58..970677836e 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-techdocs-backend +## 2.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/plugin-techdocs-node@1.13.8-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + ## 2.1.0 ### Minor Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index c9d0218404..7bc5e52385 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.1.0", + "version": "2.1.1-next.0", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index d3842b48d6..841e350d23 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.0 + ## 1.1.28 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 12522a0949..92e40a664c 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.28", + "version": "1.1.29-next.0", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 6cc19abea5..b3bcc36620 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-node +## 1.13.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.17 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.13.7 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index d7ecd3b661..5d36d96287 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.13.7", + "version": "1.13.8-next.0", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index d03925b40d..4e11d1c6f9 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-react +## 1.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.3.3 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 13e9dfc66c..6020c8fb78 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-react", - "version": "1.3.3", + "version": "1.3.4-next.0", "description": "Shared frontend utilities for TechDocs and Addons", "backstage": { "role": "web-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 7bdefe0293..67a2e51ad8 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs +## 1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/integration@1.18.1-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.0 + - @backstage/catalog-client@1.12.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.15.0 ### Minor Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 7f03dd32f5..ffc41132fe 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.15.0", + "version": "1.15.1-next.0", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 20a635d42e..7b9763d4da 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-user-settings-backend +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-node@0.1.24 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.3.6 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index f1f8a3ba68..30c7355ba1 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.3.6", + "version": "0.3.7-next.0", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index fba325d67f..2c3a347cd7 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-user-settings +## 0.8.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/core-compat-api@0.5.3-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/core-app-api@1.19.0 + - @backstage/core-plugin-api@1.11.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.6.8 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.15 + - @backstage/plugin-user-settings-common@0.0.1 + ## 0.8.26 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 1ec4ac7072..8b0c297f70 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.8.26", + "version": "0.8.27-next.0", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", From 3b8e156c140ca73fca70c77323ebf290fcca76cb Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Tue, 23 Sep 2025 20:43:05 +0300 Subject: [PATCH 101/177] fix: default notification recipient resolver exclusion Signed-off-by: Hellgren Heikki --- .changeset/slimy-signs-agree.md | 5 ++ ...faultNotificationRecipientResolver.test.ts | 10 +-- .../DefaultNotificationRecipientResolver.ts | 16 ++--- .../src/service/router.test.ts | 69 +++++++++++++++++++ 4 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 .changeset/slimy-signs-agree.md diff --git a/.changeset/slimy-signs-agree.md b/.changeset/slimy-signs-agree.md new file mode 100644 index 0000000000..c4307f0bd7 --- /dev/null +++ b/.changeset/slimy-signs-agree.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend': patch +--- + +Fixed exclude entity reference not working in notification sending diff --git a/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.test.ts b/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.test.ts index cd17db3680..7faec0c23c 100644 --- a/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.test.ts +++ b/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.test.ts @@ -34,7 +34,7 @@ describe('getUsersForEntityRef', () => { await expect( resolver.resolveNotificationRecipients({ entityRefs: ['user:foo', 'user:ignored'], - excludeEntityRefs: ['user:ignored'], + excludedEntityRefs: ['user:ignored'], }), ).resolves.toEqual({ userEntityRefs: ['user:foo'] }); expect(catalog.getEntitiesByRefs).not.toHaveBeenCalled(); @@ -87,7 +87,7 @@ describe('getUsersForEntityRef', () => { await expect( resolver.resolveNotificationRecipients({ entityRefs: ['group:default/parent_group'], - excludeEntityRefs: ['user:default/ignored'], + excludedEntityRefs: ['user:default/ignored'], }), ).resolves.toEqual({ userEntityRefs: ['user:default/foo', 'user:default/bar'], @@ -120,7 +120,7 @@ describe('getUsersForEntityRef', () => { await expect( resolver.resolveNotificationRecipients({ entityRefs: ['component:default/test_component'], - excludeEntityRefs: [], + excludedEntityRefs: [], }), ).resolves.toEqual({ userEntityRefs: ['user:default/foo'] }); }); @@ -164,7 +164,7 @@ describe('getUsersForEntityRef', () => { await expect( resolver.resolveNotificationRecipients({ entityRefs: ['component:default/test_component'], - excludeEntityRefs: [], + excludedEntityRefs: [], }), ).resolves.toEqual({ userEntityRefs: ['user:default/foo'] }); }); @@ -208,7 +208,7 @@ describe('getUsersForEntityRef', () => { await expect( resolver.resolveNotificationRecipients({ entityRefs: ['component:default/test_component'], - excludeEntityRefs: ['user:default/foo'], + excludedEntityRefs: ['user:default/foo'], }), ).resolves.toEqual({ userEntityRefs: [] }); }); diff --git a/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts b/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts index 2401ec7c1f..200b5dc4ea 100644 --- a/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts +++ b/plugins/notifications-backend/src/service/DefaultNotificationRecipientResolver.ts @@ -54,16 +54,16 @@ export class DefaultNotificationRecipientResolver async resolveNotificationRecipients(options: { entityRefs: string[]; - excludeEntityRefs?: string[]; + excludedEntityRefs?: string[]; }): Promise<{ userEntityRefs: string[] }> { - const { entityRefs, excludeEntityRefs = [] } = options; + const { entityRefs, excludedEntityRefs = [] } = options; const [userEntityRefs, otherEntityRefs] = partitionEntityRefs(entityRefs); const users: string[] = userEntityRefs.filter( - ref => !excludeEntityRefs.includes(ref), + ref => !excludedEntityRefs.includes(ref), ); const filtered = otherEntityRefs.filter( - ref => !excludeEntityRefs.includes(ref), + ref => !excludedEntityRefs.includes(ref), ); const fields = ['kind', 'metadata.name', 'metadata.namespace', 'relations']; @@ -87,7 +87,7 @@ export class DefaultNotificationRecipientResolver } const currentEntityRef = stringifyEntityRef(entity); - if (excludeEntityRefs.includes(currentEntityRef)) { + if (excludedEntityRefs.includes(currentEntityRef)) { return []; } @@ -130,7 +130,7 @@ export class DefaultNotificationRecipientResolver const ret = [ ...new Set([...groupUsers, ...childGroupUsers.flat(2)]), - ].filter(ref => !excludeEntityRefs.includes(ref)); + ].filter(ref => !excludedEntityRefs.includes(ref)); cachedEntityRefs.set(currentEntityRef, ret); return ret; } @@ -145,7 +145,7 @@ export class DefaultNotificationRecipientResolver } if (isUserEntityRef(ownerRef)) { - if (excludeEntityRefs.includes(ownerRef)) { + if (excludedEntityRefs.includes(ownerRef)) { return []; } return [ownerRef]; @@ -171,7 +171,7 @@ export class DefaultNotificationRecipientResolver userEntityRefs: [...new Set(users)] .filter(Boolean) // Need to filter again after resolving users - .filter(ref => !excludeEntityRefs.includes(ref)), + .filter(ref => !excludedEntityRefs.includes(ref)), }; } } diff --git a/plugins/notifications-backend/src/service/router.test.ts b/plugins/notifications-backend/src/service/router.test.ts index 08aa021014..f42a7b4513 100644 --- a/plugins/notifications-backend/src/service/router.test.ts +++ b/plugins/notifications-backend/src/service/router.test.ts @@ -274,6 +274,31 @@ describe.each(databases.eachSupportedId())('createRouter (%s)', databaseId => { expect(notifications).toHaveLength(1); }); + it('should not send to user entity if excluded', async () => { + const response = await sendNotification({ + recipients: { + type: 'entity', + entityRef: ['user:default/mock'], + excludeEntityRef: 'user:default/mock', + }, + payload: { + title: 'test notification', + metadata: { + attr: 1, + }, + }, + }); + + expect(response.status).toEqual(200); + expect(response.body).toEqual([]); + + const client = await database.getClient(); + const notifications = await client('notification') + .where('user', 'user:default/mock') + .select(); + expect(notifications).toHaveLength(0); + }); + it('should send to group entity', async () => { const response = await sendNotification({ recipients: { @@ -306,6 +331,50 @@ describe.each(databases.eachSupportedId())('createRouter (%s)', databaseId => { expect(notifications).toHaveLength(1); }); + it('should send not send to group entity if excluded', async () => { + const response = await sendNotification({ + recipients: { + type: 'entity', + entityRef: ['group:default/mock'], + excludeEntityRef: 'group:default/mock', + }, + payload: { + title: 'test notification', + }, + }); + + expect(response.status).toEqual(200); + expect(response.body).toEqual([]); + + const client = await database.getClient(); + const notifications = await client('notification') + .where('user', 'user:default/mock') + .select(); + expect(notifications).toHaveLength(0); + }); + + it('should send not send to user entity if excluded', async () => { + const response = await sendNotification({ + recipients: { + type: 'entity', + entityRef: ['group:default/mock'], + excludeEntityRef: 'user:default/mock', + }, + payload: { + title: 'test notification', + }, + }); + + expect(response.status).toEqual(200); + expect(response.body).toEqual([]); + + const client = await database.getClient(); + const notifications = await client('notification') + .where('user', 'user:default/mock') + .select(); + expect(notifications).toHaveLength(0); + }); + it('should only send one notification per user', async () => { const response = await sendNotification({ recipients: { From 3947797480cd22f361dec2c7a9a37abc6dfbe428 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Tue, 23 Sep 2025 23:55:35 +0200 Subject: [PATCH 102/177] docs: fix grid usage Signed-off-by: Vincenzo Scamporlino --- docs-ui/src/content/components/grid.props.ts | 54 ++++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/docs-ui/src/content/components/grid.props.ts b/docs-ui/src/content/components/grid.props.ts index 34d89785cc..6f037cd64f 100644 --- a/docs-ui/src/content/components/grid.props.ts +++ b/docs-ui/src/content/components/grid.props.ts @@ -43,12 +43,12 @@ export const gridItemPropDefs: Record = { values: [...columnsValues, 'full'], responsive: true, }, - start: { + colStart: { type: 'enum | string', values: [...columnsValues, 'auto'], responsive: true, }, - end: { + colEnd: { type: 'enum | string', values: [...columnsValues, 'auto'], responsive: true, @@ -60,7 +60,7 @@ export const gridItemPropDefs: Record = { export const gridUsageSnippet = `import { Grid } from '@backstage/ui'; -`; +`; export const gridDefaultSnippet = ` @@ -68,44 +68,44 @@ export const gridDefaultSnippet = ` `; -export const gridSimpleSnippet = ` +export const gridSimpleSnippet = ` Hello World Hello World Hello World -`; +`; -export const gridComplexSnippet = ` - - Hello World +export const gridComplexSnippet = ` + + Hello World - - Hello World + + Hello World -`; +`; -export const gridMixingRowsSnippet = ` - - Hello World +export const gridMixingRowsSnippet = ` + + Hello World - - Hello World + + Hello World - - Hello World + + Hello World -`; +`; -export const gridResponsiveSnippet = ` +export const gridResponsiveSnippet = ` - Hello World + - Hello World + Hello World -`; +`; -export const gridStartEndSnippet = ` - - Hello World +export const gridStartEndSnippet = ` + + Hello World -`; +`; From b45b0945dd17699c31bb523856ab85c646fe4398 Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Wed, 24 Sep 2025 06:55:14 +0300 Subject: [PATCH 103/177] fix(config): allow colon to be in the config key Signed-off-by: Hellgren Heikki --- .changeset/six-cooks-battle.md | 6 ++++++ packages/config-loader/src/sources/EnvConfigSource.ts | 2 +- packages/config/src/reader.test.ts | 5 +++++ packages/config/src/reader.ts | 4 ++-- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 .changeset/six-cooks-battle.md diff --git a/.changeset/six-cooks-battle.md b/.changeset/six-cooks-battle.md new file mode 100644 index 0000000000..ecf856225e --- /dev/null +++ b/.changeset/six-cooks-battle.md @@ -0,0 +1,6 @@ +--- +'@backstage/config-loader': patch +'@backstage/config': patch +--- + +Allow colon to be used as config key. diff --git a/packages/config-loader/src/sources/EnvConfigSource.ts b/packages/config-loader/src/sources/EnvConfigSource.ts index d724f00c6d..988110b370 100644 --- a/packages/config-loader/src/sources/EnvConfigSource.ts +++ b/packages/config-loader/src/sources/EnvConfigSource.ts @@ -85,7 +85,7 @@ export class EnvConfigSource implements ConfigSource { const ENV_PREFIX = 'APP_CONFIG_'; // Update the same pattern in config package if this is changed -const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i; +const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_:][a-z0-9]+)*$/i; /** * Read runtime configuration from the environment. diff --git a/packages/config/src/reader.test.ts b/packages/config/src/reader.test.ts index 3f6b9ac40a..bb16fbeaa1 100644 --- a/packages/config/src/reader.test.ts +++ b/packages/config/src/reader.test.ts @@ -43,6 +43,7 @@ const DATA = { null: null, string: 'string', strings: ['string1', 'string2'], + 'with:colon': 'yes', }, nestlings: [{ boolean: true }, { string: 'string' }, { number: 42 }] as {}[], }; @@ -57,6 +58,7 @@ function expectValidValues(config: ConfigReader) { expect(config.has('nested.one')).toBe(true); expect(config.has('nested.missing')).toBe(false); expect(config.has('nested.null')).toBe(false); + expect(config.has('nested.with:colon')).toBe(true); expect(config.getNumber('zero')).toBe(0); expect(config.getNumber('one')).toBe(1); expect(config.getNumber('zeroString')).toBe(0); @@ -84,8 +86,11 @@ function expectValidValues(config: ConfigReader) { null: undefined, string: 'string', strings: ['string1', 'string2'], + 'with:colon': 'yes', }); expect(config.getConfig('nested').getString('string')).toBe('string'); + expect(config.getString('nested.string')).toBe('string'); + expect(config.getString('nested.with:colon')).toBe('yes'); expect(config.getOptionalConfig('nested')!.getStringArray('strings')).toEqual( ['string1', 'string2'], ); diff --git a/packages/config/src/reader.ts b/packages/config/src/reader.ts index 2e83de9bf2..7ad0cf738d 100644 --- a/packages/config/src/reader.ts +++ b/packages/config/src/reader.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { JsonValue, JsonObject } from '@backstage/types'; +import { JsonObject, JsonValue } from '@backstage/types'; import { AppConfig, Config } from './types'; // Update the same pattern in config-loader package if this is changed -const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i; +const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_:][a-z0-9]+)*$/i; function isObject(value: JsonValue | undefined): value is JsonObject { return typeof value === 'object' && value !== null && !Array.isArray(value); From 93e1aa0133e9229b0257c38b0a5b3e5ce23b531a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Edeg=C3=A5rd?= Date: Wed, 24 Sep 2025 07:23:01 +0000 Subject: [PATCH 104/177] Simplify username usage. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Henrik Edegård --- .../src/lib/SlackNotificationProcessor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts index f050b3b677..96d4b2ff3e 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.ts @@ -212,7 +212,7 @@ export class SlackNotificationProcessor implements NotificationProcessor { const payload = toChatPostMessageArgs({ channel, payload: options.payload, - ...(this.username && { username: this.username }), + username: this.username, }); this.logger.debug( @@ -271,7 +271,7 @@ export class SlackNotificationProcessor implements NotificationProcessor { toChatPostMessageArgs({ channel, payload: formattedPayload, - ...(this.username && { username: this.username }), + username: this.username, }), ); From 075e0648b8af051133ccd09742e136af69dbc904 Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Wed, 24 Sep 2025 10:23:35 +0300 Subject: [PATCH 105/177] feat(scaffolder): add missing form fields for the nfs Signed-off-by: Hellgren Heikki --- .changeset/wide-flies-jog.md | 5 + plugins/scaffolder/report-alpha.api.md | 126 +++++++++++++++++- plugins/scaffolder/report.api.md | 75 ++++++++++- plugins/scaffolder/src/alpha/extensions.tsx | 67 +++++++++- .../src/alpha/fields/EntityNamePicker.ts | 28 ++++ .../src/alpha/fields/EntityPicker.ts | 24 ++++ .../src/alpha/fields/EntityTagsPicker.ts | 24 ++++ .../src/alpha/fields/MultiEntityPicker.ts | 24 ++++ .../src/alpha/fields/MyGroupsPicker.ts | 24 ++++ .../src/alpha/fields/OwnedEntityPicker.ts | 24 ++++ .../src/alpha/fields/OwnerPicker.ts | 24 ++++ .../src/alpha/fields/RepoBranchPicker.ts | 24 ++++ plugins/scaffolder/src/alpha/plugin.tsx | 20 ++- .../fields/EntityNamePicker/index.ts | 1 + .../fields/EntityNamePicker/schema.ts | 5 +- .../fields/EntityNamePicker/validation.ts | 3 + .../fields/MultiEntityPicker/schema.ts | 7 + .../scaffolder/src/components/fields/index.ts | 3 + 18 files changed, 496 insertions(+), 12 deletions(-) create mode 100644 .changeset/wide-flies-jog.md create mode 100644 plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/EntityPicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/OwnerPicker.ts create mode 100644 plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts diff --git a/.changeset/wide-flies-jog.md b/.changeset/wide-flies-jog.md new file mode 100644 index 0000000000..4fbafe66a1 --- /dev/null +++ b/.changeset/wide-flies-jog.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Added missing form fields for the new frontend system. diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 534d136e6f..505688247f 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -226,6 +226,126 @@ const _default: OverridableFrontendPlugin< routeRef?: RouteRef; }; }>; + 'scaffolder-form-field:scaffolder/entity-name-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'entity-name-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/entity-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'entity-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/entity-tags-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'entity-tags-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/multi-entity-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'multi-entity-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/my-groups-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'my-groups-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/owned-entity-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'owned-entity-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/owner-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'owner-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; + 'scaffolder-form-field:scaffolder/repo-branch-picker': ExtensionDefinition<{ + kind: 'scaffolder-form-field'; + name: 'repo-branch-picker'; + config: {}; + configInput: {}; + output: ExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >; + inputs: {}; + params: { + field: () => Promise; + }; + }>; 'scaffolder-form-field:scaffolder/repo-url-picker': ExtensionDefinition<{ kind: 'scaffolder-form-field'; name: 'repo-url-picker'; @@ -402,10 +522,10 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'ongoingTask.title': 'Run of'; readonly 'ongoingTask.contextMenu.cancel': 'Cancel'; readonly 'ongoingTask.contextMenu.startOver': 'Start Over'; - readonly 'ongoingTask.contextMenu.retry': 'Retry'; readonly 'ongoingTask.contextMenu.hideLogs': 'Hide Logs'; readonly 'ongoingTask.contextMenu.showLogs': 'Show Logs'; readonly 'ongoingTask.contextMenu.hideButtonBar': 'Hide Button Bar'; + readonly 'ongoingTask.contextMenu.retry': 'Retry'; readonly 'ongoingTask.contextMenu.showButtonBar': 'Show Button Bar'; readonly 'ongoingTask.subtitle': 'Task {{taskId}}'; readonly 'ongoingTask.pageTitle.hasTemplateName': 'Run of {{templateName}}'; @@ -488,8 +608,8 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'templateListPage.pageTitle': 'Create a new component'; readonly 'templateListPage.templateGroups.defaultTitle': 'Templates'; readonly 'templateListPage.templateGroups.otherTitle': 'Other Templates'; - readonly 'templateListPage.contentHeader.supportButtonTitle': 'Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).'; readonly 'templateListPage.contentHeader.registerExistingButtonTitle': 'Register Existing Component'; + readonly 'templateListPage.contentHeader.supportButtonTitle': 'Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).'; readonly 'templateListPage.additionalLinksForEntity.viewTechDocsTitle': 'View TechDocs'; readonly 'templateWizardPage.title': 'Create a new component'; readonly 'templateWizardPage.subtitle': 'Create new software components using standard templates in your organization'; @@ -502,8 +622,8 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'templateEditorToolbar.addToCatalogDialogTitle': 'Publish changes'; readonly 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction': 'Follow the instructions below to create or update a template:'; readonly 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems': 'Save the template files in a local directory\nCreate a pull request to a new or existing git repository\nIf the template already exists, the changes will be reflected in the software catalog once the pull request gets merged\nBut if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog'; - readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl': 'https://backstage.io/docs/features/software-templates/adding-templates/'; readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationButton': 'Go to the documentation'; + readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl': 'https://backstage.io/docs/features/software-templates/adding-templates/'; readonly 'templateEditorToolbarFileMenu.button': 'File'; readonly 'templateEditorToolbarFileMenu.options.openDirectory': 'Open template directory'; readonly 'templateEditorToolbarFileMenu.options.createDirectory': 'Create template directory'; diff --git a/plugins/scaffolder/report.api.md b/plugins/scaffolder/report.api.md index a4a339f01e..b1a6b62e9d 100644 --- a/plugins/scaffolder/report.api.md +++ b/plugins/scaffolder/report.api.md @@ -70,6 +70,15 @@ export const EntityNamePickerFieldExtension: FieldExtensionComponent_2< any >; +// @public (undocumented) +export const EntityNamePickerFieldSchema: FieldSchema_2; + +// @public (undocumented) +export const entityNamePickerValidation: ( + value: string, + validation: FieldValidation, +) => void; + // @public export const EntityPickerFieldExtension: FieldExtensionComponent_2< string, @@ -228,6 +237,39 @@ export const MultiEntityPickerFieldExtension: FieldExtensionComponent_2< } >; +// @public (undocumented) +export const MultiEntityPickerFieldSchema: FieldSchema_2< + string[], + { + defaultKind?: string | undefined; + defaultNamespace?: string | false | undefined; + catalogFilter?: + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + > + | Record< + string, + | string + | string[] + | { + exists?: boolean | undefined; + } + >[] + | undefined; + allowArbitraryValues?: boolean | undefined; + } +>; + +// @public +export type MultiEntityPickerUiOptions = NonNullable< + (typeof MultiEntityPickerFieldSchema.TProps.uiSchema)['ui:options'] +>; + // @public export const MyGroupsPickerFieldExtension: FieldExtensionComponent_2< string, @@ -380,9 +422,9 @@ export const RepoBranchPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; gerrit?: string[] | undefined; + gitlab?: string[] | undefined; gitea?: string[] | undefined; } | undefined; @@ -391,6 +433,33 @@ export const RepoBranchPickerFieldExtension: FieldExtensionComponent_2< } >; +// @public (undocumented) +export const RepoBranchPickerFieldSchema: FieldSchema_2< + string, + { + requestUserCredentials?: + | { + secretsKey: string; + additionalScopes?: + | { + azure?: string[] | undefined; + github?: string[] | undefined; + bitbucket?: string[] | undefined; + gerrit?: string[] | undefined; + gitlab?: string[] | undefined; + gitea?: string[] | undefined; + } + | undefined; + } + | undefined; + } +>; + +// @public +export type RepoBranchPickerUiOptions = NonNullable< + (typeof RepoBranchPickerFieldSchema.TProps.uiSchema)['ui:options'] +>; + // @public export const repoPickerValidation: ( value: string, @@ -416,9 +485,9 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; gerrit?: string[] | undefined; + gitlab?: string[] | undefined; gitea?: string[] | undefined; } | undefined; @@ -443,9 +512,9 @@ export const RepoUrlPickerFieldSchema: FieldSchema_2< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; gerrit?: string[] | undefined; + gitlab?: string[] | undefined; gitea?: string[] | undefined; } | undefined; diff --git a/plugins/scaffolder/src/alpha/extensions.tsx b/plugins/scaffolder/src/alpha/extensions.tsx index 803644d95a..cb69e691b8 100644 --- a/plugins/scaffolder/src/alpha/extensions.tsx +++ b/plugins/scaffolder/src/alpha/extensions.tsx @@ -19,13 +19,13 @@ import { convertLegacyRouteRef, } from '@backstage/core-compat-api'; import { - NavItemBlueprint, - PageBlueprint, ApiBlueprint, + createExtensionInput, discoveryApiRef, fetchApiRef, identityApiRef, - createExtensionInput, + NavItemBlueprint, + PageBlueprint, } from '@backstage/frontend-plugin-api'; import { rootRouteRef } from '../routes'; import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; @@ -72,6 +72,67 @@ export const repoUrlPickerFormField = FormFieldBlueprint.make({ }, }); +export const entityNamePickerFormField = FormFieldBlueprint.make({ + name: 'entity-name-picker', + params: { + field: () => + import('./fields/EntityNamePicker').then(m => m.EntityNamePicker), + }, +}); + +export const entityPickerFormField = FormFieldBlueprint.make({ + name: 'entity-picker', + params: { + field: () => import('./fields/EntityPicker').then(m => m.EntityPicker), + }, +}); + +export const ownerPickerFormField = FormFieldBlueprint.make({ + name: 'owner-picker', + params: { + field: () => import('./fields/OwnerPicker').then(m => m.OwnerPicker), + }, +}); + +export const entityTagsPickerFormField = FormFieldBlueprint.make({ + name: 'entity-tags-picker', + params: { + field: () => + import('./fields/EntityTagsPicker').then(m => m.EntityTagsPicker), + }, +}); + +export const multiEntityPickerFormField = FormFieldBlueprint.make({ + name: 'multi-entity-picker', + params: { + field: () => + import('./fields/MultiEntityPicker').then(m => m.MultiEntityPicker), + }, +}); + +export const myGroupsPickerFormField = FormFieldBlueprint.make({ + name: 'my-groups-picker', + params: { + field: () => import('./fields/MyGroupsPicker').then(m => m.MyGroupsPicker), + }, +}); + +export const ownedEntityPickerFormField = FormFieldBlueprint.make({ + name: 'owned-entity-picker', + params: { + field: () => + import('./fields/OwnedEntityPicker').then(m => m.OwnedEntityPicker), + }, +}); + +export const repoBranchPickerFormField = FormFieldBlueprint.make({ + name: 'repo-branch-picker', + params: { + field: () => + import('./fields/RepoBranchPicker').then(m => m.RepoBranchPicker), + }, +}); + export const scaffolderApi = ApiBlueprint.make({ params: defineParams => defineParams({ diff --git a/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts b/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts new file mode 100644 index 0000000000..715cb068a0 --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { EntityNamePicker as Component } from '../../components/fields/EntityNamePicker/EntityNamePicker'; +import { + EntityNamePickerFieldSchema, + entityNamePickerValidation, +} from '../../components'; + +export const EntityNamePicker = createFormField({ + component: Component, + name: 'EntityNamePicker', + validation: entityNamePickerValidation, + schema: EntityNamePickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/EntityPicker.ts b/plugins/scaffolder/src/alpha/fields/EntityPicker.ts new file mode 100644 index 0000000000..059e87fc19 --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/EntityPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { EntityPicker as Component } from '../../components/fields/EntityPicker/EntityPicker'; +import { EntityPickerFieldSchema } from '../../components'; + +export const EntityPicker = createFormField({ + component: Component, + name: 'EntityPicker', + schema: EntityPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts b/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts new file mode 100644 index 0000000000..c4d5f88abb --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { EntityTagsPicker as Component } from '../../components/fields/EntityTagsPicker/EntityTagsPicker'; +import { EntityTagsPickerFieldSchema } from '../../components'; + +export const EntityTagsPicker = createFormField({ + component: Component, + name: 'EntityTagsPicker', + schema: EntityTagsPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts b/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts new file mode 100644 index 0000000000..32bc54f86e --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { MultiEntityPicker as Component } from '../../components/fields/MultiEntityPicker/MultiEntityPicker'; +import { MultiEntityPickerFieldSchema } from '../../components'; + +export const MultiEntityPicker = createFormField({ + component: Component, + name: 'MultiEntityPicker', + schema: MultiEntityPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts b/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts new file mode 100644 index 0000000000..cc5f717c28 --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { MyGroupsPicker as Component } from '../../components/fields/MyGroupsPicker/MyGroupsPicker'; +import { MyGroupsPickerFieldSchema } from '../../components'; + +export const MyGroupsPicker = createFormField({ + component: Component, + name: 'MyGroupsPicker', + schema: MyGroupsPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts b/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts new file mode 100644 index 0000000000..6f40b23803 --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { OwnedEntityPicker as Component } from '../../components/fields/OwnedEntityPicker/OwnedEntityPicker'; +import { OwnedEntityPickerFieldSchema } from '../../components'; + +export const OwnedEntityPicker = createFormField({ + component: Component, + name: 'OwnedEntityPicker', + schema: OwnedEntityPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts b/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts new file mode 100644 index 0000000000..ea58f1f00f --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { OwnerPicker as Component } from '../../components/fields/OwnerPicker/OwnerPicker'; +import { OwnerPickerFieldSchema } from '../../components'; + +export const OwnerPicker = createFormField({ + component: Component, + name: 'OwnerPicker', + schema: OwnerPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts b/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts new file mode 100644 index 0000000000..9694b6a8c4 --- /dev/null +++ b/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { RepoBranchPicker as Component } from '../../components/fields/RepoBranchPicker/RepoBranchPicker'; +import { RepoBranchPickerFieldSchema } from '../../components'; + +export const RepoBranchPicker = createFormField({ + component: Component, + name: 'RepoBranchPicker', + schema: RepoBranchPickerFieldSchema, +}); diff --git a/plugins/scaffolder/src/alpha/plugin.tsx b/plugins/scaffolder/src/alpha/plugin.tsx index a414c61da5..3b41aa3893 100644 --- a/plugins/scaffolder/src/alpha/plugin.tsx +++ b/plugins/scaffolder/src/alpha/plugin.tsx @@ -17,10 +17,10 @@ import { convertLegacyRouteRefs } from '@backstage/core-compat-api'; import { createFrontendPlugin } from '@backstage/frontend-plugin-api'; import { - rootRouteRef, actionsRouteRef, editRouteRef, registerComponentRouteRef, + rootRouteRef, scaffolderListTaskRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, @@ -28,10 +28,18 @@ import { viewTechDocRouteRef, } from '../routes'; import { + entityNamePickerFormField, + entityPickerFormField, + entityTagsPickerFormField, + multiEntityPickerFormField, + myGroupsPickerFormField, + ownedEntityPickerFormField, + ownerPickerFormField, + repoBranchPickerFormField, repoUrlPickerFormField, + scaffolderApi, scaffolderNavItem, scaffolderPage, - scaffolderApi, } from './extensions'; import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; @@ -73,5 +81,13 @@ export default createFrontendPlugin({ formDecoratorsApi, formFieldsApi, repoUrlPickerFormField, + entityNamePickerFormField, + entityPickerFormField, + ownerPickerFormField, + entityTagsPickerFormField, + multiEntityPickerFormField, + myGroupsPickerFormField, + ownedEntityPickerFormField, + repoBranchPickerFormField, ], }); diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts b/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts index 7076221480..82d9cb0b17 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts @@ -14,3 +14,4 @@ * limitations under the License. */ export { entityNamePickerValidation } from './validation'; +export { EntityNamePickerFieldSchema } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts index fe4765b8b8..0230f26879 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts @@ -15,7 +15,10 @@ */ import { makeFieldSchema } from '@backstage/plugin-scaffolder-react'; -const EntityNamePickerFieldSchema = makeFieldSchema({ +/** + * @public + */ +export const EntityNamePickerFieldSchema = makeFieldSchema({ output: z => z.string(), }); diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts b/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts index 9302e9abc1..e475606c11 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts @@ -17,6 +17,9 @@ import { FieldValidation } from '@rjsf/utils'; import { KubernetesValidatorFunctions } from '@backstage/catalog-model'; +/** + * @public + */ export const entityNamePickerValidation = ( value: string, validation: FieldValidation, diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts index 667b4638b8..aa396229ee 100644 --- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts @@ -16,6 +16,9 @@ import { z as zod } from 'zod'; import { makeFieldSchema } from '@backstage/plugin-scaffolder-react'; +/** + * @public + */ export const entityQueryFilterExpressionSchema = zod.record( zod .string() @@ -23,6 +26,9 @@ export const entityQueryFilterExpressionSchema = zod.record( .or(zod.array(zod.string())), ); +/** + * @public + */ export const MultiEntityPickerFieldSchema = makeFieldSchema({ output: z => z.array(z.string()), uiOptions: z => @@ -54,6 +60,7 @@ export const MultiEntityPickerFieldSchema = makeFieldSchema({ /** * The input props that can be specified under `ui:options` for the * `EntityPicker` field extension. + * @public */ export type MultiEntityPickerUiOptions = NonNullable< (typeof MultiEntityPickerFieldSchema.TProps.uiSchema)['ui:options'] diff --git a/plugins/scaffolder/src/components/fields/index.ts b/plugins/scaffolder/src/components/fields/index.ts index 7f119f27be..dc1de86adb 100644 --- a/plugins/scaffolder/src/components/fields/index.ts +++ b/plugins/scaffolder/src/components/fields/index.ts @@ -14,10 +14,13 @@ * limitations under the License. */ export * from './EntityPicker'; +export * from './EntityNamePicker'; export * from './OwnerPicker'; export * from './RepoUrlPicker'; export * from './OwnedEntityPicker'; export * from './EntityTagsPicker'; +export * from './RepoBranchPicker'; +export * from './MultiEntityPicker'; export * from './MyGroupsPicker'; export { type FieldSchema, makeFieldSchemaFromZod } from './utils'; From 48d409f4abe5df6d08f1731b8dc1366cbd424580 Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Wed, 24 Sep 2025 10:25:14 +0300 Subject: [PATCH 106/177] fix: correct year for copyright headers Signed-off-by: Hellgren Heikki --- plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/EntityPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/OwnerPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts | 2 +- plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts | 4 ++-- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts b/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts index 715cb068a0..770e055948 100644 --- a/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts +++ b/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/EntityPicker.ts b/plugins/scaffolder/src/alpha/fields/EntityPicker.ts index 059e87fc19..d4ae6a5ecb 100644 --- a/plugins/scaffolder/src/alpha/fields/EntityPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/EntityPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts b/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts index c4d5f88abb..35b45a91a6 100644 --- a/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts b/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts index 32bc54f86e..0b89e7351b 100644 --- a/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts b/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts index cc5f717c28..a8f0e74b8c 100644 --- a/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts b/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts index 6f40b23803..becd48b5ce 100644 --- a/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts b/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts index ea58f1f00f..53ec16eb8b 100644 --- a/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts b/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts index 9694b6a8c4..176b4fdaa6 100644 --- a/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts b/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts index add8408b2d..829c20d7c0 100644 --- a/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2025 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,8 @@ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; import { RepoUrlPicker as Component } from '../../components/fields/RepoUrlPicker/RepoUrlPicker'; import { - RepoUrlPickerFieldSchema, repoPickerValidation, + RepoUrlPickerFieldSchema, } from '../../components'; export const RepoUrlPicker = createFormField({ From c8cad6ac273cd1ea416330cfc137a2c2c87d7f8f Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Wed, 24 Sep 2025 09:46:02 +0200 Subject: [PATCH 107/177] prevent handlers overrides Signed-off-by: Juan Pablo Garcia Ripa --- .../external/ExternalAuthTokenHandler.test.ts | 70 +++++++++++++++++++ .../auth/external/ExternalAuthTokenHandler.ts | 33 ++++++--- .../src/entrypoints/auth/external/jwks.ts | 1 - 3 files changed, 94 insertions(+), 10 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts index f315b43314..e3f1acf270 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.test.ts @@ -354,6 +354,76 @@ describe('ExternalTokenHandler', () => { expect(verifyMock).toHaveBeenCalledWith(customToken, { context: 'a' }); }); + it('should fail if custom handler has same type as builtin handlers', async () => { + const logger = mockServices.logger.mock(); + const customStaticHandler: ExternalTokenHandler = + createExternalTokenHandler({ + type: 'static', + initialize: jest.fn().mockResolvedValue(undefined), + verifyToken: jest.fn().mockResolvedValue({ + subject: 'custom-static-subject', + }), + }); + + const createHandler = () => + ExternalAuthTokenHandler.create({ + ownPluginId: 'catalog', + logger, + config: mockServices.rootConfig({ + data: { + backend: { + auth: { + externalAccess: [ + { + type: 'static', + options: { + token: 'mytoken', + subject: 'static-subject', + }, + accessRestrictions: [ + { plugin: 'catalog', permission: 'catalog.entity.read' }, + ], + }, + ], + }, + }, + }, + }), + externalTokenHandlers: [customStaticHandler], + }); + + expect(createHandler).toThrowErrorMatchingInlineSnapshot( + `"Duplicate external token handler type 'static', each handler must have a unique type"`, + ); + }); + it('should fail if 2 custom handlers have the same type', async () => { + const createHandler = () => + ExternalAuthTokenHandler.create({ + ownPluginId: 'catalog', + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), + externalTokenHandlers: [ + createExternalTokenHandler({ + type: 'internal-custom', + initialize: jest.fn().mockResolvedValue(undefined), + verifyToken: jest.fn().mockResolvedValue({ + subject: 'sub', + }), + }), + createExternalTokenHandler({ + type: 'internal-custom', + initialize: jest.fn().mockResolvedValue(undefined), + verifyToken: jest.fn().mockResolvedValue({ + subject: 'sub', + }), + }), + ], + }); + + expect(createHandler).toThrowErrorMatchingInlineSnapshot( + `"Duplicate external token handler type 'internal-custom', each handler must have a unique type"`, + ); + }); it('should fail if config contains types not declared', async () => { const createHandler = () => ExternalAuthTokenHandler.create({ diff --git a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts index 4b2cbb3e5a..21b3aed99d 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/ExternalAuthTokenHandler.ts @@ -42,11 +42,11 @@ export const externalTokenHandlersServiceRef = createServiceRef< multiton: true, }); -const defaultHandlers: ExternalTokenHandler[] = [ - staticTokenHandler, - legacyTokenHandler, - jwksTokenHandler, -]; +const defaultHandlers: Record> = { + static: staticTokenHandler, + legacy: legacyTokenHandler, + jwks: jwksTokenHandler, +}; type ContextMapEntry = { context: T; @@ -70,20 +70,35 @@ export class ExternalAuthTokenHandler { const { ownPluginId, config, - externalTokenHandlers: customHandlers, + externalTokenHandlers: customHandlers = [], logger, } = options; - const handlersTypes = [...defaultHandlers, ...(customHandlers ?? [])]; + const handlersTypes = customHandlers.reduce< + Record> + >( + (acc, handler) => { + if (acc[handler.type]) { + throw new Error( + `Duplicate external token handler type '${handler.type}', each handler must have a unique type`, + ); + } + acc[handler.type] = handler; + return acc; + }, + { ...defaultHandlers }, + ); const handlerConfigs = config.getOptionalConfigArray(NEW_CONFIG_KEY) ?? []; const contexts: ContextMapEntry[] = handlerConfigs.map( handlerConfig => { const type = handlerConfig.getString('type'); - const handler = handlersTypes.find(h => h.type === type); + const handler = handlersTypes[type]; if (!handler) { - const valid = handlersTypes.map(h => `'${h.type}'`).join(', '); + const valid = Object.keys(handlersTypes) + .map(h => `'${h}'`) + .join(', '); throw new Error( `Unknown type '${type}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`, ); diff --git a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts index 892fcf2181..33b55df775 100644 --- a/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts +++ b/packages/backend-defaults/src/entrypoints/auth/external/jwks.ts @@ -75,7 +75,6 @@ export const jwksTokenHandler = createExternalTokenHandler({ : 'external:'; return { subject: `${prefix}${sub}`, - allAccessRestrictions: context.allAccessRestrictions, }; } } catch { From 49be37008ce3b553d5b96f72fdc71b22e664f464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Edeg=C3=A5rd?= Date: Wed, 24 Sep 2025 07:55:22 +0000 Subject: [PATCH 108/177] Simplified more. The Slack library will remove undefined values when sending the actual request. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Henrik Edegård --- .../src/lib/SlackNotificationProcessor.test.ts | 2 +- plugins/notifications-backend-module-slack/src/lib/util.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts index c970aec7ba..ad4bf01e9f 100644 --- a/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts +++ b/plugins/notifications-backend-module-slack/src/lib/SlackNotificationProcessor.test.ts @@ -829,7 +829,7 @@ describe('SlackNotificationProcessor', () => { const calls = (slack.chat.postMessage as jest.Mock).mock.calls; expect(calls).toHaveLength(1); - expect(calls[0][0]).not.toHaveProperty('username'); + expect(calls[0][0].username).toBeUndefined(); }); }); diff --git a/plugins/notifications-backend-module-slack/src/lib/util.ts b/plugins/notifications-backend-module-slack/src/lib/util.ts index 1116218b09..33293ea24f 100644 --- a/plugins/notifications-backend-module-slack/src/lib/util.ts +++ b/plugins/notifications-backend-module-slack/src/lib/util.ts @@ -30,7 +30,7 @@ export function toChatPostMessageArgs(options: { const args: ChatPostMessageArguments = { channel, text: payload.title, - ...(username && { username }), + username, attachments: [ { color: getColor(payload.severity), From 4ee97cf3ab270d583b0f8bf2f7aeb8b75e50dbe9 Mon Sep 17 00:00:00 2001 From: Hellgren Heikki Date: Wed, 24 Sep 2025 10:43:15 +0300 Subject: [PATCH 109/177] chore(scaffolder): clean up api report from schemas and validators Signed-off-by: Hellgren Heikki --- plugins/scaffolder/report-alpha.api.md | 6 +- plugins/scaffolder/report.api.md | 79 ++----------------- .../src/alpha/fields/EntityNamePicker.ts | 4 +- .../src/alpha/fields/EntityPicker.ts | 6 +- .../src/alpha/fields/EntityTagsPicker.ts | 6 +- .../src/alpha/fields/MultiEntityPicker.ts | 6 +- .../src/alpha/fields/MyGroupsPicker.ts | 6 +- .../src/alpha/fields/OwnedEntityPicker.ts | 6 +- .../src/alpha/fields/OwnerPicker.ts | 6 +- .../src/alpha/fields/RepoBranchPicker.ts | 6 +- .../src/alpha/fields/RepoUrlPicker.ts | 4 +- .../fields/EntityNamePicker/index.ts | 1 + .../fields/EntityNamePicker/schema.ts | 3 - .../fields/EntityNamePicker/validation.ts | 3 - .../components/fields/EntityPicker/index.ts | 1 + .../fields/EntityTagsPicker/index.ts | 1 + .../fields/EntityTagsPicker/schema.ts | 1 - .../fields/MultiEntityPicker/index.ts | 1 + .../fields/MultiEntityPicker/schema.ts | 7 -- .../components/fields/MyGroupsPicker/index.ts | 1 + .../fields/MyGroupsPicker/schema.ts | 1 - .../fields/OwnedEntityPicker/index.ts | 1 + .../fields/OwnedEntityPicker/schema.ts | 3 +- .../components/fields/OwnerPicker/index.ts | 1 + .../components/fields/OwnerPicker/schema.ts | 1 - .../fields/RepoBranchPicker/index.ts | 2 +- .../fields/RepoBranchPicker/schema.ts | 5 -- .../components/fields/RepoUrlPicker/index.ts | 1 + .../fields/RepoUrlPicker/validation.ts | 1 - .../scaffolder/src/components/fields/index.ts | 10 --- plugins/scaffolder/src/components/index.ts | 28 ++++++- 31 files changed, 77 insertions(+), 131 deletions(-) diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 505688247f..a5dd2a22d1 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -522,10 +522,10 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'ongoingTask.title': 'Run of'; readonly 'ongoingTask.contextMenu.cancel': 'Cancel'; readonly 'ongoingTask.contextMenu.startOver': 'Start Over'; + readonly 'ongoingTask.contextMenu.retry': 'Retry'; readonly 'ongoingTask.contextMenu.hideLogs': 'Hide Logs'; readonly 'ongoingTask.contextMenu.showLogs': 'Show Logs'; readonly 'ongoingTask.contextMenu.hideButtonBar': 'Hide Button Bar'; - readonly 'ongoingTask.contextMenu.retry': 'Retry'; readonly 'ongoingTask.contextMenu.showButtonBar': 'Show Button Bar'; readonly 'ongoingTask.subtitle': 'Task {{taskId}}'; readonly 'ongoingTask.pageTitle.hasTemplateName': 'Run of {{templateName}}'; @@ -608,8 +608,8 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'templateListPage.pageTitle': 'Create a new component'; readonly 'templateListPage.templateGroups.defaultTitle': 'Templates'; readonly 'templateListPage.templateGroups.otherTitle': 'Other Templates'; - readonly 'templateListPage.contentHeader.registerExistingButtonTitle': 'Register Existing Component'; readonly 'templateListPage.contentHeader.supportButtonTitle': 'Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).'; + readonly 'templateListPage.contentHeader.registerExistingButtonTitle': 'Register Existing Component'; readonly 'templateListPage.additionalLinksForEntity.viewTechDocsTitle': 'View TechDocs'; readonly 'templateWizardPage.title': 'Create a new component'; readonly 'templateWizardPage.subtitle': 'Create new software components using standard templates in your organization'; @@ -622,8 +622,8 @@ export const scaffolderTranslationRef: TranslationRef< readonly 'templateEditorToolbar.addToCatalogDialogTitle': 'Publish changes'; readonly 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction': 'Follow the instructions below to create or update a template:'; readonly 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems': 'Save the template files in a local directory\nCreate a pull request to a new or existing git repository\nIf the template already exists, the changes will be reflected in the software catalog once the pull request gets merged\nBut if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog'; - readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationButton': 'Go to the documentation'; readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl': 'https://backstage.io/docs/features/software-templates/adding-templates/'; + readonly 'templateEditorToolbar.addToCatalogDialogActions.documentationButton': 'Go to the documentation'; readonly 'templateEditorToolbarFileMenu.button': 'File'; readonly 'templateEditorToolbarFileMenu.options.openDirectory': 'Open template directory'; readonly 'templateEditorToolbarFileMenu.options.createDirectory': 'Create template directory'; diff --git a/plugins/scaffolder/report.api.md b/plugins/scaffolder/report.api.md index b1a6b62e9d..27fa47a184 100644 --- a/plugins/scaffolder/report.api.md +++ b/plugins/scaffolder/report.api.md @@ -70,15 +70,6 @@ export const EntityNamePickerFieldExtension: FieldExtensionComponent_2< any >; -// @public (undocumented) -export const EntityNamePickerFieldSchema: FieldSchema_2; - -// @public (undocumented) -export const entityNamePickerValidation: ( - value: string, - validation: FieldValidation, -) => void; - // @public export const EntityPickerFieldExtension: FieldExtensionComponent_2< string, @@ -237,39 +228,6 @@ export const MultiEntityPickerFieldExtension: FieldExtensionComponent_2< } >; -// @public (undocumented) -export const MultiEntityPickerFieldSchema: FieldSchema_2< - string[], - { - defaultKind?: string | undefined; - defaultNamespace?: string | false | undefined; - catalogFilter?: - | Record< - string, - | string - | string[] - | { - exists?: boolean | undefined; - } - > - | Record< - string, - | string - | string[] - | { - exists?: boolean | undefined; - } - >[] - | undefined; - allowArbitraryValues?: boolean | undefined; - } ->; - -// @public -export type MultiEntityPickerUiOptions = NonNullable< - (typeof MultiEntityPickerFieldSchema.TProps.uiSchema)['ui:options'] ->; - // @public export const MyGroupsPickerFieldExtension: FieldExtensionComponent_2< string, @@ -422,9 +380,9 @@ export const RepoBranchPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; + gitlab?: string[] | undefined; bitbucket?: string[] | undefined; gerrit?: string[] | undefined; - gitlab?: string[] | undefined; gitea?: string[] | undefined; } | undefined; @@ -433,33 +391,6 @@ export const RepoBranchPickerFieldExtension: FieldExtensionComponent_2< } >; -// @public (undocumented) -export const RepoBranchPickerFieldSchema: FieldSchema_2< - string, - { - requestUserCredentials?: - | { - secretsKey: string; - additionalScopes?: - | { - azure?: string[] | undefined; - github?: string[] | undefined; - bitbucket?: string[] | undefined; - gerrit?: string[] | undefined; - gitlab?: string[] | undefined; - gitea?: string[] | undefined; - } - | undefined; - } - | undefined; - } ->; - -// @public -export type RepoBranchPickerUiOptions = NonNullable< - (typeof RepoBranchPickerFieldSchema.TProps.uiSchema)['ui:options'] ->; - // @public export const repoPickerValidation: ( value: string, @@ -473,11 +404,11 @@ export const repoPickerValidation: ( export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< string, { - allowedHosts?: string[] | undefined; allowedOrganizations?: string[] | undefined; allowedOwners?: string[] | undefined; allowedProjects?: string[] | undefined; allowedRepos?: string[] | undefined; + allowedHosts?: string[] | undefined; requestUserCredentials?: | { secretsKey: string; @@ -485,9 +416,9 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; + gitlab?: string[] | undefined; bitbucket?: string[] | undefined; gerrit?: string[] | undefined; - gitlab?: string[] | undefined; gitea?: string[] | undefined; } | undefined; @@ -500,11 +431,11 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< export const RepoUrlPickerFieldSchema: FieldSchema_2< string, { - allowedHosts?: string[] | undefined; allowedOrganizations?: string[] | undefined; allowedOwners?: string[] | undefined; allowedProjects?: string[] | undefined; allowedRepos?: string[] | undefined; + allowedHosts?: string[] | undefined; requestUserCredentials?: | { secretsKey: string; @@ -512,9 +443,9 @@ export const RepoUrlPickerFieldSchema: FieldSchema_2< | { azure?: string[] | undefined; github?: string[] | undefined; + gitlab?: string[] | undefined; bitbucket?: string[] | undefined; gerrit?: string[] | undefined; - gitlab?: string[] | undefined; gitea?: string[] | undefined; } | undefined; diff --git a/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts b/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts index 770e055948..dcb68edd15 100644 --- a/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts +++ b/plugins/scaffolder/src/alpha/fields/EntityNamePicker.ts @@ -14,11 +14,11 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { EntityNamePicker as Component } from '../../components/fields/EntityNamePicker/EntityNamePicker'; import { + EntityNamePicker as Component, EntityNamePickerFieldSchema, entityNamePickerValidation, -} from '../../components'; +} from '../../components/fields/EntityNamePicker'; export const EntityNamePicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/EntityPicker.ts b/plugins/scaffolder/src/alpha/fields/EntityPicker.ts index d4ae6a5ecb..c80b38fe43 100644 --- a/plugins/scaffolder/src/alpha/fields/EntityPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/EntityPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { EntityPicker as Component } from '../../components/fields/EntityPicker/EntityPicker'; -import { EntityPickerFieldSchema } from '../../components'; +import { + EntityPicker as Component, + EntityPickerFieldSchema, +} from '../../components/fields/EntityPicker'; export const EntityPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts b/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts index 35b45a91a6..9a8e86730e 100644 --- a/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/EntityTagsPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { EntityTagsPicker as Component } from '../../components/fields/EntityTagsPicker/EntityTagsPicker'; -import { EntityTagsPickerFieldSchema } from '../../components'; +import { + EntityTagsPicker as Component, + EntityTagsPickerFieldSchema, +} from '../../components/fields/EntityTagsPicker'; export const EntityTagsPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts b/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts index 0b89e7351b..8e8c65d67c 100644 --- a/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/MultiEntityPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { MultiEntityPicker as Component } from '../../components/fields/MultiEntityPicker/MultiEntityPicker'; -import { MultiEntityPickerFieldSchema } from '../../components'; +import { + MultiEntityPicker as Component, + MultiEntityPickerFieldSchema, +} from '../../components/fields/MultiEntityPicker'; export const MultiEntityPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts b/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts index a8f0e74b8c..a2cd5823b4 100644 --- a/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/MyGroupsPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { MyGroupsPicker as Component } from '../../components/fields/MyGroupsPicker/MyGroupsPicker'; -import { MyGroupsPickerFieldSchema } from '../../components'; +import { + MyGroupsPicker as Component, + MyGroupsPickerFieldSchema, +} from '../../components/fields/MyGroupsPicker'; export const MyGroupsPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts b/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts index becd48b5ce..7b13797ce1 100644 --- a/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/OwnedEntityPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { OwnedEntityPicker as Component } from '../../components/fields/OwnedEntityPicker/OwnedEntityPicker'; -import { OwnedEntityPickerFieldSchema } from '../../components'; +import { + OwnedEntityPicker as Component, + OwnedEntityPickerFieldSchema, +} from '../../components/fields/OwnedEntityPicker'; export const OwnedEntityPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts b/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts index 53ec16eb8b..00761207a0 100644 --- a/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/OwnerPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { OwnerPicker as Component } from '../../components/fields/OwnerPicker/OwnerPicker'; -import { OwnerPickerFieldSchema } from '../../components'; +import { + OwnerPicker as Component, + OwnerPickerFieldSchema, +} from '../../components/fields/OwnerPicker'; export const OwnerPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts b/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts index 176b4fdaa6..b1cf2d8802 100644 --- a/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/RepoBranchPicker.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { RepoBranchPicker as Component } from '../../components/fields/RepoBranchPicker/RepoBranchPicker'; -import { RepoBranchPickerFieldSchema } from '../../components'; +import { + RepoBranchPicker as Component, + RepoBranchPickerFieldSchema, +} from '../../components/fields/RepoBranchPicker'; export const RepoBranchPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts b/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts index 829c20d7c0..10394f7df0 100644 --- a/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts +++ b/plugins/scaffolder/src/alpha/fields/RepoUrlPicker.ts @@ -14,11 +14,11 @@ * limitations under the License. */ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha'; -import { RepoUrlPicker as Component } from '../../components/fields/RepoUrlPicker/RepoUrlPicker'; import { repoPickerValidation, + RepoUrlPicker as Component, RepoUrlPickerFieldSchema, -} from '../../components'; +} from '../../components/fields/RepoUrlPicker'; export const RepoUrlPicker = createFormField({ component: Component, diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts b/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts index 82d9cb0b17..fc295d66c5 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/index.ts @@ -13,5 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export { EntityNamePicker } from './EntityNamePicker'; export { entityNamePickerValidation } from './validation'; export { EntityNamePickerFieldSchema } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts index 0230f26879..68c8d5157e 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/schema.ts @@ -15,9 +15,6 @@ */ import { makeFieldSchema } from '@backstage/plugin-scaffolder-react'; -/** - * @public - */ export const EntityNamePickerFieldSchema = makeFieldSchema({ output: z => z.string(), }); diff --git a/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts b/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts index e475606c11..9302e9abc1 100644 --- a/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts +++ b/plugins/scaffolder/src/components/fields/EntityNamePicker/validation.ts @@ -17,9 +17,6 @@ import { FieldValidation } from '@rjsf/utils'; import { KubernetesValidatorFunctions } from '@backstage/catalog-model'; -/** - * @public - */ export const entityNamePickerValidation = ( value: string, validation: FieldValidation, diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/index.ts b/plugins/scaffolder/src/components/fields/EntityPicker/index.ts index b8df596c98..08583dca30 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export { EntityPicker } from './EntityPicker'; export { EntityPickerFieldSchema, type EntityPickerUiOptions } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/EntityTagsPicker/index.ts b/plugins/scaffolder/src/components/fields/EntityTagsPicker/index.ts index 52bad9a80d..77786f0e1a 100644 --- a/plugins/scaffolder/src/components/fields/EntityTagsPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/EntityTagsPicker/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export { EntityTagsPicker } from './EntityTagsPicker'; export { EntityTagsPickerFieldSchema, type EntityTagsPickerUiOptions, diff --git a/plugins/scaffolder/src/components/fields/EntityTagsPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityTagsPicker/schema.ts index d1a300f5c8..0162804ce1 100644 --- a/plugins/scaffolder/src/components/fields/EntityTagsPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityTagsPicker/schema.ts @@ -46,7 +46,6 @@ export type EntityTagsPickerProps = typeof EntityTagsPickerFieldSchema.TProps; /** * The input props that can be specified under `ui:options` for the * `EntityTagsPicker` field extension. - * * @public */ export type EntityTagsPickerUiOptions = NonNullable< diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/index.ts b/plugins/scaffolder/src/components/fields/MultiEntityPicker/index.ts index 9a597b9b97..add40e4a81 100644 --- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export { MultiEntityPicker } from './MultiEntityPicker'; export { MultiEntityPickerFieldSchema, type MultiEntityPickerUiOptions, diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts index aa396229ee..667b4638b8 100644 --- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/schema.ts @@ -16,9 +16,6 @@ import { z as zod } from 'zod'; import { makeFieldSchema } from '@backstage/plugin-scaffolder-react'; -/** - * @public - */ export const entityQueryFilterExpressionSchema = zod.record( zod .string() @@ -26,9 +23,6 @@ export const entityQueryFilterExpressionSchema = zod.record( .or(zod.array(zod.string())), ); -/** - * @public - */ export const MultiEntityPickerFieldSchema = makeFieldSchema({ output: z => z.array(z.string()), uiOptions: z => @@ -60,7 +54,6 @@ export const MultiEntityPickerFieldSchema = makeFieldSchema({ /** * The input props that can be specified under `ui:options` for the * `EntityPicker` field extension. - * @public */ export type MultiEntityPickerUiOptions = NonNullable< (typeof MultiEntityPickerFieldSchema.TProps.uiSchema)['ui:options'] diff --git a/plugins/scaffolder/src/components/fields/MyGroupsPicker/index.ts b/plugins/scaffolder/src/components/fields/MyGroupsPicker/index.ts index 00be19cf96..42982dcb6f 100644 --- a/plugins/scaffolder/src/components/fields/MyGroupsPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/MyGroupsPicker/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export { MyGroupsPicker } from './MyGroupsPicker'; export { MyGroupsPickerSchema, type MyGroupsPickerUiOptions, diff --git a/plugins/scaffolder/src/components/fields/MyGroupsPicker/schema.ts b/plugins/scaffolder/src/components/fields/MyGroupsPicker/schema.ts index 6ccda91afb..41e8579328 100644 --- a/plugins/scaffolder/src/components/fields/MyGroupsPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/MyGroupsPicker/schema.ts @@ -36,7 +36,6 @@ export type MyGroupsPickerUiOptions = NonNullable< /** * Props for the MyGroupsPicker. - * @public */ export type MyGroupsPickerProps = typeof MyGroupsPickerFieldSchema.TProps; diff --git a/plugins/scaffolder/src/components/fields/OwnedEntityPicker/index.ts b/plugins/scaffolder/src/components/fields/OwnedEntityPicker/index.ts index 985dae1d3c..6738a8a057 100644 --- a/plugins/scaffolder/src/components/fields/OwnedEntityPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/OwnedEntityPicker/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export { OwnedEntityPicker } from './OwnedEntityPicker'; export { OwnedEntityPickerFieldSchema, type OwnedEntityPickerUiOptions, diff --git a/plugins/scaffolder/src/components/fields/OwnedEntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/OwnedEntityPicker/schema.ts index 6dd00df49d..e5435c150f 100644 --- a/plugins/scaffolder/src/components/fields/OwnedEntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/OwnedEntityPicker/schema.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { EntityPickerFieldSchema } from '../EntityPicker/schema'; +import { EntityPickerFieldSchema } from '../EntityPicker'; /** * @public @@ -23,7 +23,6 @@ export const OwnedEntityPickerFieldSchema = EntityPickerFieldSchema; /** * The input props that can be specified under `ui:options` for the * `OwnedEntityPicker` field extension. - * * @public */ export type OwnedEntityPickerUiOptions = NonNullable< diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/index.ts b/plugins/scaffolder/src/components/fields/OwnerPicker/index.ts index 9d94650e04..5080ee1602 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export { OwnerPicker } from './OwnerPicker'; export { OwnerPickerFieldSchema, type OwnerPickerUiOptions } from './schema'; diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts b/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts index 76389216ba..5a5b2e9cf6 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/schema.ts @@ -54,7 +54,6 @@ export const OwnerPickerFieldSchema = makeFieldSchema({ /** * The input props that can be specified under `ui:options` for the * `OwnerPicker` field extension. - * * @public */ export type OwnerPickerUiOptions = NonNullable< diff --git a/plugins/scaffolder/src/components/fields/RepoBranchPicker/index.ts b/plugins/scaffolder/src/components/fields/RepoBranchPicker/index.ts index 2b87b62ebd..e41b723aa9 100644 --- a/plugins/scaffolder/src/components/fields/RepoBranchPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/RepoBranchPicker/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +export { RepoBranchPicker } from './RepoBranchPicker'; export { RepoBranchPickerFieldSchema, type RepoBranchPickerUiOptions, diff --git a/plugins/scaffolder/src/components/fields/RepoBranchPicker/schema.ts b/plugins/scaffolder/src/components/fields/RepoBranchPicker/schema.ts index 62a3b66e14..4e76f4d988 100644 --- a/plugins/scaffolder/src/components/fields/RepoBranchPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/RepoBranchPicker/schema.ts @@ -15,9 +15,6 @@ */ import { makeFieldSchema } from '@backstage/plugin-scaffolder-react'; -/** - * @public - */ export const RepoBranchPickerFieldSchema = makeFieldSchema({ output: z => z.string(), uiOptions: z => @@ -69,8 +66,6 @@ export const RepoBranchPickerFieldSchema = makeFieldSchema({ /** * The input props that can be specified under `ui:options` for the * `RepoBranchPicker` field extension. - * - * @public */ export type RepoBranchPickerUiOptions = NonNullable< (typeof RepoBranchPickerFieldSchema.TProps.uiSchema)['ui:options'] diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/index.ts b/plugins/scaffolder/src/components/fields/RepoUrlPicker/index.ts index 33e5ef1715..d4dc219b68 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/index.ts +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +export { RepoUrlPicker } from './RepoUrlPicker'; export { RepoUrlPickerFieldSchema, type RepoUrlPickerUiOptions, diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/validation.ts b/plugins/scaffolder/src/components/fields/RepoUrlPicker/validation.ts index 06c2fd5684..682fc6bb2a 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/validation.ts +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/validation.ts @@ -22,7 +22,6 @@ import { scmIntegrationsApiRef } from '@backstage/integration-react'; * The validation function for the `repoUrl` that is returned from the * field extension. Ensures that you have all the required fields filled for * the different providers that exist. - * * @public */ export const repoPickerValidation = ( diff --git a/plugins/scaffolder/src/components/fields/index.ts b/plugins/scaffolder/src/components/fields/index.ts index dc1de86adb..287f62022c 100644 --- a/plugins/scaffolder/src/components/fields/index.ts +++ b/plugins/scaffolder/src/components/fields/index.ts @@ -13,14 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './EntityPicker'; -export * from './EntityNamePicker'; -export * from './OwnerPicker'; -export * from './RepoUrlPicker'; -export * from './OwnedEntityPicker'; -export * from './EntityTagsPicker'; -export * from './RepoBranchPicker'; -export * from './MultiEntityPicker'; -export * from './MyGroupsPicker'; - export { type FieldSchema, makeFieldSchemaFromZod } from './utils'; diff --git a/plugins/scaffolder/src/components/index.ts b/plugins/scaffolder/src/components/index.ts index 552a75c99b..abafd42ed2 100644 --- a/plugins/scaffolder/src/components/index.ts +++ b/plugins/scaffolder/src/components/index.ts @@ -14,7 +14,33 @@ * limitations under the License. */ export * from './fields'; -export type { RepoUrlPickerUiOptions } from './fields'; + +export { + EntityPickerFieldSchema, + type EntityPickerUiOptions, +} from './fields/EntityPicker'; +export { + EntityTagsPickerFieldSchema, + type EntityTagsPickerUiOptions, +} from './fields/EntityTagsPicker'; +export { + MyGroupsPickerFieldSchema, + MyGroupsPickerSchema, + type MyGroupsPickerUiOptions, +} from './fields/MyGroupsPicker'; +export { + OwnedEntityPickerFieldSchema, + type OwnedEntityPickerUiOptions, +} from './fields/OwnedEntityPicker'; +export { + OwnerPickerFieldSchema, + type OwnerPickerUiOptions, +} from './fields/OwnerPicker'; +export { + repoPickerValidation, + RepoUrlPickerFieldSchema, + type RepoUrlPickerUiOptions, +} from './fields/RepoUrlPicker'; export { TemplateTypePicker } from './TemplateTypePicker'; From 5417077b085032d72799504e769c3db902730e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 24 Sep 2025 13:05:58 +0200 Subject: [PATCH 110/177] break out provider/processor handling into a separate file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../src/service/CatalogBuilder.ts | 51 +---- .../catalog-backend/src/service/util.test.ts | 195 ++++++++++++++++++ plugins/catalog-backend/src/service/util.ts | 84 +++++++- 3 files changed, 282 insertions(+), 48 deletions(-) create mode 100644 plugins/catalog-backend/src/service/util.test.ts diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 35997c03c5..23178238c7 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -111,6 +111,7 @@ import { catalogEntityPermissionResourceRef, CatalogPermissionRuleInput, } from '@backstage/plugin-catalog-node/alpha'; +import { filterAndSortProcessors, filterProviders } from './util'; export type CatalogEnvironment = { logger: LoggerService; @@ -525,11 +526,12 @@ export class CatalogBuilder { const locationStore = new DefaultLocationStore(dbClient); const configLocationProvider = new ConfigLocationEntityProvider(config); - const entityProviders = this.filterProviders( + const entityProviders = filterProviders( lodash.uniqBy( [...this.entityProviders, locationStore, configLocationProvider], provider => provider.getProviderName(), ), + config, ); const processingEngine = new DefaultCatalogProcessingEngine({ @@ -684,42 +686,7 @@ export class CatalogBuilder { this.checkMissingExternalProcessors(processors); - const filteredProcessors = this.filterProcessors(processors); - - // Lastly sort the processors by priority. Config can override the - // priority of a processor to allow control of 3rd party processors. - filteredProcessors.sort((a, b) => { - const getProcessorPriority = (processor: CatalogProcessor) => { - try { - return ( - config.getOptionalNumber( - `catalog.processorOptions.${processor.getProcessorName()}.priority`, - ) ?? - processor.getPriority?.() ?? - 20 - ); - } catch (_) { - // In case the processor config throws, just return default priority - return 20; - } - }; - - const aPriority = getProcessorPriority(a); - const bPriority = getProcessorPriority(b); - return aPriority - bPriority; - }); - - return filteredProcessors; - } - - private filterProcessors(processors: CatalogProcessor[]) { - const { config } = this.env; - return processors.filter( - p => - config.getOptionalBoolean( - `catalog.processorOptions.${p.getProcessorName()}.disabled`, - ) !== true, - ); + return filterAndSortProcessors(processors, config); } // TODO(Rugvip): These old processors are removed, for a while we'll be throwing @@ -832,16 +799,6 @@ export class CatalogBuilder { ); } - private filterProviders(providers: EntityProvider[]) { - const { config } = this.env; - return providers.filter( - p => - config.getOptionalBoolean( - `catalog.providerOptions.${p.getProviderName()}.disabled`, - ) !== true, - ); - } - private static getDefaultProcessingInterval( config: Config, ): ProcessingIntervalFunction { diff --git a/plugins/catalog-backend/src/service/util.test.ts b/plugins/catalog-backend/src/service/util.test.ts new file mode 100644 index 0000000000..9a0d2cc799 --- /dev/null +++ b/plugins/catalog-backend/src/service/util.test.ts @@ -0,0 +1,195 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { mockServices } from '@backstage/backend-test-utils'; +import { filterAndSortProcessors, filterProviders } from './util'; + +describe('filterAndSortProcessors', () => { + it('should filter processors', () => { + const p1 = { getProcessorName: () => 'processor1' }; + const p2 = { getProcessorName: () => 'processor2' }; + + expect( + filterAndSortProcessors([p1, p2], mockServices.rootConfig({ data: {} })), + ).toEqual([p1, p2]); + + expect( + filterAndSortProcessors( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + processorOptions: { + processor1: { disabled: true }, + }, + }, + }, + }), + ), + ).toEqual([p2]); + + expect( + filterAndSortProcessors( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + processorOptions: { + processor2: { disabled: true }, + }, + }, + }, + }), + ), + ).toEqual([p1]); + }); + + it('should sort processors', () => { + const p1 = { getProcessorName: () => 'processor1', getPriority: () => 10 }; + const p2 = { getProcessorName: () => 'processor2' }; + const p3 = { + getProcessorName: () => 'processor3', + getPriority: () => { + throw new Error('failed'); + }, + }; + + expect( + filterAndSortProcessors( + [p1, p2, p3], + mockServices.rootConfig({ data: {} }), + ), + ).toEqual([p1, p2, p3]); // p2 and p3 got the defaults + + expect( + filterAndSortProcessors( + [p1, p2, p3], + mockServices.rootConfig({ + data: { + catalog: { + processorOptions: { + processor2: { priority: 2 }, + processor3: { priority: 1 }, + }, + }, + }, + }), + ), + ).toEqual([p3, p2, p1]); + }); + + it('rejects invalid config', () => { + const p1 = { getProcessorName: () => 'processor1' }; + const p2 = { getProcessorName: () => 'processor1' }; + + expect(() => + filterAndSortProcessors( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + processorOptions: { + processor1: { disabled: 'i guess so, maybe' }, + }, + }, + }, + }), + ), + ).toThrowErrorMatchingInlineSnapshot( + `"Unable to convert config value for key 'catalog.processorOptions.processor1.disabled' in 'mock-config' to a boolean"`, + ); + + expect(() => + filterAndSortProcessors( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + processorOptions: { + processor1: { priority: 'somewhere in the middle, roughly' }, + }, + }, + }, + }), + ), + ).toThrowErrorMatchingInlineSnapshot( + `"Unable to convert config value for key 'catalog.processorOptions.processor1.priority' in 'mock-config' to a number"`, + ); + }); +}); + +describe('filterProviders', () => { + it('should filter providers', () => { + const p1 = { getProviderName: () => 'provider1', connect: jest.fn() }; + const p2 = { getProviderName: () => 'provider2', connect: jest.fn() }; + + expect( + filterProviders([p1, p2], mockServices.rootConfig({ data: {} })), + ).toEqual([p1, p2]); + + expect( + filterProviders( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + providerOptions: { + provider1: { disabled: true }, + }, + }, + }, + }), + ), + ).toEqual([p2]); + + expect( + filterProviders( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + providerOptions: { + provider2: { disabled: true }, + }, + }, + }, + }), + ), + ).toEqual([p1]); + }); + + it('rejects invalid config', () => { + const p1 = { getProviderName: () => 'provider1', connect: jest.fn() }; + const p2 = { getProviderName: () => 'provider2', connect: jest.fn() }; + + expect(() => + filterProviders( + [p1, p2], + mockServices.rootConfig({ + data: { + catalog: { + providerOptions: { + provider1: { disabled: 'i guess so, maybe' }, + }, + }, + }, + }), + ), + ).toThrowErrorMatchingInlineSnapshot( + `"Unable to convert config value for key 'catalog.providerOptions.provider1.disabled' in 'mock-config' to a boolean"`, + ); + }); +}); diff --git a/plugins/catalog-backend/src/service/util.ts b/plugins/catalog-backend/src/service/util.ts index 9847cb7225..54f6a6afae 100644 --- a/plugins/catalog-backend/src/service/util.ts +++ b/plugins/catalog-backend/src/service/util.ts @@ -24,12 +24,17 @@ import { QueryEntitiesInitialRequest, QueryEntitiesRequest, } from '../catalog/types'; -import { EntityFilter } from '@backstage/plugin-catalog-node'; +import { + CatalogProcessor, + EntityFilter, + EntityProvider, +} from '@backstage/plugin-catalog-node'; import { Entity, parseEntityRef, stringifyEntityRef, } from '@backstage/catalog-model'; +import { Config } from '@backstage/config'; export async function requireRequestBody(req: Request): Promise { const contentType = req.header('content-type'); @@ -166,3 +171,80 @@ export function expandLegacyCompoundRelationsInEntity(entity: Entity): Entity { } return entity; } + +/** + * Given a list of catalog processors, filter out the ones that are disabled + * through the `catalog.processorOptions` config and sort them by priority. + */ +export function filterAndSortProcessors( + processors: CatalogProcessor[], + config: Config, +): CatalogProcessor[] { + function getProcessorOptions( + processor: CatalogProcessor, + ): Config | undefined { + const root = config.getOptionalConfig('catalog.processorOptions'); + try { + return root?.getOptionalConfig(processor.getProcessorName()); + } catch { + // We silence errors specifically here, to cover for cases where the + // processor name contains special characters which makes the config + // reader throw an error. + return undefined; + } + } + + function getProcessorDisabled(processor: CatalogProcessor): boolean { + return ( + getProcessorOptions(processor)?.getOptionalBoolean('disabled') === true + ); + } + + function getProcessorPriority(processor: CatalogProcessor): number { + let priority = + getProcessorOptions(processor)?.getOptionalNumber('priority'); + + if (priority === undefined) { + try { + priority = processor.getPriority?.(); + } catch { + // In case the processor method throws, just return default priority + } + } + + return priority ?? 20; + } + + return processors + .filter(p => !getProcessorDisabled(p)) + .sort((a, b) => getProcessorPriority(a) - getProcessorPriority(b)); +} + +/** + * Given a list of entity providers, filter out the ones that are disabled + * through the `catalog.providerOptions` config. + */ +export function filterProviders( + providers: EntityProvider[], + config: Config, +): EntityProvider[] { + function getProviderOptions(provider: EntityProvider): Config | undefined { + const root = config.getOptionalConfig('catalog.providerOptions'); + try { + return root?.getOptionalConfig(provider.getProviderName()); + } catch { + // We silence errors specifically here, to cover for cases where the + // provider name contains special characters which makes the config + // reader throw an error. + return undefined; + } + } + + function getProviderDisabled(provider: EntityProvider): boolean { + return ( + getProviderOptions(provider)?.getOptionalBoolean('disabled') === true + ); + } + + return providers.filter(p => !getProviderDisabled(p)); +} From e037246a3a79199acf37bf9fe0207f0d3da86972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 24 Sep 2025 13:47:11 +0200 Subject: [PATCH 111/177] do is instead of get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/catalog-backend/src/service/util.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-backend/src/service/util.ts b/plugins/catalog-backend/src/service/util.ts index 54f6a6afae..2d3d4879cb 100644 --- a/plugins/catalog-backend/src/service/util.ts +++ b/plugins/catalog-backend/src/service/util.ts @@ -194,7 +194,7 @@ export function filterAndSortProcessors( } } - function getProcessorDisabled(processor: CatalogProcessor): boolean { + function isProcessorDisabled(processor: CatalogProcessor): boolean { return ( getProcessorOptions(processor)?.getOptionalBoolean('disabled') === true ); @@ -216,7 +216,7 @@ export function filterAndSortProcessors( } return processors - .filter(p => !getProcessorDisabled(p)) + .filter(p => !isProcessorDisabled(p)) .sort((a, b) => getProcessorPriority(a) - getProcessorPriority(b)); } @@ -240,11 +240,11 @@ export function filterProviders( } } - function getProviderDisabled(provider: EntityProvider): boolean { + function isProviderDisabled(provider: EntityProvider): boolean { return ( getProviderOptions(provider)?.getOptionalBoolean('disabled') === true ); } - return providers.filter(p => !getProviderDisabled(p)); + return providers.filter(p => !isProviderDisabled(p)); } From faf0f07e02e4cae7017b77f4b9c831c9dc86fb7e Mon Sep 17 00:00:00 2001 From: Abhishek B Date: Wed, 24 Sep 2025 18:09:35 +0530 Subject: [PATCH 112/177] Correct the database name associated with the catalog plugin Signed-off-by: Abhishek B --- docs/tutorials/manual-knex-rollback.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/manual-knex-rollback.md b/docs/tutorials/manual-knex-rollback.md index b0f67ba3e0..442a48e2f5 100644 --- a/docs/tutorials/manual-knex-rollback.md +++ b/docs/tutorials/manual-knex-rollback.md @@ -23,7 +23,7 @@ You can interact with Knex running the commands below in the project root: We want to check the migration status: ```sh -$ node_modules/.bin/knex migrate:status --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_app" --client pg --migrations-directory node_modules/@backstage/plugin-catalog-backend/migrations/ +$ node_modules/.bin/knex migrate:status --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_catalog" --client pg --migrations-directory node_modules/@backstage/plugin-catalog-backend/migrations/ Using environment: production Found 2 Completed Migration file/files. 20211229105307_init.js @@ -34,7 +34,7 @@ No Pending Migration files Found. Now lets rollback a specific migration called `20240113144027_assets-namespace.js`: ```sh -$ node_modules/.bin/knex migrate:down 20240113144027_assets-namespace.js --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_app" --client pg --migrations-directory node_modules/@backstage/plugin-catalog-backend/migrations/ +$ node_modules/.bin/knex migrate:down 20240113144027_assets-namespace.js --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_catalog" --client pg --migrations-directory node_modules/@backstage/plugin-catalog-backend/migrations/ Using environment: production Batch 2 rolled back the following migrations: 20240113144027_assets-namespace.js @@ -43,7 +43,7 @@ Batch 2 rolled back the following migrations: Now we can check the migration status again to confirm the rollback: ```sh -$ node_modules/.bin/knex migrate:status --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_app" --client pg --migrations-directory node_modules/@backstage/plugin-catalog-backend/migrations/ +$ node_modules/.bin/knex migrate:status --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_catalog" --client pg --migrations-directory node_modules/@backstage/plugin-catalog-backend/migrations/ Using environment: production Found 1 Completed Migration file/files. 20211229105307_init.js @@ -54,7 +54,7 @@ Found 1 Pending Migration file/files. Now lets use `migrate:currentVersion` which retrieves the current migration version. If there aren't any migrations run yet, it will return "none". ```sh -$ node_modules/.bin/knex migrate:currentVersion --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_app" --client pg +$ node_modules/.bin/knex migrate:currentVersion --connection "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST/backstage_plugin_catalog" --client pg Using environment: production Current Version: 20240113144027 ``` From c2c60546d2d8f086f7c957602ed9c78cafe8ee46 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 24 Sep 2025 12:57:42 +0000 Subject: [PATCH 113/177] Version Packages (next) --- .changeset/create-app-1758718573.md | 5 + .changeset/pre.json | 2 + docs/releases/v1.44.0-next.1-changelog.md | 1925 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 10 + packages/app-defaults/package.json | 2 +- packages/app-next/CHANGELOG.md | 44 + packages/app-next/package.json | 2 +- packages/app/CHANGELOG.md | 39 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 8 + packages/backend-app-api/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 16 + packages/backend-defaults/package.json | 2 +- .../CHANGELOG.md | 22 + .../package.json | 2 +- packages/backend-openapi-utils/CHANGELOG.md | 7 + packages/backend-openapi-utils/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 10 + packages/backend-plugin-api/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 13 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 40 + packages/backend/package.json | 2 +- packages/cli/CHANGELOG.md | 11 + packages/cli/package.json | 2 +- packages/config-loader/CHANGELOG.md | 8 + packages/config-loader/package.json | 2 +- packages/config/CHANGELOG.md | 6 + packages/config/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 8 + packages/core-app-api/package.json | 2 +- packages/core-compat-api/CHANGELOG.md | 9 + packages/core-compat-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 8 + packages/core-components/package.json | 2 +- packages/core-plugin-api/CHANGELOG.md | 7 + packages/core-plugin-api/package.json | 2 +- packages/create-app/CHANGELOG.md | 6 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 12 + packages/dev-utils/package.json | 2 +- packages/frontend-app-api/CHANGELOG.md | 11 + packages/frontend-app-api/package.json | 2 +- packages/frontend-defaults/CHANGELOG.md | 11 + packages/frontend-defaults/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- packages/frontend-plugin-api/CHANGELOG.md | 8 + packages/frontend-plugin-api/package.json | 2 +- packages/frontend-test-utils/CHANGELOG.md | 11 + packages/frontend-test-utils/package.json | 2 +- packages/integration-aws-node/CHANGELOG.md | 7 + packages/integration-aws-node/package.json | 2 +- packages/integration-react/CHANGELOG.md | 9 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 7 + packages/integration/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 9 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 17 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 9 + packages/techdocs-cli/package.json | 2 +- packages/test-utils/CHANGELOG.md | 11 + packages/test-utils/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 14 + plugins/api-docs/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 11 + plugins/app-backend/package.json | 2 +- plugins/app-node/CHANGELOG.md | 8 + plugins/app-node/package.json | 2 +- plugins/app-visualizer/CHANGELOG.md | 9 + plugins/app-visualizer/package.json | 2 +- plugins/app/CHANGELOG.md | 11 + plugins/app/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 10 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 9 + plugins/auth-node/package.json | 2 +- plugins/auth-react/CHANGELOG.md | 8 + plugins/auth-react/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 14 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 11 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 10 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../catalog-backend-module-gitea/CHANGELOG.md | 11 + .../catalog-backend-module-gitea/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 10 + .../catalog-backend-module-ldap/package.json | 2 +- .../catalog-backend-module-logs/CHANGELOG.md | 9 + .../catalog-backend-module-logs/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 16 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-common/CHANGELOG.md | 8 + plugins/catalog-common/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 12 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 16 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 11 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 16 + plugins/catalog-react/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../catalog-unprocessed-entities/CHANGELOG.md | 10 + .../catalog-unprocessed-entities/package.json | 2 +- plugins/catalog/CHANGELOG.md | 19 + plugins/catalog/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 8 + plugins/config-schema/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 13 + plugins/devtools-backend/package.json | 2 +- plugins/devtools-common/CHANGELOG.md | 7 + plugins/devtools-common/package.json | 2 +- plugins/devtools/CHANGELOG.md | 12 + plugins/devtools/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 8 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 8 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 10 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 9 + .../events-backend-module-gitlab/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../events-backend-module-kafka/CHANGELOG.md | 9 + .../events-backend-module-kafka/package.json | 2 +- .../events-backend-test-utils/CHANGELOG.md | 7 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 10 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 7 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 7 + .../example-todo-list-backend/package.json | 2 +- plugins/example-todo-list-common/CHANGELOG.md | 7 + plugins/example-todo-list-common/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 8 + plugins/example-todo-list/package.json | 2 +- plugins/gateway-backend/CHANGELOG.md | 7 + plugins/gateway-backend/package.json | 2 +- plugins/home-react/CHANGELOG.md | 9 + plugins/home-react/package.json | 2 +- plugins/home/CHANGELOG.md | 15 + plugins/home/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 16 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 12 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-common/CHANGELOG.md | 7 + plugins/kubernetes-common/package.json | 2 +- plugins/kubernetes-node/CHANGELOG.md | 8 + plugins/kubernetes-node/package.json | 2 +- plugins/kubernetes-react/CHANGELOG.md | 9 + plugins/kubernetes-react/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 14 + plugins/kubernetes/package.json | 2 +- plugins/mcp-actions-backend/CHANGELOG.md | 10 + plugins/mcp-actions-backend/package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/notifications-backend/CHANGELOG.md | 14 + plugins/notifications-backend/package.json | 2 +- plugins/notifications-common/CHANGELOG.md | 7 + plugins/notifications-common/package.json | 2 +- plugins/notifications-node/CHANGELOG.md | 10 + plugins/notifications-node/package.json | 2 +- plugins/notifications/CHANGELOG.md | 12 + plugins/notifications/package.json | 2 +- plugins/org-react/CHANGELOG.md | 10 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 12 + plugins/org/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 11 + plugins/permission-backend/package.json | 2 +- plugins/permission-common/CHANGELOG.md | 7 + plugins/permission-common/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 10 + plugins/permission-node/package.json | 2 +- plugins/permission-react/CHANGELOG.md | 9 + plugins/permission-react/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 8 + plugins/proxy-backend/package.json | 2 +- plugins/proxy-node/CHANGELOG.md | 7 + plugins/proxy-node/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 27 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 8 + plugins/scaffolder-common/package.json | 2 +- .../scaffolder-node-test-utils/CHANGELOG.md | 9 + .../scaffolder-node-test-utils/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 10 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 13 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 19 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 10 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 10 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 14 + plugins/search-backend/package.json | 2 +- plugins/search-common/CHANGELOG.md | 7 + plugins/search-common/package.json | 2 +- plugins/search-react/CHANGELOG.md | 10 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 13 + plugins/search/package.json | 2 +- plugins/signals-backend/CHANGELOG.md | 11 + plugins/signals-backend/package.json | 2 +- plugins/signals-node/CHANGELOG.md | 10 + plugins/signals-node/package.json | 2 +- plugins/signals-react/CHANGELOG.md | 7 + plugins/signals-react/package.json | 2 +- plugins/signals/CHANGELOG.md | 11 + plugins/signals/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 15 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 16 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 11 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 10 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 19 + plugins/techdocs/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 10 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 13 + plugins/user-settings/package.json | 2 +- 358 files changed, 4032 insertions(+), 178 deletions(-) create mode 100644 .changeset/create-app-1758718573.md create mode 100644 docs/releases/v1.44.0-next.1-changelog.md diff --git a/.changeset/create-app-1758718573.md b/.changeset/create-app-1758718573.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1758718573.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/pre.json b/.changeset/pre.json index 7003364d39..03b4d762e2 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -213,6 +213,7 @@ "cold-coats-show", "cool-baboons-count", "create-app-1758639549", + "create-app-1758718573", "eager-toes-start", "fast-heads-brake", "fast-queens-guess", @@ -229,6 +230,7 @@ "red-times-bet", "salty-words-wash", "short-aliens-invite", + "six-cooks-battle", "solid-bikes-leave", "tame-hairs-smash", "tender-cups-tap", diff --git a/docs/releases/v1.44.0-next.1-changelog.md b/docs/releases/v1.44.0-next.1-changelog.md new file mode 100644 index 0000000000..e9d3f16f97 --- /dev/null +++ b/docs/releases/v1.44.0-next.1-changelog.md @@ -0,0 +1,1925 @@ +# Release v1.44.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.44.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.44.0-next.1) + +## @backstage/app-defaults@1.7.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + +## @backstage/backend-app-api@1.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @backstage/backend-defaults@0.13.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-app-api@1.2.8-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/cli-node@0.2.14 + +## @backstage/backend-dynamic-feature-service@0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/plugin-app-node@0.1.38-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-events-backend@0.5.7-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/cli-node@0.2.14 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/backend-openapi-utils@0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @backstage/backend-plugin-api@1.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + +## @backstage/backend-test-utils@1.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-app-api@1.2.8-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/cli@0.34.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/cli-node@0.2.14 + - @backstage/release-manifests@0.0.13 + +## @backstage/config@1.3.4-next.0 + +### Patch Changes + +- b45b094: Allow colon to be used as config key. + +## @backstage/config-loader@1.10.4-next.0 + +### Patch Changes + +- b45b094: Allow colon to be used as config key. +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## @backstage/core-app-api@1.19.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/core-compat-api@0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/core-components@0.18.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/core-plugin-api@1.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## @backstage/create-app@0.7.5-next.1 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + +## @backstage/frontend-app-api@0.13.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-defaults@0.3.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/frontend-defaults@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-app@0.3.1-next.1 + +## @backstage/frontend-dynamic-feature-loader@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/frontend-plugin-api@0.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/frontend-test-utils@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/test-utils@1.7.12-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-app@0.3.1-next.1 + +## @backstage/integration@1.18.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## @backstage/integration-aws-node@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## @backstage/integration-react@1.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/repo-tools@0.15.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/cli-node@0.2.14 + +## @techdocs/cli@1.9.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/plugin-techdocs-node@1.13.8-next.1 + +## @backstage/test-utils@1.7.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + +## @backstage/plugin-api-docs@0.13.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-app@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/plugin-app-backend@0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/plugin-app-node@0.1.38-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-app-node@0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @backstage/plugin-app-visualizer@0.1.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/plugin-auth-backend@0.25.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-okta-provider@0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-openshift-provider@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## @backstage/plugin-auth-node@0.6.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-auth-react@0.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/plugin-catalog@1.31.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-backend@3.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.11.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend-module-github@0.11.1-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend-module-gitlab@0.7.4-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.11.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.10-next.0 + +## @backstage/plugin-catalog-common@1.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-catalog-graph@0.5.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-import@0.13.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-node@1.19.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-react@1.21.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-test-utils@0.3.7-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-config-schema@0.1.73-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/plugin-devtools@0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-devtools-common@0.1.18-next.0 + +## @backstage/plugin-devtools-backend@0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-devtools-common@0.1.18-next.0 + +## @backstage/plugin-devtools-common@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-events-backend@0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-azure@0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-server@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-github@0.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-google-pubsub@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-module-kafka@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.49-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-events-node@0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @backstage/plugin-gateway-backend@1.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @backstage/plugin-home@0.8.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-home-react@0.1.31-next.1 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-home-react@0.1.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/plugin-kubernetes@0.12.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-kubernetes-react@0.5.12-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + +## @backstage/plugin-kubernetes-backend@0.20.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-kubernetes-node@0.3.5-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-kubernetes-cluster@0.0.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-kubernetes-react@0.5.12-next.1 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + +## @backstage/plugin-kubernetes-common@0.9.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-kubernetes-node@0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + +## @backstage/plugin-kubernetes-react@0.5.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + +## @backstage/plugin-mcp-actions-backend@0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-notifications@0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-signals-react@0.0.16-next.0 + +## @backstage/plugin-notifications-backend@0.5.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-notifications-node@0.2.20-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-notifications-node@0.2.20-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-notifications-backend-module-slack@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-notifications-node@0.2.20-next.0 + +## @backstage/plugin-notifications-common@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## @backstage/plugin-notifications-node@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-org@0.6.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + +## @backstage/plugin-org-react@0.1.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-permission-backend@0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + +## @backstage/plugin-permission-common@0.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## @backstage/plugin-permission-node@0.10.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-permission-react@0.4.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-proxy-backend@0.6.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-proxy-node@0.1.9-next.0 + +## @backstage/plugin-proxy-node@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @backstage/plugin-scaffolder@1.34.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-scaffolder-backend@3.0.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.15-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.9.6-next.1 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.1 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.9.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-notifications-node@0.2.20-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-scaffolder-node-test-utils@0.3.4-next.1 + +## @backstage/plugin-scaffolder-common@1.7.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-scaffolder-node@0.12.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/backend-test-utils@1.9.1-next.1 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + +## @backstage/plugin-scaffolder-react@1.19.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-search@1.4.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-backend@2.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-backend-module-explore@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.49-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-techdocs-node@1.13.8-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-search-backend-node@1.3.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-search-common@1.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + +## @backstage/plugin-search-react@1.9.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-signals@0.0.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-signals-react@0.0.16-next.0 + +## @backstage/plugin-signals-backend@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-signals-node@0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## @backstage/plugin-signals-react@0.0.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.11.1-next.0 + +## @backstage/plugin-techdocs@1.15.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/test-utils@1.7.12-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + +## @backstage/plugin-techdocs-backend@2.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.1 + - @backstage/plugin-techdocs-node@1.13.8-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/plugin-techdocs-node@1.13.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## @backstage/plugin-techdocs-react@1.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + +## @backstage/plugin-user-settings@0.8.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-signals-react@0.0.16-next.0 + +## @backstage/plugin-user-settings-backend@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + +## example-app@0.2.114-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-catalog-import@0.13.6-next.1 + - @backstage/plugin-home@0.8.13-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-api-docs@0.13.0-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-graph@0.5.2-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-notifications@0.5.10-next.1 + - @backstage/plugin-org@0.6.45-next.1 + - @backstage/plugin-scaffolder@1.34.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/plugin-search@1.4.31-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/plugin-signals@0.0.24-next.1 + - @backstage/plugin-user-settings@0.8.27-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.1 + - @backstage/plugin-devtools@0.1.32-next.1 + - @backstage/plugin-kubernetes@0.12.12-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## example-app-next@0.0.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/frontend-defaults@0.3.2-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-catalog-import@0.13.6-next.1 + - @backstage/plugin-home@0.8.13-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-api-docs@0.13.0-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-graph@0.5.2-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-notifications@0.5.10-next.1 + - @backstage/plugin-org@0.6.45-next.1 + - @backstage/plugin-scaffolder@1.34.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/plugin-search@1.4.31-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/plugin-signals@0.0.24-next.1 + - @backstage/plugin-user-settings@0.8.27-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-app@0.3.1-next.1 + - @backstage/plugin-app-visualizer@0.1.24-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.1 + - @backstage/plugin-kubernetes@0.12.12-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.1 + - @backstage/plugin-auth@0.1.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## example-backend@0.0.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/plugin-app-backend@0.5.7-next.0 + - @backstage/plugin-devtools-backend@0.5.10-next.1 + - @backstage/plugin-proxy-backend@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.13-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.1-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.7-next.0 + - @backstage/plugin-events-backend@0.5.7-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.5-next.0 + - @backstage/plugin-kubernetes-backend@0.20.3-next.1 + - @backstage/plugin-notifications-backend@0.5.11-next.0 + - @backstage/plugin-permission-backend@0.7.5-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-scaffolder-backend@3.0.0-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.1 + - @backstage/plugin-search-backend@2.0.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.8-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.1 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-signals-backend@0.3.9-next.0 + - @backstage/plugin-techdocs-backend@2.1.1-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.8-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.15-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.5-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.4-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.13-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.15-next.1 + +## techdocs-cli-embedded-app@0.2.113-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/test-utils@1.7.12-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + +## @internal/plugin-todo-list@1.0.44-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + +## @internal/plugin-todo-list-backend@1.0.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + +## @internal/plugin-todo-list-common@1.0.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 diff --git a/package.json b/package.json index c58f5fb3d3..b510a5a864 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.44.0-next.0", + "version": "1.44.0-next.1", "backstage": { "cli": { "new": { diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index e5d901b279..7e0fe1b55d 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/app-defaults +## 1.7.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + ## 1.7.1-next.0 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index e872055314..1a2cbecc12 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.7.1-next.0", + "version": "1.7.1-next.1", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md index c1abb0f661..87c84cf26c 100644 --- a/packages/app-next/CHANGELOG.md +++ b/packages/app-next/CHANGELOG.md @@ -1,5 +1,49 @@ # example-app-next +## 0.0.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/frontend-defaults@0.3.2-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-catalog-import@0.13.6-next.1 + - @backstage/plugin-home@0.8.13-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-api-docs@0.13.0-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-graph@0.5.2-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-notifications@0.5.10-next.1 + - @backstage/plugin-org@0.6.45-next.1 + - @backstage/plugin-scaffolder@1.34.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/plugin-search@1.4.31-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/plugin-signals@0.0.24-next.1 + - @backstage/plugin-user-settings@0.8.27-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-app@0.3.1-next.1 + - @backstage/plugin-app-visualizer@0.1.24-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.1 + - @backstage/plugin-kubernetes@0.12.12-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.1 + - @backstage/plugin-auth@0.1.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 0.0.28-next.0 ### Patch Changes diff --git a/packages/app-next/package.json b/packages/app-next/package.json index 99b0a23f51..ebfb59c96a 100644 --- a/packages/app-next/package.json +++ b/packages/app-next/package.json @@ -1,6 +1,6 @@ { "name": "example-app-next", - "version": "0.0.28-next.0", + "version": "0.0.28-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index daa56a15da..675001c296 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,44 @@ # example-app +## 0.2.114-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-catalog-import@0.13.6-next.1 + - @backstage/plugin-home@0.8.13-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-api-docs@0.13.0-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-graph@0.5.2-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-notifications@0.5.10-next.1 + - @backstage/plugin-org@0.6.45-next.1 + - @backstage/plugin-scaffolder@1.34.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/plugin-search@1.4.31-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/plugin-signals@0.0.24-next.1 + - @backstage/plugin-user-settings@0.8.27-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.1 + - @backstage/plugin-devtools@0.1.32-next.1 + - @backstage/plugin-kubernetes@0.12.12-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 0.2.114-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 0d0ad4e1c2..56b5178692 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.114-next.0", + "version": "0.2.114-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index d965783fac..a0176a008f 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/backend-app-api +## 1.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 1.2.7 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 9407f28707..b082de0cfa 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "1.2.7", + "version": "1.2.8-next.0", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index e390e71e79..1201918fb5 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-defaults +## 0.13.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-app-api@1.2.8-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/cli-node@0.2.14 + ## 0.13.0-next.0 ### Minor Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 4a27d65c33..f85d34db9e 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.13.0-next.0", + "version": "0.13.0-next.1", "description": "Backend defaults used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md index 2e2a966438..a15b315a62 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/backend-dynamic-feature-service +## 0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/plugin-app-node@0.1.38-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-events-backend@0.5.7-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/cli-node@0.2.14 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 0.7.5-next.0 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 268d54c180..78e881a6bc 100644 --- a/packages/backend-dynamic-feature-service/package.json +++ b/packages/backend-dynamic-feature-service/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dynamic-feature-service", - "version": "0.7.5-next.0", + "version": "0.7.5-next.1", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index 87bea0405e..61815004c3 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/backend-openapi-utils +## 0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 0.6.1 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index 31d7aaf486..48211fa851 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-openapi-utils", - "version": "0.6.1", + "version": "0.6.2-next.0", "description": "OpenAPI typescript support.", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 914d45f68b..44931c21e1 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/backend-plugin-api +## 1.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + ## 1.4.3 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index baebdcd506..fcdbd15107 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-plugin-api", - "version": "1.4.3", + "version": "1.4.4-next.0", "description": "Core API used by Backstage backend plugins", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index d81c184682..536d595d34 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/backend-test-utils +## 1.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-app-api@1.2.8-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 1.9.1-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index a9b160bcd8..3ee214b345 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-test-utils", - "version": "1.9.1-next.0", + "version": "1.9.1-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index a1e68bd8e7..f8c601b473 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,45 @@ # example-backend +## 0.0.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/plugin-app-backend@0.5.7-next.0 + - @backstage/plugin-devtools-backend@0.5.10-next.1 + - @backstage/plugin-proxy-backend@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.13-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.1-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.7-next.0 + - @backstage/plugin-events-backend@0.5.7-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.5-next.0 + - @backstage/plugin-kubernetes-backend@0.20.3-next.1 + - @backstage/plugin-notifications-backend@0.5.11-next.0 + - @backstage/plugin-permission-backend@0.7.5-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-scaffolder-backend@3.0.0-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.1 + - @backstage/plugin-search-backend@2.0.7-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.9-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.8-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.1 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-signals-backend@0.3.9-next.0 + - @backstage/plugin-techdocs-backend@2.1.1-next.1 + - @backstage/plugin-auth-backend-module-github-provider@0.3.8-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.15-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.5-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.4-next.1 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.13-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.15-next.1 + ## 0.0.43-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 15bfab297f..c698a424a5 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.43-next.0", + "version": "0.0.43-next.1", "backstage": { "role": "backend" }, diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 8c35d62164..28b2293982 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/cli +## 0.34.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/cli-node@0.2.14 + - @backstage/release-manifests@0.0.13 + ## 0.34.4-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 99a4c56b58..3c12b383ad 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.34.4-next.0", + "version": "0.34.4-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 872136d5a2..b29be4a927 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/config-loader +## 1.10.4-next.0 + +### Patch Changes + +- b45b094: Allow colon to be used as config key. +- Updated dependencies + - @backstage/config@1.3.4-next.0 + ## 1.10.3 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index f8d103e97b..dda4d6e222 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config-loader", - "version": "1.10.3", + "version": "1.10.4-next.0", "description": "Config loading functionality used by Backstage backend, and CLI", "backstage": { "role": "node-library" diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index bf9455a84e..43bcc0551b 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/config +## 1.3.4-next.0 + +### Patch Changes + +- b45b094: Allow colon to be used as config key. + ## 1.3.3 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index 4ec4038e26..ec6cd78422 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config", - "version": "1.3.3", + "version": "1.3.4-next.0", "description": "Config API used by Backstage core, backend, and CLI", "backstage": { "role": "common-library" diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 05bdf33224..334a36acb3 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/core-app-api +## 1.19.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 1.19.0 ### Minor Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 8a52a71867..d4a4dce17d 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-app-api", - "version": "1.19.0", + "version": "1.19.1-next.0", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index a1d9a3d37d..f0cb3b6878 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/core-compat-api +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.5.3-next.0 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 1ccb842a9c..0bbe284db9 100644 --- a/packages/core-compat-api/package.json +++ b/packages/core-compat-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-compat-api", - "version": "0.5.3-next.0", + "version": "0.5.3-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index adb205392f..b6109caf2e 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/core-components +## 0.18.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 0.18.2-next.0 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 4e16285cfb..c2d09762b3 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.18.2-next.0", + "version": "0.18.2-next.1", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 61291f8e05..89ad055230 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/core-plugin-api +## 1.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + ## 1.11.0 ### Minor Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 6e62c66c3a..d019090bb4 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-plugin-api", - "version": "1.11.0", + "version": "1.11.1-next.0", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 245cd34a46..b2960b4c83 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/create-app +## 0.7.5-next.1 + +### Patch Changes + +- Bumped create-app version. + ## 0.7.5-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 0330fb9663..cd37f6eef6 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.5-next.0", + "version": "0.7.5-next.1", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 10177c7c7d..7f7338afeb 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/dev-utils +## 1.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + ## 1.1.15-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 055f4f94b7..707717f6a4 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.15-next.0", + "version": "1.1.15-next.1", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 80591e1bd9..780e62fbe8 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-app-api +## 0.13.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-defaults@0.3.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.13.1-next.0 ### Patch Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index bd52912d55..707067b54f 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.13.1-next.0", + "version": "0.13.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index 2ebae3e384..f60f948f3a 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-defaults +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-app@0.3.1-next.1 + ## 0.3.2-next.0 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 06efcf0576..ab8f88b653 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-dynamic-feature-loader/CHANGELOG.md b/packages/frontend-dynamic-feature-loader/CHANGELOG.md index fd185af296..853dc59772 100644 --- a/packages/frontend-dynamic-feature-loader/CHANGELOG.md +++ b/packages/frontend-dynamic-feature-loader/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/frontend-dynamic-feature-loader +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.1.6-next.0 ### Patch Changes diff --git a/packages/frontend-dynamic-feature-loader/package.json b/packages/frontend-dynamic-feature-loader/package.json index bda6b0686c..7c68833418 100644 --- a/packages/frontend-dynamic-feature-loader/package.json +++ b/packages/frontend-dynamic-feature-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-dynamic-feature-loader", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 537939e8a5..e12aedb385 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/frontend-plugin-api +## 0.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 0.12.1-next.0 ### Patch Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 714cd0471a..15e557101c 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.12.1-next.0", + "version": "0.12.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 6f17abe709..0c198ecc1b 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/frontend-test-utils +## 0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/frontend-app-api@0.13.1-next.1 + - @backstage/test-utils@1.7.12-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-app@0.3.1-next.1 + ## 0.3.7-next.0 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 7aab8a9265..3241bc0ce5 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.3.7-next.0", + "version": "0.3.7-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index 297e6330f2..830f38632e 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/integration-aws-node +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + ## 0.1.17 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index ab0f3583a4..10855b7f54 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-aws-node", - "version": "0.1.17", + "version": "0.1.18-next.0", "description": "Helpers for fetching AWS account credentials", "backstage": { "role": "node-library" diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index efc73ec308..adf06f88bd 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 1.2.11-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index fe6c47f736..410500c520 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.11-next.0", + "version": "1.2.11-next.1", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index b03eff3ebc..e6546099f2 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/integration +## 1.18.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + ## 1.18.1-next.0 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 8d7f655e2b..2dbb4a32e8 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.18.1-next.0", + "version": "1.18.1-next.1", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index d93d88571a..d8272e383a 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/repo-tools +## 0.15.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/cli-node@0.2.14 + ## 0.15.2 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 0b0954da70..a536a95f4c 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.15.2", + "version": "0.15.3-next.0", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 5eda7ebcaf..54f526a1f2 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,22 @@ # techdocs-cli-embedded-app +## 0.2.113-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/test-utils@1.7.12-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + ## 0.2.113-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 577426d02c..951a3df06e 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.113-next.0", + "version": "0.2.113-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 9d47af4de6..2fe1e1101a 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @techdocs/cli +## 1.9.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/plugin-techdocs-node@1.13.8-next.1 + ## 1.9.9-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 4a4675c6e1..b46d0bc540 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.9.9-next.0", + "version": "1.9.9-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 57e6d7e237..8425798421 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/test-utils +## 1.7.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + ## 1.7.11 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index aade054088..6e914f3b50 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.7.11", + "version": "1.7.12-next.0", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 817b60fd0c..446f2ed89f 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-api-docs +## 0.13.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.13.0-next.0 ### Minor Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 0012ec9b54..1aa27b8770 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.13.0-next.0", + "version": "0.13.0-next.1", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 02039c933e..c4f1db2d8c 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-app-backend +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/plugin-app-node@0.1.38-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.5.6 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 609cf1c543..4d4184e745 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-backend", - "version": "0.5.6", + "version": "0.5.7-next.0", "description": "A Backstage backend plugin that serves the Backstage frontend app", "backstage": { "role": "backend-plugin", diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index ea9532aca5..85d63c28f0 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-app-node +## 0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 0.1.37 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index f11a84bc55..68f07f9a22 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-node", - "version": "0.1.37", + "version": "0.1.38-next.0", "description": "Node.js library for the app plugin", "backstage": { "role": "node-library", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index 85876e49b2..ea0b147aff 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-app-visualizer +## 0.1.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.1.24-next.0 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index b0ce29d3c8..fa30acefe2 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.1.24-next.0", + "version": "0.1.24-next.1", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index 615f644cc4..f4bf0f1255 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-app +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.3.1-next.0 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index c0934f7c54..5a31bcc847 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.3.1-next.0", + "version": "0.3.1-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md index 16d1637cd6..842ca78bb5 100644 --- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-atlassian-provider +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index 4fd74b74ca..cff00133b1 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-atlassian-provider", - "version": "0.4.7", + "version": "0.4.8-next.0", "description": "The atlassian-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md index 725b88735c..8a2ad5f168 100644 --- a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-auth0-provider +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/auth-backend-module-auth0-provider/package.json b/plugins/auth-backend-module-auth0-provider/package.json index 8e06baa4db..00dc9323b3 100644 --- a/plugins/auth-backend-module-auth0-provider/package.json +++ b/plugins/auth-backend-module-auth0-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-auth0-provider", - "version": "0.2.7", + "version": "0.2.8-next.0", "description": "The auth0-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index f2026fd2b9..723f7ad420 100644 --- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-aws-alb-provider +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json index d85b993f28..1ad538a2d9 100644 --- a/plugins/auth-backend-module-aws-alb-provider/package.json +++ b/plugins/auth-backend-module-aws-alb-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-aws-alb-provider", - "version": "0.4.7", + "version": "0.4.8-next.0", "description": "The aws-alb provider module for the Backstage auth backend.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md index 355d9ea55f..893319b20f 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-azure-easyauth-provider +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json index 534d721107..4d07dd3fc6 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/package.json +++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "The azure-easyauth-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md index 79a379c94c..6eed708472 100644 --- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index e7826bcf08..f283fc02b4 100644 --- a/plugins/auth-backend-module-bitbucket-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "The bitbucket-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md index dad1d86780..9707eb2f61 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-server-provider +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-server-provider/package.json b/plugins/auth-backend-module-bitbucket-server-provider/package.json index 7f830811e7..2d5bfd2d90 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-server-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-server-provider", - "version": "0.2.7", + "version": "0.2.8-next.0", "description": "The bitbucket-server-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md index 3bd2055825..f91945cc0c 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-cloudflare-access-provider +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index 537526dbdc..168e8beb2a 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider", - "version": "0.4.7", + "version": "0.4.8-next.0", "description": "The cloudflare-access-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index d587f6a999..bd7e41965c 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index 9bf40aaf4d..34b2a5e0b0 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", - "version": "0.4.7", + "version": "0.4.8-next.0", "description": "A GCP IAP auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 0ea39f5b6d..70c7e89e07 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index d5854b1ff2..536447e70a 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "The github-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index afd0f2258f..2fb20e02da 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index b7cb8c5da3..a9e127e8bd 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "The gitlab-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 7c5651d120..c9bc882f02 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index f947b84b39..ee64a21ec7 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "A Google auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-guest-provider/CHANGELOG.md b/plugins/auth-backend-module-guest-provider/CHANGELOG.md index d57b0e967e..23207f8475 100644 --- a/plugins/auth-backend-module-guest-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-guest-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-guest-provider +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json index 7e6a657797..5ecfc2bff2 100644 --- a/plugins/auth-backend-module-guest-provider/package.json +++ b/plugins/auth-backend-module-guest-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-guest-provider", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "The guest-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md index 3a21bd1bf7..41fa37111c 100644 --- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-microsoft-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index a5f661b839..d64f626183 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-microsoft-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "The microsoft-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 0caf910ee2..f9ffe99d18 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index beeba6af8b..3dd64a625b 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", - "version": "0.4.7", + "version": "0.4.8-next.0", "description": "The oauth2-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md index b64d3a2481..a5adb734ed 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-oauth2-proxy-provider +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json index 6edd907d51..1041138065 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json +++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "The oauth2-proxy-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md index d21b18e15c..0b7d28f313 100644 --- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-oidc-provider +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.4.7 ### Patch Changes diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index d40ded83d7..2cace6cd92 100644 --- a/plugins/auth-backend-module-oidc-provider/package.json +++ b/plugins/auth-backend-module-oidc-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oidc-provider", - "version": "0.4.7", + "version": "0.4.8-next.0", "description": "The oidc-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md index 4db3b0639b..dd873c0fa9 100644 --- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-okta-provider +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.2.7 ### Patch Changes diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index a1f8977142..e23e950456 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-okta-provider", - "version": "0.2.7", + "version": "0.2.8-next.0", "description": "The okta-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md index 95b2e88aec..2d3823b451 100644 --- a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-onelogin-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-onelogin-provider/package.json b/plugins/auth-backend-module-onelogin-provider/package.json index a7b087aaa6..cb125303d4 100644 --- a/plugins/auth-backend-module-onelogin-provider/package.json +++ b/plugins/auth-backend-module-onelogin-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-onelogin-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "The onelogin-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-openshift-provider/CHANGELOG.md b/plugins/auth-backend-module-openshift-provider/CHANGELOG.md index 06f116c2ef..ee774f7634 100644 --- a/plugins/auth-backend-module-openshift-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-openshift-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-openshift-provider +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/auth-backend-module-openshift-provider/package.json b/plugins/auth-backend-module-openshift-provider/package.json index 648f09bf24..2a6d089f7d 100644 --- a/plugins/auth-backend-module-openshift-provider/package.json +++ b/plugins/auth-backend-module-openshift-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-openshift-provider", - "version": "0.1.0", + "version": "0.1.1-next.0", "description": "The OpenShift backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md index a23d6cb733..57d2709222 100644 --- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-pinniped-provider +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index ad80ff2904..0b0be4a1e7 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-pinniped-provider", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "The pinniped-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md index 41ac1cafdd..253020462a 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-vmware-cloud-provider +## 0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + ## 0.5.7 ### Patch Changes diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json index 0222da22a5..817dc428ab 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/package.json +++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider", - "version": "0.5.7", + "version": "0.5.8-next.0", "description": "The vmware-cloud-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index be4b8bcaad..952550248e 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend +## 0.25.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + ## 0.25.4 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 74c03204b6..f2f9e28c51 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.25.4", + "version": "0.25.5-next.0", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index d784004cd3..d69b151c1d 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-node +## 0.6.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.6.7 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 5c61000f64..2cd1d7e5b2 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.6.7", + "version": "0.6.8-next.0", "backstage": { "role": "node-library", "pluginId": "auth", diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index 86662ef3f3..afd088cad8 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-react +## 0.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 0.1.20-next.0 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index a41ccd3432..99d59b6e6d 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-react", - "version": "0.1.20-next.0", + "version": "0.1.20-next.1", "description": "Web library for the auth plugin", "backstage": { "role": "web-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 582cea0429..a77ccf785c 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.4.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + ## 0.4.16-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 48088f2529..12d6761143 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", - "version": "0.4.16-next.0", + "version": "0.4.16-next.1", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 7b58ca6a0b..8f04f5cae5 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.3.10-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index bc337337f0..44b8b9cfeb 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.10-next.0", + "version": "0.3.10-next.1", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index 5021408d44..a5b83b98da 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + ## 0.5.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index a17bf50b47..3243d6e317 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.5.6", + "version": "0.5.7-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 531418dc68..bce5bc231b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.5.4-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 562911f1bd..14bef6edaf 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.5.4-next.0", + "version": "0.5.4-next.1", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 72f0f277ed..cb7767ce16 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.5.4-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index abbd7be1aa..f0bbf19128 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.5.4-next.0", + "version": "0.5.4-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index c02fe65bd5..dfba428022 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + ## 0.3.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 1123f00416..7a313a6486 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.13-next.0", + "version": "0.3.13-next.1", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index c26520ccc5..c1f9fe3867 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.3.7-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 2586dda386..eec09488a6 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.3.7-next.0", + "version": "0.3.7-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gitea/CHANGELOG.md b/plugins/catalog-backend-module-gitea/CHANGELOG.md index 09f2a60401..35bb7f8bd3 100644 --- a/plugins/catalog-backend-module-gitea/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gitea +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.1.5-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json index 3fac7944e1..601b973da0 100644 --- a/plugins/catalog-backend-module-gitea/package.json +++ b/plugins/catalog-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitea", - "version": "0.1.5-next.0", + "version": "0.1.5-next.1", "license": "Apache-2.0", "description": "The gitea backend module for the catalog plugin.", "main": "src/index.ts", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index ad55f9a4f5..df63d6fb8f 100644 --- a/plugins/catalog-backend-module-github-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-github-org +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend-module-github@0.11.1-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index a862c80768..bab1bdfe00 100644 --- a/plugins/catalog-backend-module-github-org/package.json +++ b/plugins/catalog-backend-module-github-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github-org", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "description": "The github-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index c4cfc67865..2921c3960d 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-github +## 0.11.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.11.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index cf564acfe1..7ed76c0ed7 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-github", - "version": "0.11.1-next.0", + "version": "0.11.1-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md index 654d97b7c1..b162bf1103 100644 --- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-gitlab-org +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend-module-gitlab@0.7.4-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index 09d9796167..80a0b2627a 100644 --- a/plugins/catalog-backend-module-gitlab-org/package.json +++ b/plugins/catalog-backend-module-gitlab-org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab-org", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The gitlab-org backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index d4f3382f60..18a1915ee6 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.7.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.7.4-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 4a48f14bd6..6a676975a2 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", - "version": "0.7.4-next.0", + "version": "0.7.4-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index d25514e90f..b15da28058 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.7.5-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 7aa7c5e7b1..b63bfaa76b 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.7.5-next.0", + "version": "0.7.5-next.1", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 2a1dbf6d62..e3f5ef572d 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.11.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.11.9 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 91ac03c93a..38845929f4 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", - "version": "0.11.9", + "version": "0.11.10-next.0", "description": "A Backstage catalog backend module that helps integrate towards LDAP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index 2f62c77773..0ee19e94f0 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-backend@3.1.1-next.1 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index 74c71fd3fe..a51f0821ba 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.15-next.0", + "version": "0.1.15-next.1", "description": "A module that subscribes to catalog related events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 8ab315e9dd..3db73151fe 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.8.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index f2f8a5d442..580fcc7962 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", - "version": "0.8.0", + "version": "0.8.1-next.0", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 72eecbb0df..2c98a53a84 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index e8d9a5b741..96ced0dd97 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 14fa817eba..cdbee9bfb8 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + ## 0.2.14 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index ced5df4773..2501290bed 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", - "version": "0.2.14", + "version": "0.2.15-next.0", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 6cddd6166b..b53acb9e97 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.2.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 5f1f4277d2..f5d9a6c1af 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.13-next.0", + "version": "0.2.13-next.1", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 1c4b8f8363..3df0e25d43 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.10-next.0 + ## 0.6.4 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 32bcfe904f..d2f10d1aa7 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.6.4", + "version": "0.6.5-next.0", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 0ec926a05c..0f2c5cb2ae 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend +## 3.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 3.1.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index ec09efc9a3..fbb6789146 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "3.1.1-next.0", + "version": "3.1.1-next.1", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index a0cdac70e8..a536481835 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-catalog-common +## 1.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 1.1.5 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index 7ce4e23d55..9ee7c8d416 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-common", - "version": "1.1.5", + "version": "1.1.6-next.0", "description": "Common functionalities for the catalog plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 4293e64516..b492c41a37 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-graph +## 0.5.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/catalog-client@1.12.0 + ## 0.5.2-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index aa66e4a234..f455dbce31 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.5.2-next.0", + "version": "0.5.2-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 10252aadbe..7cd77df78b 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-import +## 0.13.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.13.6-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 8065881127..80524e0fde 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.13.6-next.0", + "version": "0.13.6-next.1", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index ba27f2a2e2..c61acc0a30 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-node +## 1.19.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 1.19.0 ### Minor Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 545656ae80..378068b773 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "1.19.0", + "version": "1.19.1-next.0", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index bfc54981fa..b4088aaaf7 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-react +## 1.21.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-test-utils@0.3.7-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 1.21.2-next.0 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index b645537a7e..cb55343b0a 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "1.21.2-next.0", + "version": "1.21.2-next.1", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md index d72fea4dd6..9e256e7b77 100644 --- a/plugins/catalog-unprocessed-entities-common/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-unprocessed-entities-common +## 0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 0.0.9 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities-common/package.json b/plugins/catalog-unprocessed-entities-common/package.json index 6663c2535d..cd8aa8e4f0 100644 --- a/plugins/catalog-unprocessed-entities-common/package.json +++ b/plugins/catalog-unprocessed-entities-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities-common", - "version": "0.0.9", + "version": "0.0.10-next.0", "description": "Common functionalities for the catalog-unprocessed-entities plugin", "backstage": { "role": "common-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 3483042a69..6a6d24b25c 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.22-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.2.22-next.0 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 0abe8ae2be..1eea850146 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.2.22-next.0", + "version": "0.2.22-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index a10136e79b..e260fb05b7 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog +## 1.31.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + ## 1.31.4-next.0 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 580b6abdb9..95c843e504 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.31.4-next.0", + "version": "1.31.4-next.1", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 5e94cbe988..15b30e6845 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-config-schema +## 0.1.73-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 0.1.73-next.0 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index c49c1e9087..c87141b1f3 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-config-schema", - "version": "0.1.73-next.0", + "version": "0.1.73-next.1", "description": "A Backstage plugin that lets you browse the configuration schema of your app", "backstage": { "role": "frontend-plugin", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index 9213c182e9..e48d8fe67c 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-devtools-backend +## 0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.4-next.0 + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-devtools-common@0.1.18-next.0 + ## 0.5.10-next.0 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 3a95c1dbf9..a1ca86b9ba 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.5.10-next.0", + "version": "0.5.10-next.1", "backstage": { "role": "backend-plugin", "pluginId": "devtools", diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index 55ed84de0f..b4d0c31621 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-devtools-common +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 0.1.17 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index a5056edf41..bae134de49 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-common", - "version": "0.1.17", + "version": "0.1.18-next.0", "description": "Common functionalities for the devtools plugin", "backstage": { "role": "common-library", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index 7f5ad6310d..99e894a877 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-devtools +## 0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-devtools-common@0.1.18-next.0 + ## 0.1.32-next.0 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index ea69e09e86..367a90867e 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.32-next.0", + "version": "0.1.32-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index baca97880c..58cca92f47 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.4.15 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 359cd768c8..36ea2e4cad 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.4.15", + "version": "0.4.16-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 91791d0966..99e91bb475 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.2.24 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 3747c2b097..a6b93f76c3 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.2.24", + "version": "0.2.25-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 5014807859..25ba6c3ed3 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.2.24 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index e523b668ca..b653428ae7 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.2.24", + "version": "0.2.25-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-server/CHANGELOG.md b/plugins/events-backend-module-bitbucket-server/CHANGELOG.md index 8c54c534b3..88a40b4114 100644 --- a/plugins/events-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-server +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-server/package.json b/plugins/events-backend-module-bitbucket-server/package.json index dd4429548c..b7365f0d3d 100644 --- a/plugins/events-backend-module-bitbucket-server/package.json +++ b/plugins/events-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-server", - "version": "0.1.5", + "version": "0.1.6-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 511a31488d..8938f8ff6d 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.2.24 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 81978168a7..dfd74ab6bd 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.2.24", + "version": "0.2.25-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 483afda21f..0eef3b4c4c 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-github +## 0.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.4.5-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index d9cd60cedc..be65aa0744 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.4.5-next.0", + "version": "0.4.5-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 0df6ece6ab..68f72cdfd1 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.3.5 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 560f4fae76..63a15f990d 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.3.5", + "version": "0.3.6-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-google-pubsub/CHANGELOG.md b/plugins/events-backend-module-google-pubsub/CHANGELOG.md index 6002004dc4..4d296461b0 100644 --- a/plugins/events-backend-module-google-pubsub/CHANGELOG.md +++ b/plugins/events-backend-module-google-pubsub/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-google-pubsub +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/events-backend-module-google-pubsub/package.json b/plugins/events-backend-module-google-pubsub/package.json index 88f6fe714e..4b52f60661 100644 --- a/plugins/events-backend-module-google-pubsub/package.json +++ b/plugins/events-backend-module-google-pubsub/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-google-pubsub", - "version": "0.1.4", + "version": "0.1.5-next.0", "description": "The google-pubsub backend module for the events plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/events-backend-module-kafka/CHANGELOG.md b/plugins/events-backend-module-kafka/CHANGELOG.md index f12109da75..b3b94438cd 100644 --- a/plugins/events-backend-module-kafka/CHANGELOG.md +++ b/plugins/events-backend-module-kafka/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-kafka +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.1.3 ### Patch Changes diff --git a/plugins/events-backend-module-kafka/package.json b/plugins/events-backend-module-kafka/package.json index 03a1c6c1dc..d298375b55 100644 --- a/plugins/events-backend-module-kafka/package.json +++ b/plugins/events-backend-module-kafka/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-kafka", - "version": "0.1.3", + "version": "0.1.4-next.0", "description": "The kafka backend module for the events plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 5a02e4ed51..bb2cced423 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.49-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.1.48 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index a27e4efbe6..9ef009f4cf 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-test-utils", - "version": "0.1.48", + "version": "0.1.49-next.0", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", "backstage": { "role": "node-library", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 15b1b91730..825199efef 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.5.6 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index a5f530f33c..1094448ac5 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.5.6", + "version": "0.5.7-next.0", "backstage": { "role": "backend-plugin", "pluginId": "events", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 1b706fdf22..152b45c4f0 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-node +## 0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 0.4.15 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index efd879a47a..3d1cbb949c 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-node", - "version": "0.4.15", + "version": "0.4.16-next.0", "description": "The plugin-events-node module for @backstage/plugin-events-backend", "backstage": { "role": "node-library", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index bd1db36bb8..da8317ef8f 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-backend +## 1.0.44-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 1.0.43 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 6775feb352..eaaa88f919 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.43", + "version": "1.0.44-next.0", "backstage": { "role": "backend-plugin", "pluginId": "todo-list", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index 72a97d5d14..8f7d8cde0f 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 1.0.26 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 3858b463dc..ea144ba06d 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.26", + "version": "1.0.27-next.0", "backstage": { "role": "common-library", "pluginId": "todo-list", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 564ed40cb9..67d827c298 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.44-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + ## 1.0.44-next.0 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index c8f75da342..723cab4ed1 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.44-next.0", + "version": "1.0.44-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/gateway-backend/CHANGELOG.md b/plugins/gateway-backend/CHANGELOG.md index eabcf7fe66..933a55625c 100644 --- a/plugins/gateway-backend/CHANGELOG.md +++ b/plugins/gateway-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-gateway-backend +## 1.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 1.0.5 ### Patch Changes diff --git a/plugins/gateway-backend/package.json b/plugins/gateway-backend/package.json index 985f5f9380..1503fd8668 100644 --- a/plugins/gateway-backend/package.json +++ b/plugins/gateway-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gateway-backend", - "version": "1.0.5", + "version": "1.0.6-next.0", "backstage": { "role": "backend-plugin", "pluginId": "gateway", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 37c1ac8b57..c3f58c0cb3 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-home-react +## 0.1.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 0.1.31-next.0 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index dbc036029b..3d2b97c535 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.31-next.0", + "version": "0.1.31-next.1", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 1ce162951b..54dbb31ae0 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-home +## 0.8.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-home-react@0.1.31-next.1 + - @backstage/catalog-client@1.12.0 + ## 0.8.13-next.0 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 70bba26ce4..52a4fdd395 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.8.13-next.0", + "version": "0.8.13-next.1", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index c67593601c..5221cbf95f 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-kubernetes-backend +## 0.20.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-kubernetes-node@0.3.5-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + - @backstage/catalog-client@1.12.0 + ## 0.20.3-next.0 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 51ea136593..f90c2ff4a9 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.20.3-next.0", + "version": "0.20.3-next.1", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 4d05386487..527c13c88d 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-kubernetes-react@0.5.12-next.1 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + ## 0.0.30-next.0 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 8d65670f28..3e0544ced9 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.30-next.0", + "version": "0.0.30-next.1", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 0ec9185623..3c9078d364 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-kubernetes-common +## 0.9.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 0.9.7-next.0 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index f78da14fa6..18dc397817 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-common", - "version": "0.9.7-next.0", + "version": "0.9.7-next.1", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index 8870323c75..e6d163150c 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-kubernetes-node +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + ## 0.3.5-next.0 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index cd204be633..9b0297a9c2 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.3.5-next.0", + "version": "0.3.5-next.1", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index 033d51737b..ee05844a0b 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kubernetes-react +## 0.5.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + ## 0.5.12-next.0 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index c417938b40..583bb5ef0d 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.5.12-next.0", + "version": "0.5.12-next.1", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 991781331c..62ffb354bf 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes +## 0.12.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-kubernetes-react@0.5.12-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-kubernetes-common@0.9.7-next.1 + ## 0.12.12-next.0 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index aaf3c0f65d..1ae796c1c0 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.12-next.0", + "version": "0.12.12-next.1", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/mcp-actions-backend/CHANGELOG.md b/plugins/mcp-actions-backend/CHANGELOG.md index dbc8326e1a..b00eb4ed8d 100644 --- a/plugins/mcp-actions-backend/CHANGELOG.md +++ b/plugins/mcp-actions-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-mcp-actions-backend +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index cf2b5e1d74..804bb0251a 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mcp-actions-backend", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "backstage": { "role": "backend-plugin", "pluginId": "mcp-actions", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index 1d58fa9727..99f2277dad 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-notifications-node@0.2.20-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.3.13 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index ac8682fe2d..7c1e279c6c 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.13", + "version": "0.3.14-next.0", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend-module-slack/CHANGELOG.md b/plugins/notifications-backend-module-slack/CHANGELOG.md index cc69729a3a..757678ac3e 100644 --- a/plugins/notifications-backend-module-slack/CHANGELOG.md +++ b/plugins/notifications-backend-module-slack/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-notifications-backend-module-slack +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-notifications-node@0.2.20-next.0 + ## 0.1.5 ### Patch Changes diff --git a/plugins/notifications-backend-module-slack/package.json b/plugins/notifications-backend-module-slack/package.json index 4f7e59770e..118e54493b 100644 --- a/plugins/notifications-backend-module-slack/package.json +++ b/plugins/notifications-backend-module-slack/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-slack", - "version": "0.1.5", + "version": "0.1.6-next.0", "description": "The slack backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 9291e3e550..15e529d14f 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-notifications-backend +## 0.5.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-notifications-node@0.2.20-next.0 + ## 0.5.10 ### Patch Changes diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 1a2c746409..c12535bd50 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.5.10", + "version": "0.5.11-next.0", "backstage": { "role": "backend-plugin", "pluginId": "notifications", diff --git a/plugins/notifications-common/CHANGELOG.md b/plugins/notifications-common/CHANGELOG.md index 77108764b7..8b8d000d02 100644 --- a/plugins/notifications-common/CHANGELOG.md +++ b/plugins/notifications-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-notifications-common +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + ## 0.1.0 ### Minor Changes diff --git a/plugins/notifications-common/package.json b/plugins/notifications-common/package.json index a56cbc06f4..769559fcb4 100644 --- a/plugins/notifications-common/package.json +++ b/plugins/notifications-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-common", - "version": "0.1.0", + "version": "0.1.1-next.0", "description": "Common functionalities for the notifications plugin", "backstage": { "role": "common-library", diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index 1db30a23ee..c10c5f7298 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-notifications-node +## 0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.2.19 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index 2046692085..4029787583 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.19", + "version": "0.2.20-next.0", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 1c1e910e44..6f3ae7c818 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-notifications +## 0.5.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-signals-react@0.0.16-next.0 + ## 0.5.10-next.0 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 092a26c3ba..eb1a616832 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.5.10-next.0", + "version": "0.5.10-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index dd586ca211..ce7f577228 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-org-react +## 0.1.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/catalog-client@1.12.0 + ## 0.1.43-next.0 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 94d8e62962..7bb23cee16 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.43-next.0", + "version": "0.1.43-next.1", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index b9fa9ec4d6..74115ab64e 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-org +## 0.6.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + ## 0.6.45-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 0868489426..b879153b9d 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.45-next.0", + "version": "0.6.45-next.1", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index 601c110e9d..a7f4ca35fc 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index b20d4f85a6..ee78f2a838 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "Allow all policy backend module for the permission plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 5bcc2ccff7..4f3d7e5587 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-permission-backend +## 0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + ## 0.7.4 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 434694dc06..2fa47a318d 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.7.4", + "version": "0.7.5-next.0", "backstage": { "role": "backend-plugin", "pluginId": "permission", diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index d3d9d320ca..733f271b9c 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-permission-common +## 0.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + ## 0.9.1 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index e12c557d4d..d40badc146 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-common", - "version": "0.9.1", + "version": "0.9.2-next.0", "description": "Isomorphic types and client for Backstage permissions and authorization", "backstage": { "role": "common-library", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index bcd8dc8be3..1f07bf1fd4 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-node +## 0.10.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 0.10.4 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 38f9d07cd8..5fcc329924 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-node", - "version": "0.10.4", + "version": "0.10.5-next.0", "description": "Common permission and authorization utilities for backend plugins", "backstage": { "role": "node-library", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index df0bc44dc3..55b06661f9 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-react +## 0.4.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 0.4.36 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 6e15c5fdeb..8a6243c505 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.36", + "version": "0.4.37-next.0", "backstage": { "role": "web-library", "pluginId": "permission", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index fd2683ed4d..31a4986b95 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-proxy-backend +## 0.6.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-proxy-node@0.1.9-next.0 + ## 0.6.6 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 76501017c5..ba6fabdff1 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-backend", - "version": "0.6.6", + "version": "0.6.7-next.0", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", "backstage": { "role": "backend-plugin", diff --git a/plugins/proxy-node/CHANGELOG.md b/plugins/proxy-node/CHANGELOG.md index 01cc972c66..f0efb3e344 100644 --- a/plugins/proxy-node/CHANGELOG.md +++ b/plugins/proxy-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-proxy-node +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + ## 0.1.8 ### Patch Changes diff --git a/plugins/proxy-node/package.json b/plugins/proxy-node/package.json index 79453d4c6c..c877a1f855 100644 --- a/plugins/proxy-node/package.json +++ b/plugins/proxy-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-node", - "version": "0.1.8", + "version": "0.1.9-next.0", "description": "The plugin-proxy-node module for @backstage/plugin-proxy-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index c4c021f726..09ab5c5315 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 837b6e4d8c..d88bfd3644 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index 3648ebf879..25d549b80e 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index b2d9b1b92c..62ebc4dd81 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index 3e573f638d..9df81bc074 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 97f8abc1aa..5a94568f31 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index 535f4bab5c..70c74689d2 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.1 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index 957dff0afc..c1c4bf4b20 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index fb5bbbfaf5..e7679f53a2 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.3.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index e4ef5be916..ffa94b8898 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.14-next.0", + "version": "0.3.14-next.1", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index a9dbde5b6f..fdd71a766f 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.3.16-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 530732acd0..2f293d1e99 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.16-next.0", + "version": "0.3.16-next.1", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index 83e72c1e3a..9fd84eae8a 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index 0a4609c457..a01afe161f 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index 58877701b2..1205bdb94a 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 928c3965f3..04dcd408eb 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index f6309bd70b..7595f6f16e 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index cc6e18fbd2..162a9863f2 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 1a2f46d3fb..bf4bd23777 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + ## 0.9.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 49851f967a..94db5bdf32 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.9.1-next.0", + "version": "0.9.1-next.1", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 1b371afb91..c1312cc2a6 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.9.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.9.6-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 64eb919a59..2f3a9fad89 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.9.6-next.0", + "version": "0.9.6-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index 5937669786..ec1caf1cfd 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-notifications-common@0.1.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-notifications-node@0.2.20-next.0 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 4220fc14ba..25725743c9 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.15-next.0", + "version": "0.1.15-next.1", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index f8cf3b6e3f..cea46b79e2 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.5.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 589b4cf729..9e4da03db0 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.14-next.0", + "version": "0.5.14-next.1", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index fca74f3951..53d878fc2c 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index f07e77413f..32bd5d1fc1 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 449503e901..c0846372a0 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/plugin-scaffolder-node-test-utils@0.3.4-next.1 + ## 0.4.15-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 295b154103..20390d9fd1 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.15-next.0", + "version": "0.4.15-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 1e3fbe7bf1..4cff936ddc 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-scaffolder-backend +## 3.0.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.15-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.14-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.1-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.9.6-next.1 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.13-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + ## 3.0.0-next.0 ### Major Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 99faf1bf5b..a310b26f01 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "3.0.0-next.0", + "version": "3.0.0-next.1", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 67e4b5058d..4fd26a92bc 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-common +## 1.7.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 1.7.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 3a4eef3e03..097e64ab13 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-common", - "version": "1.7.2-next.0", + "version": "1.7.2-next.1", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 2520b628e7..dab7e41108 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/backend-test-utils@1.9.1-next.1 + - @backstage/plugin-scaffolder-node@0.12.0-next.1 + ## 0.3.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index 3cbae20d33..fd2767b0fc 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.3.4-next.0", + "version": "0.3.4-next.1", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 750fd7ce98..7a46a277e2 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node +## 0.12.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + ## 0.12.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 88a7ebf8ce..1852e6909a 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.12.0-next.0", + "version": "0.12.0-next.1", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index cda6c9b6a6..ad51eccb64 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-react +## 1.19.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/catalog-client@1.12.0 + ## 1.19.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index ac452d2205..1c61387895 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.19.2-next.0", + "version": "1.19.2-next.1", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index d4b6a5bd15..60ef454a7c 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-scaffolder +## 1.34.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-scaffolder-common@1.7.2-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 1.34.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index fe2c88e3ed..ef05bbd203 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.34.2-next.0", + "version": "1.34.2-next.1", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 5267a5f25a..4577e13e7b 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-backend-module-catalog +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.3.8 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index 8db4d6fb96..65ad71aa61 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.3.8", + "version": "0.3.9-next.0", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index f9aaad3e06..a2fcb531f9 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 1.7.6 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 7e87d35fc6..1a876032fd 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", - "version": "1.7.6", + "version": "1.7.7-next.0", "description": "A module for the search backend that implements search using ElasticSearch", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index 644c75f6f7..6cd3b52e68 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-explore +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 08fe70b093..576c602099 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-explore", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "A module for the search backend that exports explore modules", "backstage": { "moved": "@backstage-community/plugin-search-backend-module-explore", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 2b148f8542..18ec68b9bf 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.49-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 0.5.49-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 312783ddc3..0eb6dfd93f 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.49-next.0", + "version": "0.5.49-next.1", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index b5b6802e05..f9509d5fef 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.3.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 0.3.13 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index 3885882caa..3bf8b7dfaf 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", - "version": "0.3.13", + "version": "0.3.14-next.0", "description": "A module for the search backend that exports stack overflow modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index a23f555d67..fa9fc4c851 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/plugin-techdocs-node@1.13.8-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + ## 0.4.7-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 4a4a13d3e6..f5938b6059 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", - "version": "0.4.7-next.0", + "version": "0.4.7-next.1", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index f61d4f4318..28856ff5b8 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-node +## 1.3.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 1.3.15 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index e862163a08..c84c9b5d98 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-node", - "version": "1.3.15", + "version": "1.3.16-next.0", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", "backstage": { "role": "node-library", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 9bef273db2..2445f7707c 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-backend +## 2.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 2.0.7-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 4e61e05ce6..99f80d5bfa 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend", - "version": "2.0.7-next.0", + "version": "2.0.7-next.1", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index ef5deee025..0f7aa1a167 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-search-common +## 1.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.2-next.0 + ## 1.2.19 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index 582e6b3434..dbdbccf225 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-common", - "version": "1.2.19", + "version": "1.2.20-next.0", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", "backstage": { "role": "common-library", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 6a23e79db4..06ef62a738 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-react +## 1.9.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 1.9.5-next.0 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 7bd07a786e..320eef5c5d 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.9.5-next.0", + "version": "1.9.5-next.1", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index d3119d0c9a..daf30ccac0 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search +## 1.4.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 1.4.31-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 48f462897d..1c4b422c08 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.4.31-next.0", + "version": "1.4.31-next.1", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md index 86eb851f7a..3eebcf0ddf 100644 --- a/plugins/signals-backend/CHANGELOG.md +++ b/plugins/signals-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-signals-backend +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.3.8 ### Patch Changes diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index b5de8611df..f9834ab228 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-backend", - "version": "0.3.8", + "version": "0.3.9-next.0", "backstage": { "role": "backend-plugin", "pluginId": "signals", diff --git a/plugins/signals-node/CHANGELOG.md b/plugins/signals-node/CHANGELOG.md index 0bdbb32c87..0951df4c42 100644 --- a/plugins/signals-node/CHANGELOG.md +++ b/plugins/signals-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-signals-node +## 0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + ## 0.1.24 ### Patch Changes diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 907d51c588..3f592954e5 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-node", - "version": "0.1.24", + "version": "0.1.25-next.0", "description": "Node.js library for the signals plugin", "backstage": { "role": "node-library", diff --git a/plugins/signals-react/CHANGELOG.md b/plugins/signals-react/CHANGELOG.md index d5cfb09e39..1f513931bb 100644 --- a/plugins/signals-react/CHANGELOG.md +++ b/plugins/signals-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-signals-react +## 0.0.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.11.1-next.0 + ## 0.0.15 ### Patch Changes diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index cc92bb120c..7916ae57ce 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-react", - "version": "0.0.15", + "version": "0.0.16-next.0", "description": "Web library for the signals plugin", "backstage": { "role": "web-library", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index 4d878217e4..fc017d9bce 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-signals +## 0.0.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-signals-react@0.0.16-next.0 + ## 0.0.24-next.0 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index d4ecc528c5..3e2a2fc337 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.24-next.0", + "version": "0.0.24-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "signals", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 32d6473083..7da2594325 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/test-utils@1.7.12-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + ## 1.1.1-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 0c24577409..8c71a8622a 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.1.1-next.0", + "version": "1.1.1-next.1", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 970677836e..fba425b578 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-backend +## 2.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/integration@1.18.1-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.7-next.1 + - @backstage/plugin-techdocs-node@1.13.8-next.1 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/catalog-client@1.12.0 + ## 2.1.1-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 7bc5e52385..72bbb5a834 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.1.1-next.0", + "version": "2.1.1-next.1", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 841e350d23..b44f48355d 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 1.1.29-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 92e40a664c..dd7acb2fa5 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.29-next.0", + "version": "1.1.29-next.1", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index b3bcc36620..8d60815de0 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-node +## 1.13.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/integration-aws-node@0.1.18-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + ## 1.13.8-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 5d36d96287..cdd1de2061 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.13.8-next.0", + "version": "1.13.8-next.1", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 4e11d1c6f9..196132fadd 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-techdocs-react +## 1.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/frontend-plugin-api@0.12.1-next.1 + ## 1.3.4-next.0 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 6020c8fb78..6ae10aead2 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-react", - "version": "1.3.4-next.0", + "version": "1.3.4-next.1", "description": "Shared frontend utilities for TechDocs and Addons", "backstage": { "role": "web-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 67a2e51ad8..9fe41a7e39 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-techdocs +## 1.15.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/integration@1.18.1-next.1 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-search-common@1.2.20-next.0 + - @backstage/catalog-client@1.12.0 + ## 1.15.1-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index ffc41132fe..97480471c6 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.15.1-next.0", + "version": "1.15.1-next.1", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 7b9763d4da..b2cebb44be 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-user-settings-backend +## 0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-signals-node@0.1.25-next.0 + ## 0.3.7-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 30c7355ba1..30e7c83b0f 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.3.7-next.0", + "version": "0.3.7-next.1", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 2c3a347cd7..a5e5104c71 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-user-settings +## 0.8.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.1-next.0 + - @backstage/core-components@0.18.2-next.1 + - @backstage/core-plugin-api@1.11.1-next.0 + - @backstage/core-compat-api@0.5.3-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/frontend-plugin-api@0.12.1-next.1 + - @backstage/plugin-signals-react@0.0.16-next.0 + ## 0.8.27-next.0 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 8b0c297f70..ca2b5f2e9e 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.8.27-next.0", + "version": "0.8.27-next.1", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", From 8ac36e8737587a95c29a6629f93c99b8b4ef16e3 Mon Sep 17 00:00:00 2001 From: Gustavo RPS <516827+gustavorps@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:27:31 -0300 Subject: [PATCH 114/177] Add PromiseRouter import to http-router.md Signed-off-by: Gustavo RPS <516827+gustavorps@users.noreply.github.com> --- docs/backend-system/core-services/http-router.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/backend-system/core-services/http-router.md b/docs/backend-system/core-services/http-router.md index 5e065152a0..23304f663f 100644 --- a/docs/backend-system/core-services/http-router.md +++ b/docs/backend-system/core-services/http-router.md @@ -134,6 +134,7 @@ import { createAuthIntegrationRouter, createRateLimitMiddleware, } from '@backstage/backend-defaults/httpRouter'; +import PromiseRouter from 'express-promise-router'; import { createServiceFactory } from '@backstage/backend-plugin-api'; const backend = createBackend(); From 02f152703d09970af742c23e72421bbb4e20e6e2 Mon Sep 17 00:00:00 2001 From: Gustavo RPS <516827+gustavorps@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:32:07 -0300 Subject: [PATCH 115/177] Add express Handler import to http-router.md Signed-off-by: Gustavo RPS <516827+gustavorps@users.noreply.github.com> --- docs/backend-system/core-services/http-router.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/backend-system/core-services/http-router.md b/docs/backend-system/core-services/http-router.md index 23304f663f..4f1e2284ad 100644 --- a/docs/backend-system/core-services/http-router.md +++ b/docs/backend-system/core-services/http-router.md @@ -135,6 +135,7 @@ import { createRateLimitMiddleware, } from '@backstage/backend-defaults/httpRouter'; import PromiseRouter from 'express-promise-router'; +import { Handler } from 'express'; import { createServiceFactory } from '@backstage/backend-plugin-api'; const backend = createBackend(); From 3dc8604ace962a93f3795547ab6a555205289c8d Mon Sep 17 00:00:00 2001 From: Gustavo RPS <516827+gustavorps@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:36:10 -0300 Subject: [PATCH 116/177] Add coreServices and HttpRouterServiceAuthPolicy imports Signed-off-by: Gustavo RPS <516827+gustavorps@users.noreply.github.com> --- docs/backend-system/core-services/http-router.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/backend-system/core-services/http-router.md b/docs/backend-system/core-services/http-router.md index 4f1e2284ad..583cd0212d 100644 --- a/docs/backend-system/core-services/http-router.md +++ b/docs/backend-system/core-services/http-router.md @@ -136,7 +136,11 @@ import { } from '@backstage/backend-defaults/httpRouter'; import PromiseRouter from 'express-promise-router'; import { Handler } from 'express'; -import { createServiceFactory } from '@backstage/backend-plugin-api'; +import { + createServiceFactory, + coreServices, + HttpRouterServiceAuthPolicy +} from '@backstage/backend-plugin-api'; const backend = createBackend(); From 61b6281e5c17445414d8a7d2ae258cf7779d2497 Mon Sep 17 00:00:00 2001 From: Claire Peng Date: Thu, 25 Sep 2025 10:12:40 +0100 Subject: [PATCH 117/177] simplify changeset & update hasFile to accept number or string Signed-off-by: Claire Peng --- .changeset/twelve-oranges-grin.md | 11 +---------- .../catalog-backend-module-gitlab/src/lib/client.ts | 2 +- .../src/providers/GitlabDiscoveryEntityProvider.ts | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/.changeset/twelve-oranges-grin.md b/.changeset/twelve-oranges-grin.md index b508a59b0b..174dbdcd66 100644 --- a/.changeset/twelve-oranges-grin.md +++ b/.changeset/twelve-oranges-grin.md @@ -6,15 +6,6 @@ Update GitlabDiscoveryEntityProvider to use `project.id` rather than `project.pa Solves [#30147](https://github.com/backstage/backstage/issues/30147): -> Use of project.id avoids edgecases caused by path encoding or project structure changes +> Use of project.id avoids edge cases caused by path encoding or project structure changes > [...] > It also simplifies reasoning about the GitLab API usage, since IDs are immutable, while paths are not. - -```diff -const hasFile = await client.hasFile( -- project.path_with_namespace, -+ project.id.toString(), - project_branch, - this.config.catalogFile, -); -``` diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 46ff54846c..5c373dcf4a 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -349,7 +349,7 @@ export class GitLabClient { * @param filePath - The path to the file */ async hasFile( - projectIdentifier: string, + projectIdentifier: string | number, branch: string, filePath: string, ): Promise { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index e52c231d46..b3371dcc9e 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -590,7 +590,7 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { this.config.fallbackBranch; const hasFile = await client.hasFile( - project.id.toString(), + project.id, project_branch, this.config.catalogFile, ); From 077dee1902fb0c967bbf728497011db5f29c85af Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Sep 2025 18:53:05 +0200 Subject: [PATCH 118/177] plugins: scaffold bui-themer plugin Signed-off-by: Patrik Oldsberg --- packages/app/package.json | 1 + packages/app/src/App.tsx | 2 + plugins/bui-themer/.eslintrc.js | 1 + plugins/bui-themer/README.md | 13 + plugins/bui-themer/catalog-info.yaml | 9 + plugins/bui-themer/dev/index.tsx | 26 ++ plugins/bui-themer/package.json | 53 +++ .../ExampleComponent.test.tsx | 38 +++ .../ExampleComponent/ExampleComponent.tsx | 52 +++ .../src/components/ExampleComponent/index.ts | 16 + .../ExampleFetchComponent.test.tsx | 34 ++ .../ExampleFetchComponent.tsx | 322 ++++++++++++++++++ .../components/ExampleFetchComponent/index.ts | 16 + plugins/bui-themer/src/index.ts | 16 + plugins/bui-themer/src/plugin.test.ts | 22 ++ plugins/bui-themer/src/plugin.ts | 37 ++ plugins/bui-themer/src/routes.ts | 20 ++ plugins/bui-themer/src/setupTests.ts | 16 + yarn.lock | 131 +++++-- 19 files changed, 805 insertions(+), 20 deletions(-) create mode 100644 plugins/bui-themer/.eslintrc.js create mode 100644 plugins/bui-themer/README.md create mode 100644 plugins/bui-themer/catalog-info.yaml create mode 100644 plugins/bui-themer/dev/index.tsx create mode 100644 plugins/bui-themer/package.json create mode 100644 plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx create mode 100644 plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx create mode 100644 plugins/bui-themer/src/components/ExampleComponent/index.ts create mode 100644 plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx create mode 100644 plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx create mode 100644 plugins/bui-themer/src/components/ExampleFetchComponent/index.ts create mode 100644 plugins/bui-themer/src/index.ts create mode 100644 plugins/bui-themer/src/plugin.test.ts create mode 100644 plugins/bui-themer/src/plugin.ts create mode 100644 plugins/bui-themer/src/routes.ts create mode 100644 plugins/bui-themer/src/setupTests.ts diff --git a/packages/app/package.json b/packages/app/package.json index 56b5178692..56e619e65a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -46,6 +46,7 @@ "@backstage/integration-react": "workspace:^", "@backstage/plugin-api-docs": "workspace:^", "@backstage/plugin-auth-react": "workspace:^", + "@backstage/plugin-bui-themer": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-graph": "workspace:^", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index ad525420a7..bd64dc504f 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -73,6 +73,7 @@ import { } from '@backstage/plugin-notifications'; import { CustomizableHomePage } from './components/home/CustomizableHomePage'; import { HomePage } from './components/home/HomePage'; +import { BuiThemerPage } from '@backstage/plugin-bui-themer'; const app = createApp({ apis, @@ -208,6 +209,7 @@ const routes = ( {customDevToolsPage} } /> + } /> ); diff --git a/plugins/bui-themer/.eslintrc.js b/plugins/bui-themer/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/bui-themer/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/bui-themer/README.md b/plugins/bui-themer/README.md new file mode 100644 index 0000000000..f73dd7875e --- /dev/null +++ b/plugins/bui-themer/README.md @@ -0,0 +1,13 @@ +# bui-themer + +Welcome to the bui-themer plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/bui-themer](http://localhost:3000/bui-themer). + +You can also serve the plugin in isolation by running `yarn start` in the plugin directory. +This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads. +It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory. diff --git a/plugins/bui-themer/catalog-info.yaml b/plugins/bui-themer/catalog-info.yaml new file mode 100644 index 0000000000..15e907a0ac --- /dev/null +++ b/plugins/bui-themer/catalog-info.yaml @@ -0,0 +1,9 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-plugin-bui-themer + title: '@backstage/plugin-bui-themer' +spec: + lifecycle: experimental + type: backstage-frontend-plugin + owner: maintainers diff --git a/plugins/bui-themer/dev/index.tsx b/plugins/bui-themer/dev/index.tsx new file mode 100644 index 0000000000..ce3986f7da --- /dev/null +++ b/plugins/bui-themer/dev/index.tsx @@ -0,0 +1,26 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createDevApp } from '@backstage/dev-utils'; +import { buiThemerPlugin, BuiThemerPage } from '../src/plugin'; + +createDevApp() + .registerPlugin(buiThemerPlugin) + .addPage({ + element: , + title: 'Root Page', + path: '/bui-themer', + }) + .render(); diff --git a/plugins/bui-themer/package.json b/plugins/bui-themer/package.json new file mode 100644 index 0000000000..c0d49b0879 --- /dev/null +++ b/plugins/bui-themer/package.json @@ -0,0 +1,53 @@ +{ + "name": "@backstage/plugin-bui-themer", + "version": "0.1.0", + "license": "Apache-2.0", + "private": true, + "main": "src/index.ts", + "types": "src/index.ts", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin", + "pluginId": "bui-themer" + }, + "sideEffects": false, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-components": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", + "@backstage/theme": "workspace:^", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.61", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/dev-utils": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.0.0", + "msw": "^1.0.0", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx b/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx new file mode 100644 index 0000000000..f5f7f185c5 --- /dev/null +++ b/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx @@ -0,0 +1,38 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExampleComponent } from './ExampleComponent'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { screen } from '@testing-library/react'; +import { registerMswTestHooks, renderInTestApp } from '@backstage/test-utils'; + +describe('ExampleComponent', () => { + const server = setupServer(); + // Enable sane handlers for network requests + registerMswTestHooks(server); + + // setup mock response + beforeEach(() => { + server.use( + rest.get('/*', (_, res, ctx) => res(ctx.status(200), ctx.json({}))), + ); + }); + + it('should render', async () => { + await renderInTestApp(); + expect(screen.getByText('Welcome to bui-themer!')).toBeInTheDocument(); + }); +}); diff --git a/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx b/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx new file mode 100644 index 0000000000..3a04bd7562 --- /dev/null +++ b/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx @@ -0,0 +1,52 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Typography, Grid } from '@material-ui/core'; +import { + InfoCard, + Header, + Page, + Content, + ContentHeader, + HeaderLabel, + SupportButton, +} from '@backstage/core-components'; +import { ExampleFetchComponent } from '../ExampleFetchComponent'; + +export const ExampleComponent = () => ( + +
+ + +
+ + + A description of your plugin goes here. + + + + + + All content should be wrapped in a card like this. + + + + + + + + +
+); diff --git a/plugins/bui-themer/src/components/ExampleComponent/index.ts b/plugins/bui-themer/src/components/ExampleComponent/index.ts new file mode 100644 index 0000000000..66b3fc6c97 --- /dev/null +++ b/plugins/bui-themer/src/components/ExampleComponent/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { ExampleComponent } from './ExampleComponent'; diff --git a/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx b/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx new file mode 100644 index 0000000000..a3085e3dcb --- /dev/null +++ b/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx @@ -0,0 +1,34 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { renderInTestApp } from '@backstage/test-utils'; +import { ExampleFetchComponent } from './ExampleFetchComponent'; + +describe('ExampleFetchComponent', () => { + it('renders the user table', async () => { + const { getAllByText, getByAltText, getByText, findByRole } = + await renderInTestApp(); + + // Wait for the table to render + const table = await findByRole('table'); + const nationality = getAllByText('GB'); + // Assert that the table contains the expected user data + expect(table).toBeInTheDocument(); + expect(getByAltText('Carolyn')).toBeInTheDocument(); + expect(getByText('Carolyn Moore')).toBeInTheDocument(); + expect(getByText('carolyn.moore@example.com')).toBeInTheDocument(); + expect(nationality[0]).toBeInTheDocument(); + }); +}); diff --git a/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx new file mode 100644 index 0000000000..6c9e77094d --- /dev/null +++ b/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx @@ -0,0 +1,322 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { makeStyles } from '@material-ui/core/styles'; +import { + Table, + TableColumn, + Progress, + ResponseErrorPanel, +} from '@backstage/core-components'; +import useAsync from 'react-use/lib/useAsync'; + +export const exampleUsers = { + results: [ + { + gender: 'female', + name: { + title: 'Miss', + first: 'Carolyn', + last: 'Moore', + }, + email: 'carolyn.moore@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Carolyn', + nat: 'GB', + }, + { + gender: 'female', + name: { + title: 'Ms', + first: 'Esma', + last: 'Berberoğlu', + }, + email: 'esma.berberoglu@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Esma', + nat: 'TR', + }, + { + gender: 'female', + name: { + title: 'Ms', + first: 'Isabella', + last: 'Rhodes', + }, + email: 'isabella.rhodes@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Isabella', + nat: 'GB', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Derrick', + last: 'Carter', + }, + email: 'derrick.carter@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Derrick', + nat: 'IE', + }, + { + gender: 'female', + name: { + title: 'Miss', + first: 'Mattie', + last: 'Lambert', + }, + email: 'mattie.lambert@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mattie', + nat: 'AU', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Mijat', + last: 'Rakić', + }, + email: 'mijat.rakic@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mijat', + nat: 'RS', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Javier', + last: 'Reid', + }, + email: 'javier.reid@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Javier', + nat: 'US', + }, + { + gender: 'female', + name: { + title: 'Ms', + first: 'Isabella', + last: 'Li', + }, + email: 'isabella.li@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Isabella', + nat: 'CA', + }, + { + gender: 'female', + name: { + title: 'Mrs', + first: 'Stephanie', + last: 'Garrett', + }, + email: 'stephanie.garrett@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Stephanie', + nat: 'AU', + }, + { + gender: 'female', + name: { + title: 'Ms', + first: 'Antonia', + last: 'Núñez', + }, + email: 'antonia.nunez@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Antonia', + nat: 'ES', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Donald', + last: 'Young', + }, + email: 'donald.young@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Donald', + nat: 'US', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Iegor', + last: 'Holodovskiy', + }, + email: 'iegor.holodovskiy@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Iegor', + nat: 'UA', + }, + { + gender: 'female', + name: { + title: 'Madame', + first: 'Jessica', + last: 'David', + }, + email: 'jessica.david@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Jessica', + nat: 'CH', + }, + { + gender: 'female', + name: { + title: 'Ms', + first: 'Eve', + last: 'Martinez', + }, + email: 'eve.martinez@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Eve', + nat: 'FR', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Caleb', + last: 'Silva', + }, + email: 'caleb.silva@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Caleb', + nat: 'US', + }, + { + gender: 'female', + name: { + title: 'Miss', + first: 'Marcia', + last: 'Jenkins', + }, + email: 'marcia.jenkins@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Marcia', + nat: 'US', + }, + { + gender: 'female', + name: { + title: 'Mrs', + first: 'Mackenzie', + last: 'Jones', + }, + email: 'mackenzie.jones@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mackenzie', + nat: 'NZ', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Jeremiah', + last: 'Gutierrez', + }, + email: 'jeremiah.gutierrez@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Jeremiah', + nat: 'AU', + }, + { + gender: 'female', + name: { + title: 'Ms', + first: 'Luciara', + last: 'Souza', + }, + email: 'luciara.souza@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Luciara', + nat: 'BR', + }, + { + gender: 'male', + name: { + title: 'Mr', + first: 'Valgi', + last: 'da Cunha', + }, + email: 'valgi.dacunha@example.com', + picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Valgi', + nat: 'BR', + }, + ], +}; + +const useStyles = makeStyles({ + avatar: { + height: 32, + width: 32, + borderRadius: '50%', + }, +}); + +type User = { + gender: string; // "male" + name: { + title: string; // "Mr", + first: string; // "Duane", + last: string; // "Reed" + }; + email: string; // "duane.reed@example.com" + picture: string; // "https://api.dicebear.com/6.x/open-peeps/svg?seed=Duane" + nat: string; // "AU" +}; + +type DenseTableProps = { + users: User[]; +}; + +export const DenseTable = ({ users }: DenseTableProps) => { + const classes = useStyles(); + + const columns: TableColumn[] = [ + { title: 'Avatar', field: 'avatar' }, + { title: 'Name', field: 'name' }, + { title: 'Email', field: 'email' }, + { title: 'Nationality', field: 'nationality' }, + ]; + + const data = users.map(user => { + return { + avatar: ( + {user.name.first} + ), + name: `${user.name.first} ${user.name.last}`, + email: user.email, + nationality: user.nat, + }; + }); + + return ( + + ); +}; + +export const ExampleFetchComponent = () => { + const { value, loading, error } = useAsync(async (): Promise => { + // Would use fetch in a real world example + return exampleUsers.results; + }, []); + + if (loading) { + return ; + } else if (error) { + return ; + } + + return ; +}; diff --git a/plugins/bui-themer/src/components/ExampleFetchComponent/index.ts b/plugins/bui-themer/src/components/ExampleFetchComponent/index.ts new file mode 100644 index 0000000000..b0be0a2a71 --- /dev/null +++ b/plugins/bui-themer/src/components/ExampleFetchComponent/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { ExampleFetchComponent } from './ExampleFetchComponent'; diff --git a/plugins/bui-themer/src/index.ts b/plugins/bui-themer/src/index.ts new file mode 100644 index 0000000000..26bc35ebb1 --- /dev/null +++ b/plugins/bui-themer/src/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { buiThemerPlugin, BuiThemerPage } from './plugin'; diff --git a/plugins/bui-themer/src/plugin.test.ts b/plugins/bui-themer/src/plugin.test.ts new file mode 100644 index 0000000000..b19adaf007 --- /dev/null +++ b/plugins/bui-themer/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { buiThemerPlugin } from './plugin'; + +describe('bui-themer', () => { + it('should export plugin', () => { + expect(buiThemerPlugin).toBeDefined(); + }); +}); diff --git a/plugins/bui-themer/src/plugin.ts b/plugins/bui-themer/src/plugin.ts new file mode 100644 index 0000000000..d87d035b12 --- /dev/null +++ b/plugins/bui-themer/src/plugin.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + createPlugin, + createRoutableExtension, +} from '@backstage/core-plugin-api'; + +import { rootRouteRef } from './routes'; + +export const buiThemerPlugin = createPlugin({ + id: 'bui-themer', + routes: { + root: rootRouteRef, + }, +}); + +export const BuiThemerPage = buiThemerPlugin.provide( + createRoutableExtension({ + name: 'BuiThemerPage', + component: () => + import('./components/ExampleComponent').then(m => m.ExampleComponent), + mountPoint: rootRouteRef, + }), +); diff --git a/plugins/bui-themer/src/routes.ts b/plugins/bui-themer/src/routes.ts new file mode 100644 index 0000000000..efd79e62be --- /dev/null +++ b/plugins/bui-themer/src/routes.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createRouteRef } from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'bui-themer', +}); diff --git a/plugins/bui-themer/src/setupTests.ts b/plugins/bui-themer/src/setupTests.ts new file mode 100644 index 0000000000..b57590b525 --- /dev/null +++ b/plugins/bui-themer/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import '@testing-library/jest-dom'; diff --git a/yarn.lock b/yarn.lock index c1a352407c..cb9a75fa61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4323,6 +4323,31 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-bui-themer@workspace:^, @backstage/plugin-bui-themer@workspace:plugins/bui-themer": + version: 0.0.0-use.local + resolution: "@backstage/plugin-bui-themer@workspace:plugins/bui-themer" + dependencies: + "@backstage/cli": "workspace:^" + "@backstage/core-app-api": "workspace:^" + "@backstage/core-components": "workspace:^" + "@backstage/core-plugin-api": "workspace:^" + "@backstage/dev-utils": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/theme": "workspace:^" + "@material-ui/core": "npm:^4.9.13" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:^4.0.0-alpha.61" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^14.0.0" + "@testing-library/user-event": "npm:^14.0.0" + msw: "npm:^1.0.0" + react: "npm:^16.13.1 || ^17.0.0 || ^18.0.0" + react-use: "npm:^17.2.4" + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + languageName: unknown + linkType: soft + "@backstage/plugin-catalog-backend-module-aws@workspace:plugins/catalog-backend-module-aws": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-aws@workspace:plugins/catalog-backend-module-aws" @@ -19238,6 +19263,22 @@ __metadata: languageName: node linkType: hard +"@testing-library/dom@npm:^9.0.0": + version: 9.3.4 + resolution: "@testing-library/dom@npm:9.3.4" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.1.3" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10/510da752ea76f4a10a0a4e3a77917b0302cf03effe576cd3534cab7e796533ee2b0e9fb6fb11b911a1ebd7c70a0bb6f235bf4f816c9b82b95b8fe0cddfd10975 + languageName: node + linkType: hard + "@testing-library/jest-dom@npm:^6.0.0, @testing-library/jest-dom@npm:^6.6.3": version: 6.8.0 resolution: "@testing-library/jest-dom@npm:6.8.0" @@ -19274,6 +19315,20 @@ __metadata: languageName: node linkType: hard +"@testing-library/react@npm:^14.0.0": + version: 14.3.1 + resolution: "@testing-library/react@npm:14.3.1" + dependencies: + "@babel/runtime": "npm:^7.12.5" + "@testing-library/dom": "npm:^9.0.0" + "@types/react-dom": "npm:^18.0.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10/83359dcdf9eaf067839f34604e1a181cbc14fc09f3a07672403700fcc6a900c4b8054ad1114fc24b4b9f89d84e2a09e1b7c9afce2306b1d4b4c9e30eb1cb12de + languageName: node + linkType: hard + "@testing-library/react@npm:^16.0.0": version: 16.3.0 resolution: "@testing-library/react@npm:16.3.0" @@ -23624,6 +23679,15 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: "npm:^2.0.5" + checksum: 10/e5da608a7c4954bfece2d879342b6c218b6b207e2d9e5af270b5e38ef8418f02d122afdc948b68e32649b849a38377785252059090d66fa8081da95d1609c0d2 + languageName: node + linkType: hard + "aria-query@npm:5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" @@ -23640,7 +23704,7 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: @@ -27393,6 +27457,32 @@ __metadata: languageName: node linkType: hard +"deep-equal@npm:^2.0.5": + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.5" + es-get-iterator: "npm:^1.1.3" + get-intrinsic: "npm:^1.2.2" + is-arguments: "npm:^1.1.1" + is-array-buffer: "npm:^3.0.2" + is-date-object: "npm:^1.0.5" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + isarray: "npm:^2.0.5" + object-is: "npm:^1.1.5" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + side-channel: "npm:^1.0.4" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.1" + which-typed-array: "npm:^1.1.13" + checksum: 10/1ce49d0b71d0f14d8ef991a742665eccd488dfc9b3cada069d4d7a86291e591c92d2589c832811dea182b4015736b210acaaebce6184be356c1060d176f5a05f + languageName: node + linkType: hard + "deep-equal@npm:~1.0.1": version: 1.0.1 resolution: "deep-equal@npm:1.0.1" @@ -28611,7 +28701,7 @@ __metadata: languageName: node linkType: hard -"es-get-iterator@npm:^1.0.2": +"es-get-iterator@npm:^1.0.2, es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" dependencies: @@ -29663,6 +29753,7 @@ __metadata: "@backstage/integration-react": "workspace:^" "@backstage/plugin-api-docs": "workspace:^" "@backstage/plugin-auth-react": "workspace:^" + "@backstage/plugin-bui-themer": "workspace:^" "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-graph": "workspace:^" @@ -31215,7 +31306,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" dependencies: @@ -33148,7 +33239,7 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": version: 3.0.5 resolution: "is-array-buffer@npm:3.0.5" dependencies: @@ -33621,7 +33712,7 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.2.1": +"is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" dependencies: @@ -33670,7 +33761,7 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.4": +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.4": version: 1.0.4 resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: @@ -43096,6 +43187,15 @@ __metadata: languageName: node linkType: hard +"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0, react@npm:^18.0.2": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10/261137d3f3993eaa2368a83110466fc0e558bc2c7f7ae7ca52d94f03aac945f45146bd85e5f481044db1758a1dbb57879e2fcdd33924e2dde1bdc550ce73f7bf + languageName: node + linkType: hard + "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": version: 19.1.1 resolution: "react@npm:19.1.1" @@ -43113,15 +43213,6 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.0.2": - version: 18.3.1 - resolution: "react@npm:18.3.1" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10/261137d3f3993eaa2368a83110466fc0e558bc2c7f7ae7ca52d94f03aac945f45146bd85e5f481044db1758a1dbb57879e2fcdd33924e2dde1bdc550ce73f7bf - languageName: node - linkType: hard - "read-cmd-shim@npm:^2.0.0": version: 2.0.0 resolution: "read-cmd-shim@npm:2.0.0" @@ -43396,7 +43487,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.3": +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -44905,7 +44996,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": version: 1.1.0 resolution: "side-channel@npm:1.1.0" dependencies: @@ -49105,7 +49196,7 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": +"which-boxed-primitive@npm:^1.0.2, which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" dependencies: @@ -49139,7 +49230,7 @@ __metadata: languageName: node linkType: hard -"which-collection@npm:^1.0.2": +"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2": version: 1.0.2 resolution: "which-collection@npm:1.0.2" dependencies: @@ -49161,7 +49252,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": version: 1.1.19 resolution: "which-typed-array@npm:1.1.19" dependencies: From 501b159de42bde4a06769f19653dafc51fa15948 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Sep 2025 19:03:54 +0200 Subject: [PATCH 119/177] bui-themer: trim example components and add NFS support Signed-off-by: Patrik Oldsberg --- plugins/bui-themer/package.json | 2 + .../BuiThemerPage.tsx} | 5 +- .../index.ts | 3 +- .../ExampleComponent.test.tsx | 38 --- .../ExampleComponent/ExampleComponent.tsx | 52 --- .../ExampleFetchComponent.test.tsx | 34 -- .../ExampleFetchComponent.tsx | 322 ------------------ plugins/bui-themer/src/index.ts | 2 + .../bui-themer/src/{plugin.ts => plugin.tsx} | 31 +- yarn.lock | 2 + 10 files changed, 41 insertions(+), 450 deletions(-) rename plugins/bui-themer/src/components/{ExampleFetchComponent/index.ts => BuiThemerPage/BuiThemerPage.tsx} (90%) rename plugins/bui-themer/src/components/{ExampleComponent => BuiThemerPage}/index.ts (91%) delete mode 100644 plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx delete mode 100644 plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx delete mode 100644 plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx delete mode 100644 plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx rename plugins/bui-themer/src/{plugin.ts => plugin.tsx} (59%) diff --git a/plugins/bui-themer/package.json b/plugins/bui-themer/package.json index c0d49b0879..f6f5faffd4 100644 --- a/plugins/bui-themer/package.json +++ b/plugins/bui-themer/package.json @@ -25,8 +25,10 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { + "@backstage/core-compat-api": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", diff --git a/plugins/bui-themer/src/components/ExampleFetchComponent/index.ts b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx similarity index 90% rename from plugins/bui-themer/src/components/ExampleFetchComponent/index.ts rename to plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index b0be0a2a71..0328a3e6d6 100644 --- a/plugins/bui-themer/src/components/ExampleFetchComponent/index.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -13,4 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { ExampleFetchComponent } from './ExampleFetchComponent'; + +export function BuiThemerPage() { + return
TODO
; +} diff --git a/plugins/bui-themer/src/components/ExampleComponent/index.ts b/plugins/bui-themer/src/components/BuiThemerPage/index.ts similarity index 91% rename from plugins/bui-themer/src/components/ExampleComponent/index.ts rename to plugins/bui-themer/src/components/BuiThemerPage/index.ts index 66b3fc6c97..3d32f11259 100644 --- a/plugins/bui-themer/src/components/ExampleComponent/index.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { ExampleComponent } from './ExampleComponent'; + +export { BuiThemerPage } from './BuiThemerPage'; diff --git a/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx b/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx deleted file mode 100644 index f5f7f185c5..0000000000 --- a/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.test.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ExampleComponent } from './ExampleComponent'; -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; -import { screen } from '@testing-library/react'; -import { registerMswTestHooks, renderInTestApp } from '@backstage/test-utils'; - -describe('ExampleComponent', () => { - const server = setupServer(); - // Enable sane handlers for network requests - registerMswTestHooks(server); - - // setup mock response - beforeEach(() => { - server.use( - rest.get('/*', (_, res, ctx) => res(ctx.status(200), ctx.json({}))), - ); - }); - - it('should render', async () => { - await renderInTestApp(); - expect(screen.getByText('Welcome to bui-themer!')).toBeInTheDocument(); - }); -}); diff --git a/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx b/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx deleted file mode 100644 index 3a04bd7562..0000000000 --- a/plugins/bui-themer/src/components/ExampleComponent/ExampleComponent.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Typography, Grid } from '@material-ui/core'; -import { - InfoCard, - Header, - Page, - Content, - ContentHeader, - HeaderLabel, - SupportButton, -} from '@backstage/core-components'; -import { ExampleFetchComponent } from '../ExampleFetchComponent'; - -export const ExampleComponent = () => ( - -
- - -
- - - A description of your plugin goes here. - - - - - - All content should be wrapped in a card like this. - - - - - - - - -
-); diff --git a/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx b/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx deleted file mode 100644 index a3085e3dcb..0000000000 --- a/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { renderInTestApp } from '@backstage/test-utils'; -import { ExampleFetchComponent } from './ExampleFetchComponent'; - -describe('ExampleFetchComponent', () => { - it('renders the user table', async () => { - const { getAllByText, getByAltText, getByText, findByRole } = - await renderInTestApp(); - - // Wait for the table to render - const table = await findByRole('table'); - const nationality = getAllByText('GB'); - // Assert that the table contains the expected user data - expect(table).toBeInTheDocument(); - expect(getByAltText('Carolyn')).toBeInTheDocument(); - expect(getByText('Carolyn Moore')).toBeInTheDocument(); - expect(getByText('carolyn.moore@example.com')).toBeInTheDocument(); - expect(nationality[0]).toBeInTheDocument(); - }); -}); diff --git a/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx deleted file mode 100644 index 6c9e77094d..0000000000 --- a/plugins/bui-themer/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright 2025 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { makeStyles } from '@material-ui/core/styles'; -import { - Table, - TableColumn, - Progress, - ResponseErrorPanel, -} from '@backstage/core-components'; -import useAsync from 'react-use/lib/useAsync'; - -export const exampleUsers = { - results: [ - { - gender: 'female', - name: { - title: 'Miss', - first: 'Carolyn', - last: 'Moore', - }, - email: 'carolyn.moore@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Carolyn', - nat: 'GB', - }, - { - gender: 'female', - name: { - title: 'Ms', - first: 'Esma', - last: 'Berberoğlu', - }, - email: 'esma.berberoglu@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Esma', - nat: 'TR', - }, - { - gender: 'female', - name: { - title: 'Ms', - first: 'Isabella', - last: 'Rhodes', - }, - email: 'isabella.rhodes@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Isabella', - nat: 'GB', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Derrick', - last: 'Carter', - }, - email: 'derrick.carter@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Derrick', - nat: 'IE', - }, - { - gender: 'female', - name: { - title: 'Miss', - first: 'Mattie', - last: 'Lambert', - }, - email: 'mattie.lambert@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mattie', - nat: 'AU', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Mijat', - last: 'Rakić', - }, - email: 'mijat.rakic@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mijat', - nat: 'RS', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Javier', - last: 'Reid', - }, - email: 'javier.reid@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Javier', - nat: 'US', - }, - { - gender: 'female', - name: { - title: 'Ms', - first: 'Isabella', - last: 'Li', - }, - email: 'isabella.li@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Isabella', - nat: 'CA', - }, - { - gender: 'female', - name: { - title: 'Mrs', - first: 'Stephanie', - last: 'Garrett', - }, - email: 'stephanie.garrett@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Stephanie', - nat: 'AU', - }, - { - gender: 'female', - name: { - title: 'Ms', - first: 'Antonia', - last: 'Núñez', - }, - email: 'antonia.nunez@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Antonia', - nat: 'ES', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Donald', - last: 'Young', - }, - email: 'donald.young@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Donald', - nat: 'US', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Iegor', - last: 'Holodovskiy', - }, - email: 'iegor.holodovskiy@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Iegor', - nat: 'UA', - }, - { - gender: 'female', - name: { - title: 'Madame', - first: 'Jessica', - last: 'David', - }, - email: 'jessica.david@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Jessica', - nat: 'CH', - }, - { - gender: 'female', - name: { - title: 'Ms', - first: 'Eve', - last: 'Martinez', - }, - email: 'eve.martinez@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Eve', - nat: 'FR', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Caleb', - last: 'Silva', - }, - email: 'caleb.silva@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Caleb', - nat: 'US', - }, - { - gender: 'female', - name: { - title: 'Miss', - first: 'Marcia', - last: 'Jenkins', - }, - email: 'marcia.jenkins@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Marcia', - nat: 'US', - }, - { - gender: 'female', - name: { - title: 'Mrs', - first: 'Mackenzie', - last: 'Jones', - }, - email: 'mackenzie.jones@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Mackenzie', - nat: 'NZ', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Jeremiah', - last: 'Gutierrez', - }, - email: 'jeremiah.gutierrez@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Jeremiah', - nat: 'AU', - }, - { - gender: 'female', - name: { - title: 'Ms', - first: 'Luciara', - last: 'Souza', - }, - email: 'luciara.souza@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Luciara', - nat: 'BR', - }, - { - gender: 'male', - name: { - title: 'Mr', - first: 'Valgi', - last: 'da Cunha', - }, - email: 'valgi.dacunha@example.com', - picture: 'https://api.dicebear.com/6.x/open-peeps/svg?seed=Valgi', - nat: 'BR', - }, - ], -}; - -const useStyles = makeStyles({ - avatar: { - height: 32, - width: 32, - borderRadius: '50%', - }, -}); - -type User = { - gender: string; // "male" - name: { - title: string; // "Mr", - first: string; // "Duane", - last: string; // "Reed" - }; - email: string; // "duane.reed@example.com" - picture: string; // "https://api.dicebear.com/6.x/open-peeps/svg?seed=Duane" - nat: string; // "AU" -}; - -type DenseTableProps = { - users: User[]; -}; - -export const DenseTable = ({ users }: DenseTableProps) => { - const classes = useStyles(); - - const columns: TableColumn[] = [ - { title: 'Avatar', field: 'avatar' }, - { title: 'Name', field: 'name' }, - { title: 'Email', field: 'email' }, - { title: 'Nationality', field: 'nationality' }, - ]; - - const data = users.map(user => { - return { - avatar: ( - {user.name.first} - ), - name: `${user.name.first} ${user.name.last}`, - email: user.email, - nationality: user.nat, - }; - }); - - return ( -
- ); -}; - -export const ExampleFetchComponent = () => { - const { value, loading, error } = useAsync(async (): Promise => { - // Would use fetch in a real world example - return exampleUsers.results; - }, []); - - if (loading) { - return ; - } else if (error) { - return ; - } - - return ; -}; diff --git a/plugins/bui-themer/src/index.ts b/plugins/bui-themer/src/index.ts index 26bc35ebb1..4cf05a7f23 100644 --- a/plugins/bui-themer/src/index.ts +++ b/plugins/bui-themer/src/index.ts @@ -13,4 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export { buiThemerPlugin, BuiThemerPage } from './plugin'; +export { default } from './plugin'; diff --git a/plugins/bui-themer/src/plugin.ts b/plugins/bui-themer/src/plugin.tsx similarity index 59% rename from plugins/bui-themer/src/plugin.ts rename to plugins/bui-themer/src/plugin.tsx index d87d035b12..78d3196126 100644 --- a/plugins/bui-themer/src/plugin.ts +++ b/plugins/bui-themer/src/plugin.tsx @@ -13,13 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import { + convertLegacyRouteRef, + convertLegacyRouteRefs, +} from '@backstage/core-compat-api'; import { createPlugin, createRoutableExtension, } from '@backstage/core-plugin-api'; - +import { + createFrontendPlugin, + PageBlueprint, +} from '@backstage/frontend-plugin-api'; import { rootRouteRef } from './routes'; +// Old system export const buiThemerPlugin = createPlugin({ id: 'bui-themer', routes: { @@ -31,7 +40,25 @@ export const BuiThemerPage = buiThemerPlugin.provide( createRoutableExtension({ name: 'BuiThemerPage', component: () => - import('./components/ExampleComponent').then(m => m.ExampleComponent), + import('./components/BuiThemerPage').then(m => m.BuiThemerPage), mountPoint: rootRouteRef, }), ); + +// New system +export default createFrontendPlugin({ + pluginId: 'bui-themer', + extensions: [ + PageBlueprint.make({ + params: { + path: '/bui-themer', + loader: () => + import('./components/BuiThemerPage').then(m => ), + routeRef: convertLegacyRouteRef(rootRouteRef), + }, + }), + ], + routes: convertLegacyRouteRefs({ + root: rootRouteRef, + }), +}); diff --git a/yarn.lock b/yarn.lock index cb9a75fa61..f22d88ee20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4329,9 +4329,11 @@ __metadata: dependencies: "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" + "@backstage/core-compat-api": "workspace:^" "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" + "@backstage/frontend-plugin-api": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@material-ui/core": "npm:^4.9.13" From c56cb0460e6abdeec4e38aae8d61931d0e4b3748 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Sep 2025 19:11:20 +0200 Subject: [PATCH 120/177] bui-themer: add implementation plan Signed-off-by: Patrik Oldsberg --- .../components/BuiThemerPage/BuiThemerPage.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 0328a3e6d6..8fb72eda1c 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -14,6 +14,21 @@ * limitations under the License. */ +/* + +IMPLEMENTATION PLAN: + +- create a utility that converts the MUI theme palette into printed CSS variables +populating the variables in packages/ui/src/css/core.css +- the conversion utility will be created in an adjacent `convertMuiToBuiTheme` file, which defines a `convertMuiToBuiTheme` function that accepts a MUI theme instance and returns CSS in text format +- create tests for the conversion utility +- Create a page that shows the generated CSS variables and allows the user to copy them +- The page should show coverted CSS variables for all installed themes in the app, which can be acquired via the AppThemeApi, defined at packages/core-plugin-api/src/apis/definitions/AppThemeApi.ts +- The AppThemeApi can be accessed via the useApi(appThemeApiRef) hook +- The app themes only provide a `Provider` component that in turn provides the MUI theme. The theme can be accessed by wrapping the component in the theme's `Provider` component and then using the `useTheme` hook from MUI + +*/ + export function BuiThemerPage() { return
TODO
; } From 05ff15d1c0bee41d9e3ac4219c4c142d42e31541 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Sep 2025 19:20:54 +0200 Subject: [PATCH 121/177] bui-themer: refined implementation plan Signed-off-by: Patrik Oldsberg --- .../BuiThemerPage/BuiThemerPage.tsx | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 8fb72eda1c..2da27cad36 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -18,14 +18,36 @@ IMPLEMENTATION PLAN: -- create a utility that converts the MUI theme palette into printed CSS variables -populating the variables in packages/ui/src/css/core.css -- the conversion utility will be created in an adjacent `convertMuiToBuiTheme` file, which defines a `convertMuiToBuiTheme` function that accepts a MUI theme instance and returns CSS in text format -- create tests for the conversion utility -- Create a page that shows the generated CSS variables and allows the user to copy them -- The page should show coverted CSS variables for all installed themes in the app, which can be acquired via the AppThemeApi, defined at packages/core-plugin-api/src/apis/definitions/AppThemeApi.ts -- The AppThemeApi can be accessed via the useApi(appThemeApiRef) hook -- The app themes only provide a `Provider` component that in turn provides the MUI theme. The theme can be accessed by wrapping the component in the theme's `Provider` component and then using the `useTheme` hook from MUI +- Create a converter utility that maps a MUI v5 `Theme` to BUI CSS variables, + covering palette, typography, spacing, and shape tokens to match + `packages/ui/src/css/core.css`. +- Place it in an adjacent `convertMuiToBuiTheme.ts` file exporting + `convertMuiToBuiTheme(theme: Theme, options?): string`, returning + deterministic CSS text. +- Scope output blocks as: + - `:root { ... }` for light themes + - `[data-theme-mode='dark'] { ... }` for dark themes + Optionally prefix by theme id (e.g. `[data-app-theme='']`) so multiple + theme blocks can coexist without conflicts. +- Do not modify `packages/ui/src/css/core.css`; generate CSS for copy/download + only. +- Define a mapping from MUI fields to `--bui-*` tokens with sensible fallbacks + aligning with core defaults. Handle success/warning/error/background/text + surfaces, borders, and link/hover states. +- Add tests for light/dark and fallback behavior using MUI `createTheme` and + snapshot the generated CSS. +- Build the page to list all installed themes via `useApi(appThemeApiRef)`, + render a minimal child under each theme `Provider`, and read `useTheme()` to + get the runtime theme instance. Provide Copy and Download actions and an + optional live preview applying the generated variables. +- Performance: memoize generated CSS by theme id and regenerate when the + installed theme list changes. Observing `activeThemeId$()` is optional unless + previewing the active theme. + +REQUIREMENTS: + +- No changes can be made outside the plugins/bui-themer/src directory +- Only components from the `@backstage/ui` package at `packages/ui` can be used */ From 6262191013b65f95fb8d2d49089b880621c51ac6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Sep 2025 19:46:05 +0200 Subject: [PATCH 122/177] bui-themer: initial implementation plan execution Signed-off-by: Patrik Oldsberg --- plugins/bui-themer/package.json | 2 + .../BuiThemerPage/BuiThemerPage.tsx | 297 ++++++++++++++++-- .../convertMuiToBuiTheme.test.ts | 278 ++++++++++++++++ .../BuiThemerPage/convertMuiToBuiTheme.ts | 286 +++++++++++++++++ yarn.lock | 185 ++++++++++- 5 files changed, 1015 insertions(+), 33 deletions(-) create mode 100644 plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts create mode 100644 plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts diff --git a/plugins/bui-themer/package.json b/plugins/bui-themer/package.json index f6f5faffd4..ff97c92ecb 100644 --- a/plugins/bui-themer/package.json +++ b/plugins/bui-themer/package.json @@ -30,9 +30,11 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", "@backstage/theme": "workspace:^", + "@backstage/ui": "workspace:^", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.61", + "@mui/material": "^7.3.2", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 2da27cad36..b36c550081 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -14,43 +14,276 @@ * limitations under the License. */ -/* +import { useMemo, useState, useCallback, useEffect } from 'react'; +import { useApi } from '@backstage/core-plugin-api'; +import { appThemeApiRef } from '@backstage/core-plugin-api'; +import { useTheme } from '@mui/material/styles'; +import { + Box, + Button, + Card, + Container, + Flex, + Grid, + HeaderPage, + Text, + TextField, + Switch, +} from '@backstage/ui'; +import { + convertMuiToBuiTheme, + ConvertMuiToBuiThemeOptions, +} from './convertMuiToBuiTheme'; -IMPLEMENTATION PLAN: +interface ThemePreviewProps { + themeId: string; + themeTitle: string; + variant: 'light' | 'dark'; + Provider: React.ComponentType<{ children: React.ReactNode }>; +} -- Create a converter utility that maps a MUI v5 `Theme` to BUI CSS variables, - covering palette, typography, spacing, and shape tokens to match - `packages/ui/src/css/core.css`. -- Place it in an adjacent `convertMuiToBuiTheme.ts` file exporting - `convertMuiToBuiTheme(theme: Theme, options?): string`, returning - deterministic CSS text. -- Scope output blocks as: - - `:root { ... }` for light themes - - `[data-theme-mode='dark'] { ... }` for dark themes - Optionally prefix by theme id (e.g. `[data-app-theme='']`) so multiple - theme blocks can coexist without conflicts. -- Do not modify `packages/ui/src/css/core.css`; generate CSS for copy/download - only. -- Define a mapping from MUI fields to `--bui-*` tokens with sensible fallbacks - aligning with core defaults. Handle success/warning/error/background/text - surfaces, borders, and link/hover states. -- Add tests for light/dark and fallback behavior using MUI `createTheme` and - snapshot the generated CSS. -- Build the page to list all installed themes via `useApi(appThemeApiRef)`, - render a minimal child under each theme `Provider`, and read `useTheme()` to - get the runtime theme instance. Provide Copy and Download actions and an - optional live preview applying the generated variables. -- Performance: memoize generated CSS by theme id and regenerate when the - installed theme list changes. Observing `activeThemeId$()` is optional unless - previewing the active theme. +// Memoization cache for generated CSS +const cssCache = new Map(); -REQUIREMENTS: +interface ThemeContentProps { + themeId: string; + themeTitle: string; + variant: 'light' | 'dark'; +} -- No changes can be made outside the plugins/bui-themer/src directory -- Only components from the `@backstage/ui` package at `packages/ui` can be used +function ThemeContent({ themeId, themeTitle, variant }: ThemeContentProps) { + const [generatedCss, setGeneratedCss] = useState(''); + const [isPreviewMode, setIsPreviewMode] = useState(false); + const [includeThemeId, setIncludeThemeId] = useState(false); + const muiTheme = useTheme(); -*/ + const css = useMemo(() => { + // Create cache key based on theme properties and options + const cacheKey = `${themeId}-${includeThemeId}-${JSON.stringify({ + palette: muiTheme.palette, + typography: muiTheme.typography, + spacing: muiTheme.spacing, + shape: muiTheme.shape, + })}`; + + // Check cache first + if (cssCache.has(cacheKey)) { + return cssCache.get(cacheKey)!; + } + + const options: ConvertMuiToBuiThemeOptions = { + themeId, + includeThemeId, + }; + const result = convertMuiToBuiTheme(muiTheme, options); + + // Cache the result + cssCache.set(cacheKey, result); + + // Clean up old cache entries (keep only last 50) + if (cssCache.size > 50) { + const firstKey = cssCache.keys().next().value; + if (firstKey) { + cssCache.delete(firstKey); + } + } + + return result; + }, [muiTheme, themeId, includeThemeId]); + + useEffect(() => { + setGeneratedCss(css); + }, [css]); + + const handleCopy = useCallback(() => { + window.navigator.clipboard.writeText(generatedCss); + }, [generatedCss]); + + const handleDownload = useCallback(() => { + const blob = new Blob([generatedCss], { type: 'text/css' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `bui-theme-${themeId}.css`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, [generatedCss, themeId]); + + const handlePreviewToggle = useCallback(() => { + setIsPreviewMode(!isPreviewMode); + if (!isPreviewMode) { + // Apply the generated CSS to a style element + const styleId = `bui-theme-preview-${themeId}`; + let styleElement = document.getElementById(styleId); + if (!styleElement) { + styleElement = document.createElement('style'); + styleElement.id = styleId; + document.head.appendChild(styleElement); + } + styleElement.textContent = generatedCss; + } else { + // Remove the preview styles + const styleElement = document.getElementById( + `bui-theme-preview-${themeId}`, + ); + if (styleElement) { + styleElement.remove(); + } + } + }, [isPreviewMode, generatedCss, themeId]); + + return ( + + + + + {themeTitle} + + {variant} theme + + + + + + + + + + + + + + + + Generated CSS: + + + + + {isPreviewMode && ( + + + Live Preview: + + + Solid Button + + + Tint Button + + + Surface Card + + + )} + + + + ); +} + +function ThemePreview({ + themeId, + themeTitle, + variant, + Provider, +}: ThemePreviewProps) { + return ( + + + + ); +} export function BuiThemerPage() { - return
TODO
; + const appThemeApi = useApi(appThemeApiRef); + const installedThemes = appThemeApi.getInstalledThemes(); + + return ( + + + + + Convert MUI v5 themes to BUI CSS variables. Select a theme to generate + the corresponding BUI CSS variables that can be copied or downloaded. + + + + + {installedThemes.length === 0 ? ( + + + + No themes found. Please install some themes in your Backstage + app. + + + + ) : ( + + {installedThemes.map(theme => ( + + + + ))} + + )} + + + ); } diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts new file mode 100644 index 0000000000..e45f48f3a0 --- /dev/null +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts @@ -0,0 +1,278 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createTheme } from '@mui/material/styles'; +import { convertMuiToBuiTheme } from './convertMuiToBuiTheme'; + +describe('convertMuiToBuiTheme', () => { + it('should generate CSS for light theme', () => { + const theme = createTheme({ + palette: { + mode: 'light', + primary: { + main: '#1976d2', + dark: '#115293', + }, + background: { + default: '#f5f5f5', + paper: '#ffffff', + }, + text: { + primary: '#000000', + secondary: '#666666', + }, + }, + typography: { + fontFamily: 'Roboto, sans-serif', + h1: { + fontSize: '2.5rem', + }, + body1: { + fontSize: '1rem', + }, + }, + spacing: 8, + shape: { + borderRadius: 4, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain(':root {'); + expect(result).toContain('--bui-font-regular: Roboto, sans-serif;'); + expect(result).toContain('--bui-space: 8px;'); + expect(result).toContain('--bui-radius-3: 4px;'); + expect(result).toContain('--bui-bg: #f5f5f5;'); + expect(result).toContain('--bui-bg-surface-1: #ffffff;'); + expect(result).toContain('--bui-fg-primary: #000000;'); + expect(result).toContain('--bui-fg-secondary: #666666;'); + expect(result).toContain('--bui-bg-solid: #1976d2;'); + }); + + it('should generate CSS for dark theme', () => { + const theme = createTheme({ + palette: { + mode: 'dark', + primary: { + main: '#90caf9', + dark: '#42a5f5', + }, + background: { + default: '#121212', + paper: '#1e1e1e', + }, + text: { + primary: '#ffffff', + secondary: '#b3b3b3', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain("[data-theme-mode='dark'] {"); + expect(result).toContain('--bui-bg: #121212;'); + expect(result).toContain('--bui-bg-surface-1: #1e1e1e;'); + expect(result).toContain('--bui-fg-primary: #ffffff;'); + expect(result).toContain('--bui-fg-secondary: #b3b3b3;'); + }); + + it('should include theme ID scoping when requested', () => { + const theme = createTheme({ + palette: { + mode: 'light', + primary: { + main: '#1976d2', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme, { + themeId: 'my-theme', + includeThemeId: true, + }); + + expect(result).toContain("[data-app-theme='my-theme'] :root {"); + }); + + it('should handle missing theme properties gracefully', () => { + const theme = createTheme({}); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain(':root {'); + expect(result).toContain('--bui-font-weight-regular: 400;'); + expect(result).toContain('--bui-font-weight-bold: 700;'); + // Should have default values even when theme properties are missing + expect(result).toContain('--bui-black: #000;'); + expect(result).toContain('--bui-white: #fff;'); + }); + + it('should generate proper gray scale for light theme', () => { + const theme = createTheme({ + palette: { + mode: 'light', + primary: { + main: '#1976d2', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-gray-1: #f8f8f8;'); + expect(result).toContain('--bui-gray-8: #595959;'); + }); + + it('should generate proper gray scale for dark theme', () => { + const theme = createTheme({ + palette: { + mode: 'dark', + primary: { + main: '#90caf9', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-gray-1: #191919;'); + expect(result).toContain('--bui-gray-8: #b4b4b4;'); + }); + + it('should generate surface colors correctly', () => { + const theme = createTheme({ + palette: { + mode: 'light', + primary: { + main: '#1976d2', + dark: '#115293', + }, + error: { + main: '#f44336', + light: '#ffcdd2', + }, + warning: { + main: '#ff9800', + light: '#ffe0b2', + }, + success: { + main: '#4caf50', + light: '#c8e6c9', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-bg-solid: #1976d2;'); + expect(result).toContain('--bui-bg-solid-hover: #115293;'); + expect(result).toContain('--bui-bg-danger: #ffcdd2;'); + expect(result).toContain('--bui-bg-warning: #ffe0b2;'); + expect(result).toContain('--bui-bg-success: #c8e6c9;'); + }); + + it('should generate foreground colors correctly', () => { + const theme = createTheme({ + palette: { + mode: 'light', + primary: { + main: '#1976d2', + dark: '#115293', + }, + error: { + main: '#f44336', + }, + warning: { + main: '#ff9800', + }, + success: { + main: '#4caf50', + }, + text: { + disabled: '#cccccc', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-fg-link: #1976d2;'); + expect(result).toContain('--bui-fg-link-hover: #115293;'); + expect(result).toContain('--bui-fg-disabled: #cccccc;'); + expect(result).toContain('--bui-fg-danger: #f44336;'); + expect(result).toContain('--bui-fg-warning: #ff9800;'); + expect(result).toContain('--bui-fg-success: #4caf50;'); + }); + + it('should generate border colors correctly', () => { + const theme = createTheme({ + palette: { + mode: 'light', + error: { + main: '#f44336', + }, + warning: { + main: '#ff9800', + }, + success: { + main: '#4caf50', + }, + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-border: rgba(0, 0, 0, 0.1);'); + expect(result).toContain('--bui-border-hover: rgba(0, 0, 0, 0.2);'); + expect(result).toContain('--bui-border-danger: #f44336;'); + expect(result).toContain('--bui-border-warning: #ff9800;'); + expect(result).toContain('--bui-border-success: #4caf50;'); + }); + + it('should handle function-based spacing', () => { + const theme = createTheme({ + spacing: (factor: number) => `${factor * 4}px`, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-space: 4px;'); + }); + + it('should handle string-based spacing', () => { + const theme = createTheme({ + spacing: '8px', + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-space: calc(1 * 8px);'); + }); + + it('should handle string-based border radius', () => { + const theme = createTheme({ + shape: { + borderRadius: '8px', + }, + }); + + const result = convertMuiToBuiTheme(theme); + + expect(result).toContain('--bui-radius-3: 8px;'); + }); +}); diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts new file mode 100644 index 0000000000..e1f1618760 --- /dev/null +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts @@ -0,0 +1,286 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Theme as Mui5Theme } from '@mui/material/styles'; + +export interface ConvertMuiToBuiThemeOptions { + /** + * Theme ID to use for scoping CSS variables + */ + themeId?: string; + /** + * Whether to include theme ID scoping in the CSS + */ + includeThemeId?: boolean; +} + +/** + * Converts a MUI v5 Theme to BUI CSS variables + * @param theme - The MUI v5 theme to convert + * @param options - Conversion options + * @returns CSS string with BUI variables + */ +export function convertMuiToBuiTheme( + theme: Mui5Theme, + options: ConvertMuiToBuiThemeOptions = {}, +): string { + const { themeId, includeThemeId = false } = options; + const isDark = theme.palette.mode === 'dark'; + + // Generate CSS variables based on theme + const variables = generateBuiVariables(theme); + + // Create CSS selector based on theme mode and ID + let selector = isDark ? "[data-theme-mode='dark']" : ':root'; + if (includeThemeId && themeId) { + selector = `[data-app-theme='${themeId}'] ${selector}`; + } + + return `${selector} {\n${variables}\n}`; +} + +/** + * Generates BUI CSS variables from MUI theme + */ +function generateBuiVariables(theme: Mui5Theme): string { + const variables: string[] = []; + + // Font families + if (theme.typography.fontFamily) { + variables.push(` --bui-font-regular: ${theme.typography.fontFamily};`); + } + + // Font weights + variables.push( + ` --bui-font-weight-regular: ${ + theme.typography.fontWeightRegular || 400 + };`, + ); + variables.push( + ` --bui-font-weight-bold: ${theme.typography.fontWeightBold || 600};`, + ); + + // Font sizes - map MUI typography scale to BUI scale + const fontSizeMap = { + h1: '--bui-font-size-10', + h2: '--bui-font-size-8', + h3: '--bui-font-size-7', + h4: '--bui-font-size-6', + h5: '--bui-font-size-5', + h6: '--bui-font-size-4', + body1: '--bui-font-size-4', + body2: '--bui-font-size-3', + caption: '--bui-font-size-2', + overline: '--bui-font-size-1', + }; + + Object.entries(fontSizeMap).forEach(([muiKey, buiVar]) => { + const typographyVariant = + theme.typography[muiKey as keyof typeof theme.typography]; + const fontSize = + typeof typographyVariant === 'object' && typographyVariant?.fontSize + ? typographyVariant.fontSize + : undefined; + if (fontSize) { + variables.push(` ${buiVar}: ${fontSize};`); + } + }); + + // Spacing - map MUI spacing to BUI spacing scale + if (theme.spacing) { + const spacingUnit = + typeof theme.spacing === 'function' ? theme.spacing(1) : theme.spacing; + const spacingValue = + typeof spacingUnit === 'number' ? `${spacingUnit}px` : spacingUnit; + variables.push(` --bui-space: ${spacingValue};`); + } + + // Border radius + if (theme.shape?.borderRadius) { + const radius = theme.shape.borderRadius; + const radiusValue = typeof radius === 'number' ? `${radius}px` : radius; + variables.push(` --bui-radius-3: ${radiusValue};`); + } + + // Colors - map MUI palette to BUI color tokens + const palette = theme.palette; + + // Base colors + if (palette.common?.black) { + variables.push(` --bui-black: ${palette.common.black};`); + } + if (palette.common?.white) { + variables.push(` --bui-white: ${palette.common.white};`); + } + + // Gray scale - generate from primary color or use defaults + const grayScale = generateGrayScale(palette.mode === 'dark'); + Object.entries(grayScale).forEach(([key, value]) => { + variables.push(` --bui-gray-${key}: ${value};`); + }); + + // Background colors + if (palette.background?.default) { + variables.push(` --bui-bg: ${palette.background.default};`); + } + if (palette.background?.paper) { + variables.push(` --bui-bg-surface-1: ${palette.background.paper};`); + } + + // Generate surface colors + const surfaceColors = generateSurfaceColors(palette); + Object.entries(surfaceColors).forEach(([key, value]) => { + variables.push(` --bui-bg-${key}: ${value};`); + }); + + // Foreground colors + if (palette.text?.primary) { + variables.push(` --bui-fg-primary: ${palette.text.primary};`); + } + if (palette.text?.secondary) { + variables.push(` --bui-fg-secondary: ${palette.text.secondary};`); + } + + // Generate foreground colors + const foregroundColors = generateForegroundColors(palette); + Object.entries(foregroundColors).forEach(([key, value]) => { + variables.push(` --bui-fg-${key}: ${value};`); + }); + + // Border colors + const borderColors = generateBorderColors(palette); + Object.entries(borderColors).forEach(([key, value]) => { + variables.push(` --bui-border${key ? `-${key}` : ''}: ${value};`); + }); + + // Special colors + if (palette.primary?.main) { + variables.push(` --bui-ring: ${palette.primary.main};`); + } + + return variables.join('\n'); +} + +/** + * Generates gray scale colors + */ +function generateGrayScale(isDark: boolean): Record { + if (isDark) { + return { + '1': '#191919', + '2': '#242424', + '3': '#373737', + '4': '#464646', + '5': '#575757', + '6': '#7b7b7b', + '7': '#9e9e9e', + '8': '#b4b4b4', + }; + } + + return { + '1': '#f8f8f8', + '2': '#ececec', + '3': '#d9d9d9', + '4': '#c1c1c1', + '5': '#9e9e9e', + '6': '#8c8c8c', + '7': '#757575', + '8': '#595959', + }; +} + +/** + * Generates surface background colors + */ +function generateSurfaceColors( + palette: Mui5Theme['palette'], +): Record { + const isDark = palette.mode === 'dark'; + + // Helper function to get tint colors with proper fallbacks + const getTintColor = (opacity: string) => { + if (palette.primary?.main) { + return `${palette.primary.main}${opacity}`; + } + return isDark + ? `rgba(156, 201, 255, ${opacity === '40' ? '0.12' : '0.16'})` + : `rgba(31, 84, 147, ${opacity === '40' ? '0.4' : '0.6'})`; + }; + + // Helper function to get fallback colors based on theme mode + const getFallbackColor = (lightColor: string, darkColor: string) => { + return isDark ? darkColor : lightColor; + }; + + return { + 'surface-2': getFallbackColor('#ececec', '#242424'), + solid: palette.primary?.main || getFallbackColor('#1f5493', '#9cc9ff'), + 'solid-hover': + palette.primary?.dark || getFallbackColor('#163a66', '#83b9fd'), + 'solid-pressed': + palette.primary?.dark || getFallbackColor('#0f2b4e', '#83b9fd'), + 'solid-disabled': getFallbackColor('#ebebeb', '#222222'), + tint: 'transparent', + 'tint-hover': getTintColor('40'), + 'tint-pressed': getTintColor('60'), + 'tint-disabled': getFallbackColor('#ebebeb', 'transparent'), + danger: palette.error?.light || getFallbackColor('#feebe7', '#3b1219'), + warning: palette.warning?.light || getFallbackColor('#fff2b2', '#302008'), + success: palette.success?.light || getFallbackColor('#e6f6eb', '#132d21'), + }; +} + +/** + * Generates foreground colors + */ +function generateForegroundColors( + palette: Mui5Theme['palette'], +): Record { + const isDark = palette.mode === 'dark'; + + return { + link: palette.primary?.main || (isDark ? '#9cc9ff' : '#1f5493'), + 'link-hover': palette.primary?.dark || (isDark ? '#7eb5f7' : '#1f2d5c'), + disabled: palette.text?.disabled || (isDark ? '#9e9e9e' : '#9e9e9e'), + solid: isDark ? '#101821' : '#ffffff', + 'solid-disabled': isDark ? '#575757' : '#9c9c9c', + tint: palette.primary?.main || (isDark ? '#9cc9ff' : '#1f5493'), + 'tint-disabled': isDark ? '#575757' : '#9e9e9e', + danger: palette.error?.main || '#e22b2b', + warning: palette.warning?.main || '#e36d05', + success: palette.success?.main || '#1db954', + }; +} + +/** + * Generates border colors + */ +function generateBorderColors( + palette: Mui5Theme['palette'], +): Record { + const isDark = palette.mode === 'dark'; + + return { + '': isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.1)', + hover: isDark ? 'rgba(255, 255, 255, 0.4)' : 'rgba(0, 0, 0, 0.2)', + pressed: isDark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.4)', + disabled: isDark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.1)', + danger: palette.error?.main || '#f87a7a', + warning: palette.warning?.main || '#e36d05', + success: palette.success?.main || '#53db83', + }; +} diff --git a/yarn.lock b/yarn.lock index f22d88ee20..41f7dc6d64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2435,6 +2435,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.28.3": + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163 + languageName: node + linkType: hard + "@babel/template@npm:^7.27.2, @babel/template@npm:^7.3.3": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" @@ -4336,9 +4343,11 @@ __metadata: "@backstage/frontend-plugin-api": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" + "@backstage/ui": "workspace:^" "@material-ui/core": "npm:^4.9.13" "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:^4.0.0-alpha.61" + "@mui/material": "npm:^7.3.2" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" "@testing-library/user-event": "npm:^14.0.0" @@ -8184,6 +8193,19 @@ __metadata: languageName: node linkType: hard +"@emotion/cache@npm:^11.14.0": + version: 11.14.0 + resolution: "@emotion/cache@npm:11.14.0" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" + stylis: "npm:4.2.0" + checksum: 10/52336b28a27b07dde8fcdfd80851cbd1487672bbd4db1e24cca1440c95d8a6a968c57b0453c2b7c88d9b432b717f99554dbecc05b5cdef27933299827e69fd8e + languageName: node + linkType: hard + "@emotion/hash@npm:^0.8.0": version: 0.8.0 resolution: "@emotion/hash@npm:0.8.0" @@ -11170,6 +11192,13 @@ __metadata: languageName: node linkType: hard +"@mui/core-downloads-tracker@npm:^7.3.2": + version: 7.3.2 + resolution: "@mui/core-downloads-tracker@npm:7.3.2" + checksum: 10/01c0976e5fb6a8f0b59ebd58019af5452d7761e97daf0f2ef121bc3323508edf2fea1b13ea1a54b0098d6ee5eef70041c9722fe43291b237b989b6813a24b71e + languageName: node + linkType: hard + "@mui/material@npm:^5.12.2": version: 5.16.14 resolution: "@mui/material@npm:5.16.14" @@ -11203,6 +11232,42 @@ __metadata: languageName: node linkType: hard +"@mui/material@npm:^7.3.2": + version: 7.3.2 + resolution: "@mui/material@npm:7.3.2" + dependencies: + "@babel/runtime": "npm:^7.28.3" + "@mui/core-downloads-tracker": "npm:^7.3.2" + "@mui/system": "npm:^7.3.2" + "@mui/types": "npm:^7.4.6" + "@mui/utils": "npm:^7.3.2" + "@popperjs/core": "npm:^2.11.8" + "@types/react-transition-group": "npm:^4.4.12" + clsx: "npm:^2.1.1" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + react-is: "npm:^19.1.1" + react-transition-group: "npm:^4.4.5" + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@mui/material-pigment-css": ^7.3.2 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@mui/material-pigment-css": + optional: true + "@types/react": + optional: true + checksum: 10/e9a5348060d6e6e6cb1ce0fe299a582fa9b37b56dff46b62f72d029d5078acefd56a258e559b29bb3d12e89d0a81fd4f1194ce07cc136bbf03fdb4878fd9b3c0 + languageName: node + linkType: hard + "@mui/private-theming@npm:^5.16.14": version: 5.16.14 resolution: "@mui/private-theming@npm:5.16.14" @@ -11220,6 +11285,23 @@ __metadata: languageName: node linkType: hard +"@mui/private-theming@npm:^7.3.2": + version: 7.3.2 + resolution: "@mui/private-theming@npm:7.3.2" + dependencies: + "@babel/runtime": "npm:^7.28.3" + "@mui/utils": "npm:^7.3.2" + prop-types: "npm:^15.8.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/5b733fc9e09e5b056af3e448899c665c6d1560ec56f593811fc88b9c5499ad42d8365551b182473880de6141a206da4f1f9e5b2ebcea12461dc6d8954e2a3ed7 + languageName: node + linkType: hard + "@mui/styled-engine@npm:^5.16.14": version: 5.16.14 resolution: "@mui/styled-engine@npm:5.16.14" @@ -11241,6 +11323,29 @@ __metadata: languageName: node linkType: hard +"@mui/styled-engine@npm:^7.3.2": + version: 7.3.2 + resolution: "@mui/styled-engine@npm:7.3.2" + dependencies: + "@babel/runtime": "npm:^7.28.3" + "@emotion/cache": "npm:^11.14.0" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/sheet": "npm:^1.4.0" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + peerDependencies: + "@emotion/react": ^11.4.1 + "@emotion/styled": ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + checksum: 10/f31a6080b950cc66edd19a5285d30e0557fc16ef07a5e9027d3479f18dda4a569a62976c0fa396a99b077c01000c4fced3c8ab3ea0f6bcd82d6db06b821503b2 + languageName: node + linkType: hard + "@mui/styles@npm:^5.14.18": version: 5.16.14 resolution: "@mui/styles@npm:5.16.14" @@ -11300,6 +11405,34 @@ __metadata: languageName: node linkType: hard +"@mui/system@npm:^7.3.2": + version: 7.3.2 + resolution: "@mui/system@npm:7.3.2" + dependencies: + "@babel/runtime": "npm:^7.28.3" + "@mui/private-theming": "npm:^7.3.2" + "@mui/styled-engine": "npm:^7.3.2" + "@mui/types": "npm:^7.4.6" + "@mui/utils": "npm:^7.3.2" + clsx: "npm:^2.1.1" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@types/react": + optional: true + checksum: 10/1e157027a693877a246c36e5c98dd988172daedb3430f95843a508fa3f8a707c394fe216078a17868d5d25690ea2f4c5af007dffff639436c36d982fb16e920a + languageName: node + linkType: hard + "@mui/types@npm:^7.2.15": version: 7.2.19 resolution: "@mui/types@npm:7.2.19" @@ -11312,6 +11445,20 @@ __metadata: languageName: node linkType: hard +"@mui/types@npm:^7.4.6": + version: 7.4.6 + resolution: "@mui/types@npm:7.4.6" + dependencies: + "@babel/runtime": "npm:^7.28.3" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/6263ef077332b75e01c1b347339f100f8743d8135efdee4a6c167ce70c69ca29d9face54c53395cbc1c8a8f5453fe8ef3f4457842cf0c05318f6ef6cde44456e + languageName: node + linkType: hard + "@mui/utils@npm:^5.14.15, @mui/utils@npm:^5.16.14": version: 5.16.14 resolution: "@mui/utils@npm:5.16.14" @@ -11332,6 +11479,26 @@ __metadata: languageName: node linkType: hard +"@mui/utils@npm:^7.3.2": + version: 7.3.2 + resolution: "@mui/utils@npm:7.3.2" + dependencies: + "@babel/runtime": "npm:^7.28.3" + "@mui/types": "npm:^7.4.6" + "@types/prop-types": "npm:^15.7.15" + clsx: "npm:^2.1.1" + prop-types: "npm:^15.8.1" + react-is: "npm:^19.1.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/defcebcb8e49cdbdf271e49066d78046d2d25d4c8177176a6c5d3368fe85e6a280c7be71dbf356b434863d96d69236956afe6a4a47bc394de6aeecfa8bc24fda + languageName: node + linkType: hard + "@n1ru4l/push-pull-async-iterable-iterator@npm:^3.1.0": version: 3.1.0 resolution: "@n1ru4l/push-pull-async-iterable-iterator@npm:3.1.0" @@ -20765,7 +20932,7 @@ __metadata: languageName: node linkType: hard -"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.3": +"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.15, @types/prop-types@npm:^15.7.3": version: 15.7.15 resolution: "@types/prop-types@npm:15.7.15" checksum: 10/31aa2f59b28f24da6fb4f1d70807dae2aedfce090ec63eaf9ea01727a9533ef6eaf017de5bff99fbccad7d1c9e644f52c6c2ba30869465dd22b1a7221c29f356 @@ -20879,6 +21046,15 @@ __metadata: languageName: node linkType: hard +"@types/react-transition-group@npm:^4.4.12": + version: 4.4.12 + resolution: "@types/react-transition-group@npm:4.4.12" + peerDependencies: + "@types/react": "*" + checksum: 10/ea14bc84f529a3887f9954b753843820ac8a3c49fcdfec7840657ecc6a8800aad98afdbe4b973eb96c7252286bde38476fcf64b1c09527354a9a9366e516d9a2 + languageName: node + linkType: hard + "@types/react-virtualized-auto-sizer@npm:^1.0.1": version: 1.0.4 resolution: "@types/react-virtualized-auto-sizer@npm:1.0.4" @@ -42751,6 +42927,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^19.1.1": + version: 19.1.1 + resolution: "react-is@npm:19.1.1" + checksum: 10/44e0937da1f0da1d5dbd4f01972870768ef207f8a49717f4491f5022454f34c956cb66be560aee5286387169853b0283a81e1f419b51dc62654c8710dc98065a + languageName: node + linkType: hard + "react-json-view@npm:^1.21.3": version: 1.21.3 resolution: "react-json-view@npm:1.21.3" From 0d4ded62f81e76c674bbf05ab41857aeb10df11b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 12:34:35 +0200 Subject: [PATCH 123/177] bui-themer: get rid of most hardcoded defaults Signed-off-by: Patrik Oldsberg --- .../convertMuiToBuiTheme.test.ts | 60 +++++ .../BuiThemerPage/convertMuiToBuiTheme.ts | 228 +++++++++++++++--- 2 files changed, 261 insertions(+), 27 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts index e45f48f3a0..ffbd4fc392 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts @@ -275,4 +275,64 @@ describe('convertMuiToBuiTheme', () => { expect(result).toContain('--bui-radius-3: 8px;'); }); + + describe('early validation', () => { + it('should throw error when theme is undefined', () => { + expect(() => convertMuiToBuiTheme(undefined as any)).toThrow( + 'Theme is required', + ); + }); + + it('should throw error when theme palette is missing', () => { + const theme = { typography: {}, spacing: () => 8, shape: {} } as any; + expect(() => convertMuiToBuiTheme(theme)).toThrow( + 'Theme palette is required', + ); + }); + + it('should throw error when theme palette mode is missing', () => { + const theme = { + palette: {}, + typography: {}, + spacing: () => 8, + shape: {}, + } as any; + expect(() => convertMuiToBuiTheme(theme)).toThrow( + 'Theme palette mode is required', + ); + }); + + it('should throw error when theme typography is missing', () => { + const theme = { + palette: { mode: 'light' }, + spacing: () => 8, + shape: {}, + } as any; + expect(() => convertMuiToBuiTheme(theme)).toThrow( + 'Theme typography is required', + ); + }); + + it('should throw error when theme spacing is missing', () => { + const theme = { + palette: { mode: 'light' }, + typography: {}, + shape: {}, + } as any; + expect(() => convertMuiToBuiTheme(theme)).toThrow( + 'Theme spacing is required', + ); + }); + + it('should throw error when theme shape is missing', () => { + const theme = { + palette: { mode: 'light' }, + typography: {}, + spacing: () => 8, + } as any; + expect(() => convertMuiToBuiTheme(theme)).toThrow( + 'Theme shape is required', + ); + }); + }); }); diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts index e1f1618760..dee1c1fd72 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts @@ -15,6 +15,7 @@ */ import { Theme as Mui5Theme } from '@mui/material/styles'; +import { themes } from '@backstage/theme'; export interface ConvertMuiToBuiThemeOptions { /** @@ -37,6 +38,31 @@ export function convertMuiToBuiTheme( theme: Mui5Theme, options: ConvertMuiToBuiThemeOptions = {}, ): string { + // Early validation of required theme properties + if (!theme) { + throw new Error('Theme is required'); + } + + if (!theme.palette) { + throw new Error('Theme palette is required'); + } + + if (!theme.palette.mode) { + throw new Error('Theme palette mode is required'); + } + + if (!theme.typography) { + throw new Error('Theme typography is required'); + } + + if (!theme.spacing) { + throw new Error('Theme spacing is required'); + } + + if (!theme.shape) { + throw new Error('Theme shape is required'); + } + const { themeId, includeThemeId = false } = options; const isDark = theme.palette.mode === 'dark'; @@ -211,36 +237,92 @@ function generateSurfaceColors( ): Record { const isDark = palette.mode === 'dark'; - // Helper function to get tint colors with proper fallbacks + // Get the default Backstage theme for fallback values + const defaultTheme = isDark ? themes.dark : themes.light; + const defaultMuiTheme = defaultTheme.getTheme('v5'); + + if (!defaultMuiTheme) { + throw new Error( + `Failed to get MUI v5 theme from Backstage ${ + isDark ? 'dark' : 'light' + } theme`, + ); + } + + const defaultPalette = defaultMuiTheme.palette; + if (!defaultPalette) { + throw new Error( + `Failed to get palette from Backstage ${isDark ? 'dark' : 'light'} theme`, + ); + } + + // Helper function to get tint colors const getTintColor = (opacity: string) => { - if (palette.primary?.main) { - return `${palette.primary.main}${opacity}`; + const primaryColor = palette.primary?.main || defaultPalette.primary?.main; + if (!primaryColor) { + throw new Error('Primary color not found in current or default theme'); } - return isDark - ? `rgba(156, 201, 255, ${opacity === '40' ? '0.12' : '0.16'})` - : `rgba(31, 84, 147, ${opacity === '40' ? '0.4' : '0.6'})`; + return `${primaryColor}${opacity}`; }; - // Helper function to get fallback colors based on theme mode - const getFallbackColor = (lightColor: string, darkColor: string) => { + // Helper function to get colors based on theme mode + const getThemeColor = (lightColor: string, darkColor: string) => { return isDark ? darkColor : lightColor; }; return { - 'surface-2': getFallbackColor('#ececec', '#242424'), - solid: palette.primary?.main || getFallbackColor('#1f5493', '#9cc9ff'), + 'surface-2': getThemeColor('#ececec', '#242424'), + solid: + palette.primary?.main || + defaultPalette.primary?.main || + (() => { + throw new Error('Primary color not found in current or default theme'); + })(), 'solid-hover': - palette.primary?.dark || getFallbackColor('#163a66', '#83b9fd'), + palette.primary?.dark || + defaultPalette.primary?.dark || + (() => { + throw new Error( + 'Primary dark color not found in current or default theme', + ); + })(), 'solid-pressed': - palette.primary?.dark || getFallbackColor('#0f2b4e', '#83b9fd'), - 'solid-disabled': getFallbackColor('#ebebeb', '#222222'), + palette.primary?.dark || + defaultPalette.primary?.dark || + (() => { + throw new Error( + 'Primary dark color not found in current or default theme', + ); + })(), + 'solid-disabled': getThemeColor('#ebebeb', '#222222'), tint: 'transparent', 'tint-hover': getTintColor('40'), 'tint-pressed': getTintColor('60'), - 'tint-disabled': getFallbackColor('#ebebeb', 'transparent'), - danger: palette.error?.light || getFallbackColor('#feebe7', '#3b1219'), - warning: palette.warning?.light || getFallbackColor('#fff2b2', '#302008'), - success: palette.success?.light || getFallbackColor('#e6f6eb', '#132d21'), + 'tint-disabled': getThemeColor('#ebebeb', 'transparent'), + danger: + palette.error?.light || + defaultPalette.error?.light || + (() => { + throw new Error( + 'Error light color not found in current or default theme', + ); + })(), + warning: + palette.warning?.light || + defaultPalette.warning?.light || + (() => { + throw new Error( + 'Warning light color not found in current or default theme', + ); + })(), + success: + palette.success?.light || + defaultPalette.success?.light || + (() => { + throw new Error( + 'Success light color not found in current or default theme', + ); + })(), }; } @@ -252,17 +334,75 @@ function generateForegroundColors( ): Record { const isDark = palette.mode === 'dark'; + // Get the default Backstage theme for fallback values + const defaultTheme = isDark ? themes.dark : themes.light; + const defaultMuiTheme = defaultTheme.getTheme('v5'); + + if (!defaultMuiTheme) { + throw new Error( + `Failed to get MUI v5 theme from Backstage ${ + isDark ? 'dark' : 'light' + } theme`, + ); + } + + const defaultPalette = defaultMuiTheme.palette; + if (!defaultPalette) { + throw new Error( + `Failed to get palette from Backstage ${isDark ? 'dark' : 'light'} theme`, + ); + } + return { - link: palette.primary?.main || (isDark ? '#9cc9ff' : '#1f5493'), - 'link-hover': palette.primary?.dark || (isDark ? '#7eb5f7' : '#1f2d5c'), - disabled: palette.text?.disabled || (isDark ? '#9e9e9e' : '#9e9e9e'), + link: + palette.primary?.main || + defaultPalette.primary?.main || + (() => { + throw new Error('Primary color not found in current or default theme'); + })(), + 'link-hover': + palette.primary?.dark || + defaultPalette.primary?.dark || + (() => { + throw new Error( + 'Primary dark color not found in current or default theme', + ); + })(), + disabled: + palette.text?.disabled || + defaultPalette.text?.disabled || + (() => { + throw new Error( + 'Text disabled color not found in current or default theme', + ); + })(), solid: isDark ? '#101821' : '#ffffff', 'solid-disabled': isDark ? '#575757' : '#9c9c9c', - tint: palette.primary?.main || (isDark ? '#9cc9ff' : '#1f5493'), + tint: + palette.primary?.main || + defaultPalette.primary?.main || + (() => { + throw new Error('Primary color not found in current or default theme'); + })(), 'tint-disabled': isDark ? '#575757' : '#9e9e9e', - danger: palette.error?.main || '#e22b2b', - warning: palette.warning?.main || '#e36d05', - success: palette.success?.main || '#1db954', + danger: + palette.error?.main || + defaultPalette.error?.main || + (() => { + throw new Error('Error color not found in current or default theme'); + })(), + warning: + palette.warning?.main || + defaultPalette.warning?.main || + (() => { + throw new Error('Warning color not found in current or default theme'); + })(), + success: + palette.success?.main || + defaultPalette.success?.main || + (() => { + throw new Error('Success color not found in current or default theme'); + })(), }; } @@ -274,13 +414,47 @@ function generateBorderColors( ): Record { const isDark = palette.mode === 'dark'; + // Get the default Backstage theme for fallback values + const defaultTheme = isDark ? themes.dark : themes.light; + const defaultMuiTheme = defaultTheme.getTheme('v5'); + + if (!defaultMuiTheme) { + throw new Error( + `Failed to get MUI v5 theme from Backstage ${ + isDark ? 'dark' : 'light' + } theme`, + ); + } + + const defaultPalette = defaultMuiTheme.palette; + if (!defaultPalette) { + throw new Error( + `Failed to get palette from Backstage ${isDark ? 'dark' : 'light'} theme`, + ); + } + return { '': isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.1)', hover: isDark ? 'rgba(255, 255, 255, 0.4)' : 'rgba(0, 0, 0, 0.2)', pressed: isDark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.4)', disabled: isDark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.1)', - danger: palette.error?.main || '#f87a7a', - warning: palette.warning?.main || '#e36d05', - success: palette.success?.main || '#53db83', + danger: + palette.error?.main || + defaultPalette.error?.main || + (() => { + throw new Error('Error color not found in current or default theme'); + })(), + warning: + palette.warning?.main || + defaultPalette.warning?.main || + (() => { + throw new Error('Warning color not found in current or default theme'); + })(), + success: + palette.success?.main || + defaultPalette.success?.main || + (() => { + throw new Error('Success color not found in current or default theme'); + })(), }; } From 71cb5327c54aae23936e404e81bb99234df684d4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 12:53:08 +0200 Subject: [PATCH 124/177] bui-themer: skip gray scale Signed-off-by: Patrik Oldsberg --- .../BuiThemerPage/convertMuiToBuiTheme.ts | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts index dee1c1fd72..dbd60c6ea6 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts @@ -152,12 +152,6 @@ function generateBuiVariables(theme: Mui5Theme): string { variables.push(` --bui-white: ${palette.common.white};`); } - // Gray scale - generate from primary color or use defaults - const grayScale = generateGrayScale(palette.mode === 'dark'); - Object.entries(grayScale).forEach(([key, value]) => { - variables.push(` --bui-gray-${key}: ${value};`); - }); - // Background colors if (palette.background?.default) { variables.push(` --bui-bg: ${palette.background.default};`); @@ -200,35 +194,6 @@ function generateBuiVariables(theme: Mui5Theme): string { return variables.join('\n'); } -/** - * Generates gray scale colors - */ -function generateGrayScale(isDark: boolean): Record { - if (isDark) { - return { - '1': '#191919', - '2': '#242424', - '3': '#373737', - '4': '#464646', - '5': '#575757', - '6': '#7b7b7b', - '7': '#9e9e9e', - '8': '#b4b4b4', - }; - } - - return { - '1': '#f8f8f8', - '2': '#ececec', - '3': '#d9d9d9', - '4': '#c1c1c1', - '5': '#9e9e9e', - '6': '#8c8c8c', - '7': '#757575', - '8': '#595959', - }; -} - /** * Generates surface background colors */ From 6c0a51b3f7606d42bf1d27eb38767233132fbd97 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 15:07:43 +0200 Subject: [PATCH 125/177] bui-themer: simplify theme conversion Signed-off-by: Patrik Oldsberg --- plugins/bui-themer/package.json | 1 + .../convertMuiToBuiTheme.test.ts | 104 +----- .../BuiThemerPage/convertMuiToBuiTheme.ts | 306 +++--------------- yarn.lock | 1 + 4 files changed, 45 insertions(+), 367 deletions(-) diff --git a/plugins/bui-themer/package.json b/plugins/bui-themer/package.json index ff97c92ecb..64cad56775 100644 --- a/plugins/bui-themer/package.json +++ b/plugins/bui-themer/package.json @@ -35,6 +35,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.61", "@mui/material": "^7.3.2", + "@mui/system": "^7.3.2", "react-use": "^17.2.4" }, "peerDependencies": { diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts index ffbd4fc392..7c11dd7d25 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.test.ts @@ -54,7 +54,8 @@ describe('convertMuiToBuiTheme', () => { expect(result).toContain(':root {'); expect(result).toContain('--bui-font-regular: Roboto, sans-serif;'); - expect(result).toContain('--bui-space: 8px;'); + // Spacing is skipped for default 8px + expect(result).not.toContain('--bui-space:'); expect(result).toContain('--bui-radius-3: 4px;'); expect(result).toContain('--bui-bg: #f5f5f5;'); expect(result).toContain('--bui-bg-surface-1: #ffffff;'); @@ -122,38 +123,6 @@ describe('convertMuiToBuiTheme', () => { expect(result).toContain('--bui-white: #fff;'); }); - it('should generate proper gray scale for light theme', () => { - const theme = createTheme({ - palette: { - mode: 'light', - primary: { - main: '#1976d2', - }, - }, - }); - - const result = convertMuiToBuiTheme(theme); - - expect(result).toContain('--bui-gray-1: #f8f8f8;'); - expect(result).toContain('--bui-gray-8: #595959;'); - }); - - it('should generate proper gray scale for dark theme', () => { - const theme = createTheme({ - palette: { - mode: 'dark', - primary: { - main: '#90caf9', - }, - }, - }); - - const result = convertMuiToBuiTheme(theme); - - expect(result).toContain('--bui-gray-1: #191919;'); - expect(result).toContain('--bui-gray-8: #b4b4b4;'); - }); - it('should generate surface colors correctly', () => { const theme = createTheme({ palette: { @@ -180,7 +149,7 @@ describe('convertMuiToBuiTheme', () => { const result = convertMuiToBuiTheme(theme); expect(result).toContain('--bui-bg-solid: #1976d2;'); - expect(result).toContain('--bui-bg-solid-hover: #115293;'); + expect(result).toContain('--bui-bg-solid-hover: rgb(21, 100, 179);'); expect(result).toContain('--bui-bg-danger: #ffcdd2;'); expect(result).toContain('--bui-bg-warning: #ffe0b2;'); expect(result).toContain('--bui-bg-success: #c8e6c9;'); @@ -237,8 +206,7 @@ describe('convertMuiToBuiTheme', () => { const result = convertMuiToBuiTheme(theme); - expect(result).toContain('--bui-border: rgba(0, 0, 0, 0.1);'); - expect(result).toContain('--bui-border-hover: rgba(0, 0, 0, 0.2);'); + // Base border colors are no longer generated expect(result).toContain('--bui-border-danger: #f44336;'); expect(result).toContain('--bui-border-warning: #ff9800;'); expect(result).toContain('--bui-border-success: #4caf50;'); @@ -251,7 +219,7 @@ describe('convertMuiToBuiTheme', () => { const result = convertMuiToBuiTheme(theme); - expect(result).toContain('--bui-space: 4px;'); + expect(result).toContain('--bui-space: calc(4px * 0.5);'); }); it('should handle string-based spacing', () => { @@ -261,7 +229,7 @@ describe('convertMuiToBuiTheme', () => { const result = convertMuiToBuiTheme(theme); - expect(result).toContain('--bui-space: calc(1 * 8px);'); + expect(result).toContain('--bui-space: calc(calc(1 * 8px) * 0.5);'); }); it('should handle string-based border radius', () => { @@ -275,64 +243,4 @@ describe('convertMuiToBuiTheme', () => { expect(result).toContain('--bui-radius-3: 8px;'); }); - - describe('early validation', () => { - it('should throw error when theme is undefined', () => { - expect(() => convertMuiToBuiTheme(undefined as any)).toThrow( - 'Theme is required', - ); - }); - - it('should throw error when theme palette is missing', () => { - const theme = { typography: {}, spacing: () => 8, shape: {} } as any; - expect(() => convertMuiToBuiTheme(theme)).toThrow( - 'Theme palette is required', - ); - }); - - it('should throw error when theme palette mode is missing', () => { - const theme = { - palette: {}, - typography: {}, - spacing: () => 8, - shape: {}, - } as any; - expect(() => convertMuiToBuiTheme(theme)).toThrow( - 'Theme palette mode is required', - ); - }); - - it('should throw error when theme typography is missing', () => { - const theme = { - palette: { mode: 'light' }, - spacing: () => 8, - shape: {}, - } as any; - expect(() => convertMuiToBuiTheme(theme)).toThrow( - 'Theme typography is required', - ); - }); - - it('should throw error when theme spacing is missing', () => { - const theme = { - palette: { mode: 'light' }, - typography: {}, - shape: {}, - } as any; - expect(() => convertMuiToBuiTheme(theme)).toThrow( - 'Theme spacing is required', - ); - }); - - it('should throw error when theme shape is missing', () => { - const theme = { - palette: { mode: 'light' }, - typography: {}, - spacing: () => 8, - } as any; - expect(() => convertMuiToBuiTheme(theme)).toThrow( - 'Theme shape is required', - ); - }); - }); }); diff --git a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts index dbd60c6ea6..1d6e581b57 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts +++ b/plugins/bui-themer/src/components/BuiThemerPage/convertMuiToBuiTheme.ts @@ -15,7 +15,7 @@ */ import { Theme as Mui5Theme } from '@mui/material/styles'; -import { themes } from '@backstage/theme'; +import { blend, alpha } from '@mui/system/colorManipulator'; export interface ConvertMuiToBuiThemeOptions { /** @@ -38,31 +38,6 @@ export function convertMuiToBuiTheme( theme: Mui5Theme, options: ConvertMuiToBuiThemeOptions = {}, ): string { - // Early validation of required theme properties - if (!theme) { - throw new Error('Theme is required'); - } - - if (!theme.palette) { - throw new Error('Theme palette is required'); - } - - if (!theme.palette.mode) { - throw new Error('Theme palette mode is required'); - } - - if (!theme.typography) { - throw new Error('Theme typography is required'); - } - - if (!theme.spacing) { - throw new Error('Theme spacing is required'); - } - - if (!theme.shape) { - throw new Error('Theme shape is required'); - } - const { themeId, includeThemeId = false } = options; const isDark = theme.palette.mode === 'dark'; @@ -125,13 +100,10 @@ function generateBuiVariables(theme: Mui5Theme): string { } }); - // Spacing - map MUI spacing to BUI spacing scale - if (theme.spacing) { - const spacingUnit = - typeof theme.spacing === 'function' ? theme.spacing(1) : theme.spacing; - const spacingValue = - typeof spacingUnit === 'number' ? `${spacingUnit}px` : spacingUnit; - variables.push(` --bui-space: ${spacingValue};`); + const spacing = theme.spacing(1); + // Skip spacing if the theme is using the default + if (spacing !== '8px') { + variables.push(` --bui-space: calc(${spacing} * 0.5);`); } // Border radius @@ -161,8 +133,21 @@ function generateBuiVariables(theme: Mui5Theme): string { } // Generate surface colors - const surfaceColors = generateSurfaceColors(palette); - Object.entries(surfaceColors).forEach(([key, value]) => { + Object.entries({ + 'surface-1': palette.background.default, + 'surface-2': palette.background.paper, + solid: palette.primary.main, + 'solid-hover': blend(palette.primary.main, palette.primary.dark, 0.5), + 'solid-pressed': palette.primary.dark, + 'solid-disabled': palette.action.disabledBackground, + tint: 'transparent', + 'tint-hover': alpha(palette.primary.main, 0.4), + 'tint-pressed': alpha(palette.primary.main, 0.6), + 'tint-disabled': palette.action.disabledBackground, + danger: palette.error.light, + warning: palette.warning.light, + success: palette.success.light, + }).forEach(([key, value]) => { variables.push(` --bui-bg-${key}: ${value};`); }); @@ -175,14 +160,27 @@ function generateBuiVariables(theme: Mui5Theme): string { } // Generate foreground colors - const foregroundColors = generateForegroundColors(palette); - Object.entries(foregroundColors).forEach(([key, value]) => { + Object.entries({ + link: palette.primary.main, + 'link-hover': palette.primary.dark, + disabled: palette.text.disabled, + solid: palette.text.primary, + 'solid-disabled': palette.action.disabled, + tint: palette.primary.main, + 'tint-disabled': palette.action.disabled, + danger: palette.error.main, + warning: palette.warning.main, + success: palette.success.main, + }).forEach(([key, value]) => { variables.push(` --bui-fg-${key}: ${value};`); }); // Border colors - const borderColors = generateBorderColors(palette); - Object.entries(borderColors).forEach(([key, value]) => { + Object.entries({ + danger: palette.error.main, + warning: palette.warning.main, + success: palette.success.main, + }).forEach(([key, value]) => { variables.push(` --bui-border${key ? `-${key}` : ''}: ${value};`); }); @@ -193,233 +191,3 @@ function generateBuiVariables(theme: Mui5Theme): string { return variables.join('\n'); } - -/** - * Generates surface background colors - */ -function generateSurfaceColors( - palette: Mui5Theme['palette'], -): Record { - const isDark = palette.mode === 'dark'; - - // Get the default Backstage theme for fallback values - const defaultTheme = isDark ? themes.dark : themes.light; - const defaultMuiTheme = defaultTheme.getTheme('v5'); - - if (!defaultMuiTheme) { - throw new Error( - `Failed to get MUI v5 theme from Backstage ${ - isDark ? 'dark' : 'light' - } theme`, - ); - } - - const defaultPalette = defaultMuiTheme.palette; - if (!defaultPalette) { - throw new Error( - `Failed to get palette from Backstage ${isDark ? 'dark' : 'light'} theme`, - ); - } - - // Helper function to get tint colors - const getTintColor = (opacity: string) => { - const primaryColor = palette.primary?.main || defaultPalette.primary?.main; - if (!primaryColor) { - throw new Error('Primary color not found in current or default theme'); - } - return `${primaryColor}${opacity}`; - }; - - // Helper function to get colors based on theme mode - const getThemeColor = (lightColor: string, darkColor: string) => { - return isDark ? darkColor : lightColor; - }; - - return { - 'surface-2': getThemeColor('#ececec', '#242424'), - solid: - palette.primary?.main || - defaultPalette.primary?.main || - (() => { - throw new Error('Primary color not found in current or default theme'); - })(), - 'solid-hover': - palette.primary?.dark || - defaultPalette.primary?.dark || - (() => { - throw new Error( - 'Primary dark color not found in current or default theme', - ); - })(), - 'solid-pressed': - palette.primary?.dark || - defaultPalette.primary?.dark || - (() => { - throw new Error( - 'Primary dark color not found in current or default theme', - ); - })(), - 'solid-disabled': getThemeColor('#ebebeb', '#222222'), - tint: 'transparent', - 'tint-hover': getTintColor('40'), - 'tint-pressed': getTintColor('60'), - 'tint-disabled': getThemeColor('#ebebeb', 'transparent'), - danger: - palette.error?.light || - defaultPalette.error?.light || - (() => { - throw new Error( - 'Error light color not found in current or default theme', - ); - })(), - warning: - palette.warning?.light || - defaultPalette.warning?.light || - (() => { - throw new Error( - 'Warning light color not found in current or default theme', - ); - })(), - success: - palette.success?.light || - defaultPalette.success?.light || - (() => { - throw new Error( - 'Success light color not found in current or default theme', - ); - })(), - }; -} - -/** - * Generates foreground colors - */ -function generateForegroundColors( - palette: Mui5Theme['palette'], -): Record { - const isDark = palette.mode === 'dark'; - - // Get the default Backstage theme for fallback values - const defaultTheme = isDark ? themes.dark : themes.light; - const defaultMuiTheme = defaultTheme.getTheme('v5'); - - if (!defaultMuiTheme) { - throw new Error( - `Failed to get MUI v5 theme from Backstage ${ - isDark ? 'dark' : 'light' - } theme`, - ); - } - - const defaultPalette = defaultMuiTheme.palette; - if (!defaultPalette) { - throw new Error( - `Failed to get palette from Backstage ${isDark ? 'dark' : 'light'} theme`, - ); - } - - return { - link: - palette.primary?.main || - defaultPalette.primary?.main || - (() => { - throw new Error('Primary color not found in current or default theme'); - })(), - 'link-hover': - palette.primary?.dark || - defaultPalette.primary?.dark || - (() => { - throw new Error( - 'Primary dark color not found in current or default theme', - ); - })(), - disabled: - palette.text?.disabled || - defaultPalette.text?.disabled || - (() => { - throw new Error( - 'Text disabled color not found in current or default theme', - ); - })(), - solid: isDark ? '#101821' : '#ffffff', - 'solid-disabled': isDark ? '#575757' : '#9c9c9c', - tint: - palette.primary?.main || - defaultPalette.primary?.main || - (() => { - throw new Error('Primary color not found in current or default theme'); - })(), - 'tint-disabled': isDark ? '#575757' : '#9e9e9e', - danger: - palette.error?.main || - defaultPalette.error?.main || - (() => { - throw new Error('Error color not found in current or default theme'); - })(), - warning: - palette.warning?.main || - defaultPalette.warning?.main || - (() => { - throw new Error('Warning color not found in current or default theme'); - })(), - success: - palette.success?.main || - defaultPalette.success?.main || - (() => { - throw new Error('Success color not found in current or default theme'); - })(), - }; -} - -/** - * Generates border colors - */ -function generateBorderColors( - palette: Mui5Theme['palette'], -): Record { - const isDark = palette.mode === 'dark'; - - // Get the default Backstage theme for fallback values - const defaultTheme = isDark ? themes.dark : themes.light; - const defaultMuiTheme = defaultTheme.getTheme('v5'); - - if (!defaultMuiTheme) { - throw new Error( - `Failed to get MUI v5 theme from Backstage ${ - isDark ? 'dark' : 'light' - } theme`, - ); - } - - const defaultPalette = defaultMuiTheme.palette; - if (!defaultPalette) { - throw new Error( - `Failed to get palette from Backstage ${isDark ? 'dark' : 'light'} theme`, - ); - } - - return { - '': isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.1)', - hover: isDark ? 'rgba(255, 255, 255, 0.4)' : 'rgba(0, 0, 0, 0.2)', - pressed: isDark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.4)', - disabled: isDark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.1)', - danger: - palette.error?.main || - defaultPalette.error?.main || - (() => { - throw new Error('Error color not found in current or default theme'); - })(), - warning: - palette.warning?.main || - defaultPalette.warning?.main || - (() => { - throw new Error('Warning color not found in current or default theme'); - })(), - success: - palette.success?.main || - defaultPalette.success?.main || - (() => { - throw new Error('Success color not found in current or default theme'); - })(), - }; -} diff --git a/yarn.lock b/yarn.lock index 41f7dc6d64..9dd2bd9e16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4348,6 +4348,7 @@ __metadata: "@material-ui/icons": "npm:^4.9.1" "@material-ui/lab": "npm:^4.0.0-alpha.61" "@mui/material": "npm:^7.3.2" + "@mui/system": "npm:^7.3.2" "@testing-library/jest-dom": "npm:^6.0.0" "@testing-library/react": "npm:^14.0.0" "@testing-library/user-event": "npm:^14.0.0" From 09e65c6266b4458bb40f303e919de87dbe44f01f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 15:43:15 +0200 Subject: [PATCH 126/177] bui-themer: switch to horizontal layout Signed-off-by: Patrik Oldsberg --- .../BuiThemerPage/BuiThemerPage.tsx | 116 ++++++++++-------- 1 file changed, 65 insertions(+), 51 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index b36c550081..4ae25b60ce 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -24,10 +24,8 @@ import { Card, Container, Flex, - Grid, HeaderPage, Text, - TextField, Switch, } from '@backstage/ui'; import { @@ -136,16 +134,16 @@ function ThemeContent({ themeId, themeTitle, variant }: ThemeContentProps) { return ( - - + + - {themeTitle} + {themeTitle} {variant} theme - + - + @@ -172,53 +170,70 @@ function ThemeContent({ themeId, themeTitle, variant }: ThemeContentProps) { Generated CSS: - - - - {isPreviewMode && ( - + {generatedCss} + + + + {isPreviewMode && ( + + Live Preview: - Solid Button - - - Tint Button - - - Surface Card + + + Solid Button + + + Tint Button + + + Surface Card + + )} @@ -270,18 +285,17 @@ export function BuiThemerPage() { ) : ( - + {installedThemes.map(theme => ( - - - + ))} - + )} From d5c170eaf48e916ec95c4ef71ce30d332ee40458 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 16:32:07 +0200 Subject: [PATCH 127/177] bui-themer: extract mui theme and then unmount theme provider Signed-off-by: Patrik Oldsberg --- .../src/unified/UnifiedThemeProvider.tsx | 14 +++- .../BuiThemerPage/BuiThemerPage.tsx | 66 +++++++++++-------- 2 files changed, 49 insertions(+), 31 deletions(-) diff --git a/packages/theme/src/unified/UnifiedThemeProvider.tsx b/packages/theme/src/unified/UnifiedThemeProvider.tsx index a80e36cf35..006c45605e 100644 --- a/packages/theme/src/unified/UnifiedThemeProvider.tsx +++ b/packages/theme/src/unified/UnifiedThemeProvider.tsx @@ -74,12 +74,22 @@ export function UnifiedThemeProvider( const themeName = 'backstage'; useEffect(() => { + const oldMode = document.body.getAttribute('data-theme-mode'); + const oldName = document.body.getAttribute('data-theme-name'); document.body.setAttribute('data-theme-mode', themeMode); document.body.setAttribute('data-theme-name', themeName); return () => { - document.body.removeAttribute('data-theme-mode'); - document.body.removeAttribute('data-theme-name'); + if (oldMode) { + document.body.setAttribute('data-theme-mode', oldMode); + } else { + document.body.removeAttribute('data-theme-mode'); + } + if (oldName) { + document.body.setAttribute('data-theme-name', oldName); + } else { + document.body.removeAttribute('data-theme-name'); + } }; }, [themeMode, themeName]); diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 4ae25b60ce..4df3aae006 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -15,9 +15,9 @@ */ import { useMemo, useState, useCallback, useEffect } from 'react'; -import { useApi } from '@backstage/core-plugin-api'; +import { AppTheme, useApi } from '@backstage/core-plugin-api'; import { appThemeApiRef } from '@backstage/core-plugin-api'; -import { useTheme } from '@mui/material/styles'; +import { Theme, useTheme } from '@mui/material/styles'; import { Box, Button, @@ -33,13 +33,6 @@ import { ConvertMuiToBuiThemeOptions, } from './convertMuiToBuiTheme'; -interface ThemePreviewProps { - themeId: string; - themeTitle: string; - variant: 'light' | 'dark'; - Provider: React.ComponentType<{ children: React.ReactNode }>; -} - // Memoization cache for generated CSS const cssCache = new Map(); @@ -47,13 +40,18 @@ interface ThemeContentProps { themeId: string; themeTitle: string; variant: 'light' | 'dark'; + muiTheme: Theme; } -function ThemeContent({ themeId, themeTitle, variant }: ThemeContentProps) { +function ThemeContent({ + themeId, + themeTitle, + variant, + muiTheme, +}: ThemeContentProps) { const [generatedCss, setGeneratedCss] = useState(''); const [isPreviewMode, setIsPreviewMode] = useState(false); const [includeThemeId, setIncludeThemeId] = useState(false); - const muiTheme = useTheme(); const css = useMemo(() => { // Create cache key based on theme properties and options @@ -243,23 +241,29 @@ function ThemeContent({ themeId, themeTitle, variant }: ThemeContentProps) { ); } -function ThemePreview({ - themeId, - themeTitle, - variant, - Provider, -}: ThemePreviewProps) { +function MuiThemeExtractor(props: { + appTheme: AppTheme; + children: (theme: Theme) => JSX.Element; +}): JSX.Element { + const { appTheme, children } = props; + const [theme, setTheme] = useState(null); + const { Provider } = appTheme; + if (theme) { + return children(theme); + } + return ( - + ); } +function MuiThemeExtractorInner(props: { setTheme: (theme: Theme) => void }) { + props.setTheme(useTheme()); + return null; +} + export function BuiThemerPage() { const appThemeApi = useApi(appThemeApiRef); const installedThemes = appThemeApi.getInstalledThemes(); @@ -287,13 +291,17 @@ export function BuiThemerPage() { ) : ( {installedThemes.map(theme => ( - + + {muiTheme => ( + + )} + ))} )} From 5161dbc757b6ef3c59f9420cef27321d74b9dab2 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 16:37:44 +0200 Subject: [PATCH 128/177] bui-themer: remove unnecessary css cache Signed-off-by: Patrik Oldsberg --- .../BuiThemerPage/BuiThemerPage.tsx | 39 ++----------------- 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 4df3aae006..061ea379cd 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -28,13 +28,7 @@ import { Text, Switch, } from '@backstage/ui'; -import { - convertMuiToBuiTheme, - ConvertMuiToBuiThemeOptions, -} from './convertMuiToBuiTheme'; - -// Memoization cache for generated CSS -const cssCache = new Map(); +import { convertMuiToBuiTheme } from './convertMuiToBuiTheme'; interface ThemeContentProps { themeId: string; @@ -54,37 +48,10 @@ function ThemeContent({ const [includeThemeId, setIncludeThemeId] = useState(false); const css = useMemo(() => { - // Create cache key based on theme properties and options - const cacheKey = `${themeId}-${includeThemeId}-${JSON.stringify({ - palette: muiTheme.palette, - typography: muiTheme.typography, - spacing: muiTheme.spacing, - shape: muiTheme.shape, - })}`; - - // Check cache first - if (cssCache.has(cacheKey)) { - return cssCache.get(cacheKey)!; - } - - const options: ConvertMuiToBuiThemeOptions = { + return convertMuiToBuiTheme(muiTheme, { themeId, includeThemeId, - }; - const result = convertMuiToBuiTheme(muiTheme, options); - - // Cache the result - cssCache.set(cacheKey, result); - - // Clean up old cache entries (keep only last 50) - if (cssCache.size > 50) { - const firstKey = cssCache.keys().next().value; - if (firstKey) { - cssCache.delete(firstKey); - } - } - - return result; + }); }, [muiTheme, themeId, includeThemeId]); useEffect(() => { From 8ceba35b280d7daac1ad66ae9fab1b954f175998 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 16:42:36 +0200 Subject: [PATCH 129/177] bui-themer: switch theme cards to use tabs Signed-off-by: Patrik Oldsberg --- .../BuiThemerPage/BuiThemerPage.tsx | 184 +++++++++++------- 1 file changed, 109 insertions(+), 75 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 061ea379cd..90e7d21902 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -27,6 +27,10 @@ import { HeaderPage, Text, Switch, + Tabs, + TabList, + Tab, + TabPanel, } from '@backstage/ui'; import { convertMuiToBuiTheme } from './convertMuiToBuiTheme'; @@ -46,6 +50,7 @@ function ThemeContent({ const [generatedCss, setGeneratedCss] = useState(''); const [isPreviewMode, setIsPreviewMode] = useState(false); const [includeThemeId, setIncludeThemeId] = useState(false); + const [activeTab, setActiveTab] = useState('css'); const css = useMemo(() => { return convertMuiToBuiTheme(muiTheme, { @@ -123,85 +128,114 @@ function ThemeContent({ - - - - Generated CSS: - - - {generatedCss} - - + setActiveTab(key as string)} + > + + Generated CSS + Live Preview + - {isPreviewMode && ( - - - Live Preview: - - - - - Solid Button - - - Tint Button - - - Surface Card - - + + + + Generated CSS: + + + {generatedCss} + - - )} + + + + + + + + + {isPreviewMode ? ( + + + Live Preview: + + + + + Solid Button + + + Tint Button + + + Surface Card + + + + + ) : ( + + + Click "Start Preview" to see the theme applied to sample + components. + + + )} + + + From 3cb8a3aa88f004975f75d6f5a808425860dd92c3 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Sep 2025 17:19:13 +0200 Subject: [PATCH 130/177] bui-themer: new and improved preview Signed-off-by: Patrik Oldsberg --- .../BuiThemerPage/BuiThemerPage.tsx | 227 ++++++++++-------- 1 file changed, 133 insertions(+), 94 deletions(-) diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 90e7d21902..a65c35d665 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -31,6 +31,13 @@ import { TabList, Tab, TabPanel, + TextField, + Select, + Checkbox, + Radio, + RadioGroup, + CardHeader, + CardBody, } from '@backstage/ui'; import { convertMuiToBuiTheme } from './convertMuiToBuiTheme'; @@ -41,6 +48,128 @@ interface ThemeContentProps { muiTheme: Theme; } +interface IsolatedPreviewProps { + mode: 'light' | 'dark'; + css: string; +} + +function BuiThemePreview({ mode, css }: IsolatedPreviewProps) { + return ( +
line.trim().startsWith('--bui-')) + .map(line => { + const [key, value] = line.trim().split(':'); + return [key?.trim(), value?.replace(';', '').trim()]; + }) + .filter(([key, value]) => key && value), + ), + width: '100%', + backgroundColor: 'var(--bui-bg-surface-2)', + padding: 'var(--bui-space-3)', + borderRadius: 'var(--bui-radius-2)', + }} + > + + + Theme Preview + + + This preview shows how your theme will look with various Backstage + UI components + + + + + + Button Variants + + + + + + + + + + + Form Inputs + + + + + + + + Option 1 + + Option 2 + + Option 3 + + + + + + + Surface Variations + + + + Surface 1 + + + Surface 2 + + + Solid + + + + + +
+ ); +} diff --git a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx index 856790161b..bb3e797bb1 100644 --- a/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx +++ b/plugins/bui-themer/src/components/BuiThemerPage/BuiThemerPage.tsx @@ -14,264 +14,11 @@ * limitations under the License. */ -import { useMemo, useState, useCallback } from 'react'; -import { AppTheme, useApi } from '@backstage/core-plugin-api'; +import { useApi } from '@backstage/core-plugin-api'; import { appThemeApiRef } from '@backstage/core-plugin-api'; -import { Theme, useTheme } from '@mui/material/styles'; -import { - Box, - Button, - Card, - Container, - Flex, - HeaderPage, - Text, - Tabs, - TabList, - Tab, - TabPanel, - TextField, - Select, - Checkbox, - Radio, - RadioGroup, - CardHeader, - CardBody, -} from '@backstage/ui'; -import { convertMuiToBuiTheme } from './convertMuiToBuiTheme'; - -interface ThemeContentProps { - themeId: string; - themeTitle: string; - variant: 'light' | 'dark'; - muiTheme: Theme; -} - -interface IsolatedPreviewProps { - mode: 'light' | 'dark'; - styleObject: Record; -} - -function BuiThemePreview({ mode, styleObject }: IsolatedPreviewProps) { - return ( -
- - - Theme Preview - - - This preview shows how your theme will look with various Backstage - UI components - - - - - - Button Variants - - - - - - - - - - - Form Inputs - - - -