From 965d84af25746ace20f6894e9dc97f4fd3bd665b Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 20 Mar 2023 13:28:00 +0100 Subject: [PATCH 01/73] Pass in event broker to notify on conflicts Signed-off-by: sblausten --- packages/backend/src/plugins/catalog.ts | 14 ++++++++++++++ plugins/catalog-backend/package.json | 1 + .../src/database/DefaultProcessingDatabase.ts | 14 ++++++++++++++ .../catalog-backend/src/service/CatalogBuilder.ts | 8 ++++++++ plugins/events-backend/src/index.ts | 1 + yarn.lock | 4 +++- 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index f6fe25f86a..53204d6957 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -19,14 +19,28 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; +import { InMemoryEventBroker } from '@backstage/plugin-events-backend'; +import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; export default async function createPlugin( env: PluginEnvironment, providers?: Array, ): Promise { const builder = await CatalogBuilder.create(env); + const githubEntityProviders = GithubEntityProvider.fromConfig(env.config, { + logger: env.logger, + // optional: alternatively, use scheduler with schedule defined in app-config.yaml + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 5 }, + timeout: { minutes: 3 }, + }), + scheduler: env.scheduler, + }); + builder.addEntityProvider(githubEntityProviders); builder.addProcessor(new ScaffolderEntitiesProcessor()); builder.addEntityProvider(providers ?? []); + const conflictBroker = new InMemoryEventBroker(env.logger); + builder.setConflictEventBroker(conflictBroker); const { processingEngine, router } = await builder.build(); await processingEngine.start(); return router; diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 1e837fd9ba..6805a0d21e 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -54,6 +54,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", + "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 761f5bfd72..4fe24eab97 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -44,6 +44,7 @@ import { checkLocationKeyConflict } from './operations/refreshState/checkLocatio import { insertUnprocessedEntity } from './operations/refreshState/insertUnprocessedEntity'; import { updateUnprocessedEntity } from './operations/refreshState/updateUnprocessedEntity'; import { generateStableHash } from './util'; +import { EventBroker } from '@backstage/plugin-events-node'; // The number of items that are sent per batch to the database layer, when // doing .batchInsert calls to knex. This needs to be low enough to not cause @@ -57,6 +58,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { database: Knex; logger: Logger; refreshInterval: ProcessingIntervalFunction; + conflictEventBroker?: EventBroker; }, ) { initDatabaseMetrics(options.database); @@ -356,6 +358,18 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { this.options.logger.warn( `Detected conflicting entityRef ${entityRef} already referenced by ${conflictingKey} and now also ${locationKey}`, ); + if (this.options.conflictEventBroker) { + this.options.conflictEventBroker?.publish({ + topic: 'conflicting-entities', + eventPayload: { + ...entity, + entityRef, + newLocationKey: locationKey, + existingLocationKey: conflictingKey, + }, + metadata: {}, + }); + } } } diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 7da5d69767..d0584477ab 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -98,6 +98,7 @@ import { import { AuthorizedLocationService } from './AuthorizedLocationService'; import { DefaultProviderDatabase } from '../database/DefaultProviderDatabase'; import { DefaultCatalogDatabase } from '../database/DefaultCatalogDatabase'; +import { EventBroker } from '@backstage/plugin-events-node'; /** * This is a duplicate of the alpha `CatalogPermissionRule` type, for use in the stable API. @@ -166,6 +167,7 @@ export class CatalogBuilder { private readonly permissionRules: CatalogPermissionRuleInput[]; private allowedLocationType: string[]; private legacySingleProcessorValidation = false; + private conflictEventBroker?: EventBroker; /** * Creates a catalog builder. @@ -417,6 +419,11 @@ export class CatalogBuilder { return this; } + setConflictEventBroker(broker: EventBroker): CatalogBuilder { + this.conflictEventBroker = broker; + return this; + } + /** * Wires up and returns all of the component parts of the catalog */ @@ -440,6 +447,7 @@ export class CatalogBuilder { database: dbClient, logger, refreshInterval: this.processingInterval, + conflictEventBroker: this.conflictEventBroker, }); const providerDatabase = new DefaultProviderDatabase({ database: dbClient, diff --git a/plugins/events-backend/src/index.ts b/plugins/events-backend/src/index.ts index 4645e9a479..215ea2c203 100644 --- a/plugins/events-backend/src/index.ts +++ b/plugins/events-backend/src/index.ts @@ -21,4 +21,5 @@ */ export { EventsBackend } from './service/EventsBackend'; +export { InMemoryEventBroker } from './service/InMemoryEventBroker'; export { HttpPostIngressEventPublisher } from './service/http'; diff --git a/yarn.lock b/yarn.lock index adc0ba595e..f078ec6138 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5006,7 +5006,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": +"@backstage/plugin-catalog-backend-module-github@workspace:^, @backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github" dependencies: @@ -5204,6 +5204,7 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" + "@backstage/plugin-events-node": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" @@ -22508,6 +22509,7 @@ __metadata: "@backstage/plugin-azure-sites-backend": "workspace:^" "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-backend-module-github": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-entity-feedback-backend": "workspace:^" From 9d3bd37defa152e1c423d070571f1a7be61d1d31 Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 20 Mar 2023 16:05:44 +0100 Subject: [PATCH 02/73] Working example Signed-off-by: sblausten --- packages/backend/package.json | 1 + packages/backend/src/index.ts | 6 +-- packages/backend/src/plugins/catalog.ts | 4 ++ .../src/plugins/conflictEventSubscriber.ts | 50 +++++++++++++++++++ .../src/database/DefaultProcessingDatabase.ts | 4 +- 5 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 packages/backend/src/plugins/conflictEventSubscriber.ts diff --git a/packages/backend/package.json b/packages/backend/package.json index 54dbe640df..d91428ac9e 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,6 +40,7 @@ "@backstage/plugin-azure-sites-backend": "workspace:^", "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-backend-module-github": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-code-coverage-backend": "workspace:^", "@backstage/plugin-entity-feedback-backend": "workspace:^", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 011be941cf..cfd18f243a 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -38,11 +38,10 @@ import { import { TaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; -import { metricsInit, metricsHandler } from './metrics'; +import { metricsHandler, metricsInit } from './metrics'; import auth from './plugins/auth'; import azureDevOps from './plugins/azure-devops'; import catalog from './plugins/catalog'; -import catalogEventBasedProviders from './plugins/catalogEventBasedProviders'; import codeCoverage from './plugins/codecoverage'; import entityFeedback from './plugins/entityFeedback'; import events from './plugins/events'; @@ -68,6 +67,7 @@ import linguist from './plugins/linguist'; import { PluginEnvironment } from './types'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; +import createCatalogEventBasedProviders from './plugins/catalogEventBasedProviders'; function makeCreateEnv(config: Config) { const root = getRootLogger(); @@ -156,7 +156,7 @@ async function main() { const exploreEnv = useHotMemoize(module, () => createEnv('explore')); const lighthouseEnv = useHotMemoize(module, () => createEnv('lighthouse')); - const eventBasedEntityProviders = await catalogEventBasedProviders( + const eventBasedEntityProviders = await createCatalogEventBasedProviders( catalogEnv, ); const linguistEnv = useHotMemoize(module, () => createEnv('linguist')); diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 53204d6957..a70e56d301 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -21,6 +21,7 @@ import { Router } from 'express'; import { PluginEnvironment } from '../types'; import { InMemoryEventBroker } from '@backstage/plugin-events-backend'; import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; +import { ConflictEventSubscriber } from './conflictEventSubscriber'; export default async function createPlugin( env: PluginEnvironment, @@ -40,6 +41,9 @@ export default async function createPlugin( builder.addProcessor(new ScaffolderEntitiesProcessor()); builder.addEntityProvider(providers ?? []); const conflictBroker = new InMemoryEventBroker(env.logger); + conflictBroker.subscribe( + new ConflictEventSubscriber(env.logger, ['conflicts']), + ); builder.setConflictEventBroker(conflictBroker); const { processingEngine, router } = await builder.build(); await processingEngine.start(); diff --git a/packages/backend/src/plugins/conflictEventSubscriber.ts b/packages/backend/src/plugins/conflictEventSubscriber.ts new file mode 100644 index 0000000000..746d01cca6 --- /dev/null +++ b/packages/backend/src/plugins/conflictEventSubscriber.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + EntityProvider, + EntityProviderConnection, +} from '@backstage/plugin-catalog-node'; +import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; +import { Logger } from 'winston'; + +export class ConflictEventSubscriber + implements EntityProvider, EventSubscriber +{ + constructor( + private readonly logger: Logger, + private readonly topics: string[], + ) {} + + async onEvent(params: EventParams): Promise { + this.logger.info( + `onEvent: topic=${params.topic}, metadata=${JSON.stringify( + params.metadata, + )}, payload=${JSON.stringify(params.eventPayload)}`, + ); + } + + supportsEventTopics(): string[] { + return this.topics; + } + + async connect(_: EntityProviderConnection): Promise { + // not doing anything here + } + + getProviderName(): string { + return ConflictEventSubscriber.name; + } +} diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 4fe24eab97..f7e9a0c81c 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -359,8 +359,8 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { `Detected conflicting entityRef ${entityRef} already referenced by ${conflictingKey} and now also ${locationKey}`, ); if (this.options.conflictEventBroker) { - this.options.conflictEventBroker?.publish({ - topic: 'conflicting-entities', + await this.options.conflictEventBroker?.publish({ + topic: 'conflicts', eventPayload: { ...entity, entityRef, From d38a97ed74bb2b3caf91b9239c70192299c20963 Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 20 Mar 2023 16:11:26 +0100 Subject: [PATCH 03/73] Remove example code Signed-off-by: sblausten --- packages/backend/package.json | 1 - packages/backend/src/index.ts | 6 +-- packages/backend/src/plugins/catalog.ts | 18 ------- .../src/plugins/conflictEventSubscriber.ts | 50 ------------------- 4 files changed, 3 insertions(+), 72 deletions(-) delete mode 100644 packages/backend/src/plugins/conflictEventSubscriber.ts diff --git a/packages/backend/package.json b/packages/backend/package.json index d91428ac9e..54dbe640df 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,7 +40,6 @@ "@backstage/plugin-azure-sites-backend": "workspace:^", "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", - "@backstage/plugin-catalog-backend-module-github": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-code-coverage-backend": "workspace:^", "@backstage/plugin-entity-feedback-backend": "workspace:^", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index cfd18f243a..011be941cf 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -38,10 +38,11 @@ import { import { TaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; -import { metricsHandler, metricsInit } from './metrics'; +import { metricsInit, metricsHandler } from './metrics'; import auth from './plugins/auth'; import azureDevOps from './plugins/azure-devops'; import catalog from './plugins/catalog'; +import catalogEventBasedProviders from './plugins/catalogEventBasedProviders'; import codeCoverage from './plugins/codecoverage'; import entityFeedback from './plugins/entityFeedback'; import events from './plugins/events'; @@ -67,7 +68,6 @@ import linguist from './plugins/linguist'; import { PluginEnvironment } from './types'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; import { DefaultIdentityClient } from '@backstage/plugin-auth-node'; -import createCatalogEventBasedProviders from './plugins/catalogEventBasedProviders'; function makeCreateEnv(config: Config) { const root = getRootLogger(); @@ -156,7 +156,7 @@ async function main() { const exploreEnv = useHotMemoize(module, () => createEnv('explore')); const lighthouseEnv = useHotMemoize(module, () => createEnv('lighthouse')); - const eventBasedEntityProviders = await createCatalogEventBasedProviders( + const eventBasedEntityProviders = await catalogEventBasedProviders( catalogEnv, ); const linguistEnv = useHotMemoize(module, () => createEnv('linguist')); diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index a70e56d301..f6fe25f86a 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -19,32 +19,14 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; -import { InMemoryEventBroker } from '@backstage/plugin-events-backend'; -import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; -import { ConflictEventSubscriber } from './conflictEventSubscriber'; export default async function createPlugin( env: PluginEnvironment, providers?: Array, ): Promise { const builder = await CatalogBuilder.create(env); - const githubEntityProviders = GithubEntityProvider.fromConfig(env.config, { - logger: env.logger, - // optional: alternatively, use scheduler with schedule defined in app-config.yaml - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 5 }, - timeout: { minutes: 3 }, - }), - scheduler: env.scheduler, - }); - builder.addEntityProvider(githubEntityProviders); builder.addProcessor(new ScaffolderEntitiesProcessor()); builder.addEntityProvider(providers ?? []); - const conflictBroker = new InMemoryEventBroker(env.logger); - conflictBroker.subscribe( - new ConflictEventSubscriber(env.logger, ['conflicts']), - ); - builder.setConflictEventBroker(conflictBroker); const { processingEngine, router } = await builder.build(); await processingEngine.start(); return router; diff --git a/packages/backend/src/plugins/conflictEventSubscriber.ts b/packages/backend/src/plugins/conflictEventSubscriber.ts deleted file mode 100644 index 746d01cca6..0000000000 --- a/packages/backend/src/plugins/conflictEventSubscriber.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { - EntityProvider, - EntityProviderConnection, -} from '@backstage/plugin-catalog-node'; -import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; -import { Logger } from 'winston'; - -export class ConflictEventSubscriber - implements EntityProvider, EventSubscriber -{ - constructor( - private readonly logger: Logger, - private readonly topics: string[], - ) {} - - async onEvent(params: EventParams): Promise { - this.logger.info( - `onEvent: topic=${params.topic}, metadata=${JSON.stringify( - params.metadata, - )}, payload=${JSON.stringify(params.eventPayload)}`, - ); - } - - supportsEventTopics(): string[] { - return this.topics; - } - - async connect(_: EntityProviderConnection): Promise { - // not doing anything here - } - - getProviderName(): string { - return ConflictEventSubscriber.name; - } -} From 44c7ad6b8e117cf5a689ca3191694acf22f9006f Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 20 Mar 2023 16:18:05 +0100 Subject: [PATCH 04/73] Api reports and changeset Signed-off-by: sblausten --- .changeset/sweet-fans-juggle.md | 6 ++++++ plugins/catalog-backend/api-report.md | 3 +++ plugins/events-backend/api-report.md | 12 ++++++++++++ .../src/service/InMemoryEventBroker.ts | 2 ++ yarn.lock | 3 +-- 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 .changeset/sweet-fans-juggle.md diff --git a/.changeset/sweet-fans-juggle.md b/.changeset/sweet-fans-juggle.md new file mode 100644 index 0000000000..e90e4643f8 --- /dev/null +++ b/.changeset/sweet-fans-juggle.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-events-backend': patch +--- + +Adds an optional eventBroker for sending an event when there are conflicts, and exports InMemoryBroker for use in other plugins. diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 5e7b2dee02..e22aa622fb 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -31,6 +31,7 @@ import { EntityProvider as EntityProvider_2 } from '@backstage/plugin-catalog-no import { EntityProviderConnection as EntityProviderConnection_2 } from '@backstage/plugin-catalog-node'; import { EntityProviderMutation as EntityProviderMutation_2 } from '@backstage/plugin-catalog-node'; import { EntityRelationSpec as EntityRelationSpec_2 } from '@backstage/plugin-catalog-node'; +import { EventBroker } from '@backstage/plugin-events-node'; import { GetEntitiesRequest } from '@backstage/catalog-client'; import { JsonValue } from '@backstage/types'; import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common'; @@ -139,6 +140,8 @@ export class CatalogBuilder { replaceEntityPolicies(policies: EntityPolicy[]): CatalogBuilder; replaceProcessors(processors: CatalogProcessor_2[]): CatalogBuilder; setAllowedLocationTypes(allowedLocationTypes: string[]): CatalogBuilder; + // (undocumented) + setConflictEventBroker(broker: EventBroker): CatalogBuilder; setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder; setFieldFormatValidators(validators: Partial): CatalogBuilder; setLocationAnalyzer(locationAnalyzer: LocationAnalyzer): CatalogBuilder; diff --git a/plugins/events-backend/api-report.md b/plugins/events-backend/api-report.md index 7d8ede1979..5d520f10c2 100644 --- a/plugins/events-backend/api-report.md +++ b/plugins/events-backend/api-report.md @@ -5,6 +5,7 @@ ```ts import { Config } from '@backstage/config'; import { EventBroker } from '@backstage/plugin-events-node'; +import { EventParams } from '@backstage/plugin-events-node'; import { EventPublisher } from '@backstage/plugin-events-node'; import { EventSubscriber } from '@backstage/plugin-events-node'; import express from 'express'; @@ -42,4 +43,15 @@ export class HttpPostIngressEventPublisher implements EventPublisher { // (undocumented) setEventBroker(eventBroker: EventBroker): Promise; } + +// @public +export class InMemoryEventBroker implements EventBroker { + constructor(logger: Logger); + // (undocumented) + publish(params: EventParams): Promise; + // (undocumented) + subscribe( + ...subscribers: Array> + ): void; +} ``` diff --git a/plugins/events-backend/src/service/InMemoryEventBroker.ts b/plugins/events-backend/src/service/InMemoryEventBroker.ts index 04be01f658..d800d88dc5 100644 --- a/plugins/events-backend/src/service/InMemoryEventBroker.ts +++ b/plugins/events-backend/src/service/InMemoryEventBroker.ts @@ -25,6 +25,8 @@ import { Logger } from 'winston'; * In-memory event broker which will pass the event to all registered subscribers * interested in it. * Events will not be persisted in any form. + * + * @public */ // TODO(pjungermann): add prom metrics? (see plugins/catalog-backend/src/util/metrics.ts, etc.) export class InMemoryEventBroker implements EventBroker { diff --git a/yarn.lock b/yarn.lock index f078ec6138..5ad56a501c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5006,7 +5006,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-backend-module-github@workspace:^, @backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": +"@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github" dependencies: @@ -22509,7 +22509,6 @@ __metadata: "@backstage/plugin-azure-sites-backend": "workspace:^" "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" - "@backstage/plugin-catalog-backend-module-github": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-entity-feedback-backend": "workspace:^" From 3844a954bd925869fbcde2d4f3a486769bff2028 Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 20 Mar 2023 16:24:58 +0100 Subject: [PATCH 05/73] Add detail to api report Signed-off-by: sblausten --- plugins/catalog-backend/api-report.md | 1 - plugins/catalog-backend/src/service/CatalogBuilder.ts | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index e22aa622fb..7babcc5bf6 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -140,7 +140,6 @@ export class CatalogBuilder { replaceEntityPolicies(policies: EntityPolicy[]): CatalogBuilder; replaceProcessors(processors: CatalogProcessor_2[]): CatalogBuilder; setAllowedLocationTypes(allowedLocationTypes: string[]): CatalogBuilder; - // (undocumented) setConflictEventBroker(broker: EventBroker): CatalogBuilder; setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder; setFieldFormatValidators(validators: Partial): CatalogBuilder; diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index d0584477ab..dc6a5ab533 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -419,6 +419,10 @@ export class CatalogBuilder { return this; } + /** + * Enables the publishing of events for conflicting entities so that a subscriber + * can listen to them and implement a conflict resolution strategy like retries. + */ setConflictEventBroker(broker: EventBroker): CatalogBuilder { this.conflictEventBroker = broker; return this; From a6ef0169d3f430db3c5d77674e95240eabf33d64 Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 20 Mar 2023 16:30:55 +0100 Subject: [PATCH 06/73] Fix changeset Signed-off-by: sblausten --- .changeset/sweet-fans-juggle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/sweet-fans-juggle.md b/.changeset/sweet-fans-juggle.md index e90e4643f8..db8abd8ca6 100644 --- a/.changeset/sweet-fans-juggle.md +++ b/.changeset/sweet-fans-juggle.md @@ -3,4 +3,4 @@ '@backstage/plugin-events-backend': patch --- -Adds an optional eventBroker for sending an event when there are conflicts, and exports InMemoryBroker for use in other plugins. +Adds an optional `EventBroker` for sending an event when there are conflicts, and exports `InMemoryBroker` for use in other plugins. From 8b9073e2c71e1eef81a9a90a081ecbf423dd7cdf Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 21 Mar 2023 15:50:59 +0100 Subject: [PATCH 07/73] PR comments Signed-off-by: sblausten --- plugins/catalog-backend/api-report.md | 2 +- .../src/database/DefaultProcessingDatabase.ts | 10 +++++----- plugins/catalog-backend/src/service/CatalogBuilder.ts | 11 +++++------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 7babcc5bf6..f93f2d354f 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -140,8 +140,8 @@ export class CatalogBuilder { replaceEntityPolicies(policies: EntityPolicy[]): CatalogBuilder; replaceProcessors(processors: CatalogProcessor_2[]): CatalogBuilder; setAllowedLocationTypes(allowedLocationTypes: string[]): CatalogBuilder; - setConflictEventBroker(broker: EventBroker): CatalogBuilder; setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder; + setEventBroker(broker: EventBroker): CatalogBuilder; setFieldFormatValidators(validators: Partial): CatalogBuilder; setLocationAnalyzer(locationAnalyzer: LocationAnalyzer): CatalogBuilder; setPlaceholderResolver( diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index f7e9a0c81c..f5159f4010 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -58,7 +58,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { database: Knex; logger: Logger; refreshInterval: ProcessingIntervalFunction; - conflictEventBroker?: EventBroker; + eventBroker?: EventBroker; }, ) { initDatabaseMetrics(options.database); @@ -358,11 +358,11 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { this.options.logger.warn( `Detected conflicting entityRef ${entityRef} already referenced by ${conflictingKey} and now also ${locationKey}`, ); - if (this.options.conflictEventBroker) { - await this.options.conflictEventBroker?.publish({ - topic: 'conflicts', + if (this.options.eventBroker) { + await this.options.eventBroker?.publish({ + topic: 'catalog.conflicts', eventPayload: { - ...entity, + entity, entityRef, newLocationKey: locationKey, existingLocationKey: conflictingKey, diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index dc6a5ab533..59a5afce38 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -167,7 +167,7 @@ export class CatalogBuilder { private readonly permissionRules: CatalogPermissionRuleInput[]; private allowedLocationType: string[]; private legacySingleProcessorValidation = false; - private conflictEventBroker?: EventBroker; + private eventBroker?: EventBroker; /** * Creates a catalog builder. @@ -420,11 +420,10 @@ export class CatalogBuilder { } /** - * Enables the publishing of events for conflicting entities so that a subscriber - * can listen to them and implement a conflict resolution strategy like retries. + * Enables the publishing of events for cloflicts in the DefaultProcessingDatabase */ - setConflictEventBroker(broker: EventBroker): CatalogBuilder { - this.conflictEventBroker = broker; + setEventBroker(broker: EventBroker): CatalogBuilder { + this.eventBroker = broker; return this; } @@ -451,7 +450,7 @@ export class CatalogBuilder { database: dbClient, logger, refreshInterval: this.processingInterval, - conflictEventBroker: this.conflictEventBroker, + eventBroker: this.eventBroker, }); const providerDatabase = new DefaultProviderDatabase({ database: dbClient, From 2632cda41aa74e0658af9117a0c9c00250be6d81 Mon Sep 17 00:00:00 2001 From: sblausten Date: Wed, 22 Mar 2023 09:59:51 +0100 Subject: [PATCH 08/73] Add timestamp to event Signed-off-by: sblausten --- .../catalog-backend/src/database/DefaultProcessingDatabase.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index f5159f4010..64bc16db6f 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -45,6 +45,7 @@ import { insertUnprocessedEntity } from './operations/refreshState/insertUnproce import { updateUnprocessedEntity } from './operations/refreshState/updateUnprocessedEntity'; import { generateStableHash } from './util'; import { EventBroker } from '@backstage/plugin-events-node'; +import { DateTime } from 'luxon'; // The number of items that are sent per batch to the database layer, when // doing .batchInsert calls to knex. This needs to be low enough to not cause @@ -366,6 +367,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { entityRef, newLocationKey: locationKey, existingLocationKey: conflictingKey, + lastConflictAt: DateTime.now().toISO(), }, metadata: {}, }); From e70e36d72c9085ba8c5d2a306a378f734b2f1c54 Mon Sep 17 00:00:00 2001 From: sblausten Date: Wed, 22 Mar 2023 10:00:28 +0100 Subject: [PATCH 09/73] Remove unused metadata field Signed-off-by: sblausten --- .../catalog-backend/src/database/DefaultProcessingDatabase.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 64bc16db6f..2a51227983 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -369,7 +369,6 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { existingLocationKey: conflictingKey, lastConflictAt: DateTime.now().toISO(), }, - metadata: {}, }); } } From e544eb27137282c3892a0499cca8dc185ca2d76c Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 30 Mar 2023 13:00:31 +0200 Subject: [PATCH 10/73] Export conflict topic name Signed-off-by: sblausten --- packages/backend/src/plugins/catalog.ts | 16 ++++++++++++++++ plugins/catalog-backend/api-report.md | 3 +++ .../src/database/DefaultProcessingDatabase.ts | 3 ++- .../src/service/CatalogBuilder.ts | 3 +++ plugins/catalog-backend/src/service/index.ts | 2 +- 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index f6fe25f86a..8cf44f9722 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -19,14 +19,30 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; +import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; export default async function createPlugin( env: PluginEnvironment, providers?: Array, ): Promise { const builder = await CatalogBuilder.create(env); + const githubEntityProviders = GithubEntityProvider.fromConfig(env.config, { + logger: env.logger, + // optional: alternatively, use scheduler with schedule defined in app-config.yaml + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 5 }, + timeout: { minutes: 3 }, + }), + scheduler: env.scheduler, + }); + builder.addEntityProvider(githubEntityProviders); builder.addProcessor(new ScaffolderEntitiesProcessor()); builder.addEntityProvider(providers ?? []); + // const conflictBroker = new InMemoryEventBroker(env.logger); + // conflictBroker.subscribe( + // new ConflictEventSubscriber(env.logger, ['conflicts']), + // ); + // builder.setConflictEventBroker(conflictBroker); const { processingEngine, router } = await builder.build(); await processingEngine.start(); return router; diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index eae8c0b9e4..1317481046 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -167,6 +167,9 @@ export class CatalogBuilder { export type CatalogCollatorEntityTransformer = CatalogCollatorEntityTransformer_2; +// @public (undocumented) +export const catalogConflictsTopic = 'catalog.conflict'; + // @public (undocumented) export type CatalogEnvironment = { logger: Logger; diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 2a51227983..4b701758ec 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -46,6 +46,7 @@ import { updateUnprocessedEntity } from './operations/refreshState/updateUnproce import { generateStableHash } from './util'; import { EventBroker } from '@backstage/plugin-events-node'; import { DateTime } from 'luxon'; +import { catalogConflictsTopic } from '../service'; // The number of items that are sent per batch to the database layer, when // doing .batchInsert calls to knex. This needs to be low enough to not cause @@ -361,7 +362,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { ); if (this.options.eventBroker) { await this.options.eventBroker?.publish({ - topic: 'catalog.conflicts', + topic: catalogConflictsTopic, eventPayload: { entity, entityRef, diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index c0d5c7acc7..39a40c95de 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -118,6 +118,9 @@ export type CatalogEnvironment = { permissions: PermissionEvaluator | PermissionAuthorizer; }; +/** @public */ +export const catalogConflictsTopic = 'catalog.conflict'; + /** * A builder that helps wire up all of the component parts of the catalog. * diff --git a/plugins/catalog-backend/src/service/index.ts b/plugins/catalog-backend/src/service/index.ts index 44645d39fe..70c65cf08f 100644 --- a/plugins/catalog-backend/src/service/index.ts +++ b/plugins/catalog-backend/src/service/index.ts @@ -18,4 +18,4 @@ export type { CatalogEnvironment, CatalogPermissionRuleInput, } from './CatalogBuilder'; -export { CatalogBuilder } from './CatalogBuilder'; +export { CatalogBuilder, catalogConflictsTopic } from './CatalogBuilder'; From 7565b498320769df467ce13c2e6698d21283bce3 Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 30 Mar 2023 13:04:42 +0200 Subject: [PATCH 11/73] Remove test code Signed-off-by: sblausten --- packages/backend/src/plugins/catalog.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 8cf44f9722..f6fe25f86a 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -19,30 +19,14 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; -import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; export default async function createPlugin( env: PluginEnvironment, providers?: Array, ): Promise { const builder = await CatalogBuilder.create(env); - const githubEntityProviders = GithubEntityProvider.fromConfig(env.config, { - logger: env.logger, - // optional: alternatively, use scheduler with schedule defined in app-config.yaml - schedule: env.scheduler.createScheduledTaskRunner({ - frequency: { minutes: 5 }, - timeout: { minutes: 3 }, - }), - scheduler: env.scheduler, - }); - builder.addEntityProvider(githubEntityProviders); builder.addProcessor(new ScaffolderEntitiesProcessor()); builder.addEntityProvider(providers ?? []); - // const conflictBroker = new InMemoryEventBroker(env.logger); - // conflictBroker.subscribe( - // new ConflictEventSubscriber(env.logger, ['conflicts']), - // ); - // builder.setConflictEventBroker(conflictBroker); const { processingEngine, router } = await builder.build(); await processingEngine.start(); return router; From fb8c2971ae83e3b5e391520858bc98f3be1e222f Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 30 Mar 2023 15:35:53 +0200 Subject: [PATCH 12/73] Change constant export Signed-off-by: sblausten --- plugins/catalog-backend/api-report.md | 6 +++--- plugins/catalog-backend/src/constants.ts | 18 ++++++++++++++++++ .../src/database/DefaultProcessingDatabase.ts | 4 ++-- plugins/catalog-backend/src/index.ts | 1 + .../src/service/CatalogBuilder.ts | 3 --- plugins/catalog-backend/src/service/index.ts | 2 +- 6 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 plugins/catalog-backend/src/constants.ts diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 1317481046..59d198a18a 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -113,6 +113,9 @@ export class BuiltinKindsEntityProcessor implements CatalogProcessor_2 { validateEntityKind(entity: Entity): Promise; } +// @public (undocumented) +export const CATALOG_CONFLICTS_TOPIC = 'catalog.conflict'; + // @public export class CatalogBuilder { addEntityPolicy( @@ -167,9 +170,6 @@ export class CatalogBuilder { export type CatalogCollatorEntityTransformer = CatalogCollatorEntityTransformer_2; -// @public (undocumented) -export const catalogConflictsTopic = 'catalog.conflict'; - // @public (undocumented) export type CatalogEnvironment = { logger: Logger; diff --git a/plugins/catalog-backend/src/constants.ts b/plugins/catalog-backend/src/constants.ts new file mode 100644 index 0000000000..2ba21da629 --- /dev/null +++ b/plugins/catalog-backend/src/constants.ts @@ -0,0 +1,18 @@ +/* + * 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. + */ + +/** @public */ +export const CATALOG_CONFLICTS_TOPIC = 'catalog.conflict'; diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 4b701758ec..e634d18c4a 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -46,7 +46,7 @@ import { updateUnprocessedEntity } from './operations/refreshState/updateUnproce import { generateStableHash } from './util'; import { EventBroker } from '@backstage/plugin-events-node'; import { DateTime } from 'luxon'; -import { catalogConflictsTopic } from '../service'; +import { CATALOG_CONFLICTS_TOPIC } from '../constants'; // The number of items that are sent per batch to the database layer, when // doing .batchInsert calls to knex. This needs to be low enough to not cause @@ -362,7 +362,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { ); if (this.options.eventBroker) { await this.options.eventBroker?.publish({ - topic: catalogConflictsTopic, + topic: CATALOG_CONFLICTS_TOPIC, eventPayload: { entity, entityRef, diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts index eca155ce46..345102adcd 100644 --- a/plugins/catalog-backend/src/index.ts +++ b/plugins/catalog-backend/src/index.ts @@ -27,6 +27,7 @@ export * from './processing'; export * from './search'; export * from './service'; export * from './deprecated'; +export * from './constants'; import { DefaultCatalogCollatorFactory as _DefaultCatalogCollatorFactory, diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 39a40c95de..c0d5c7acc7 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -118,9 +118,6 @@ export type CatalogEnvironment = { permissions: PermissionEvaluator | PermissionAuthorizer; }; -/** @public */ -export const catalogConflictsTopic = 'catalog.conflict'; - /** * A builder that helps wire up all of the component parts of the catalog. * diff --git a/plugins/catalog-backend/src/service/index.ts b/plugins/catalog-backend/src/service/index.ts index 70c65cf08f..44645d39fe 100644 --- a/plugins/catalog-backend/src/service/index.ts +++ b/plugins/catalog-backend/src/service/index.ts @@ -18,4 +18,4 @@ export type { CatalogEnvironment, CatalogPermissionRuleInput, } from './CatalogBuilder'; -export { CatalogBuilder, catalogConflictsTopic } from './CatalogBuilder'; +export { CatalogBuilder } from './CatalogBuilder'; From 1f6ef3146767d5389c494102b6849816e949be7c Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 4 Apr 2023 17:42:14 +0200 Subject: [PATCH 13/73] Refactor event to a type Signed-off-by: sblausten --- packages/backend/package.json | 1 + plugins/catalog-backend/src/catalog/types.ts | 26 +++++++++++++++++++ .../src/database/DefaultProcessingDatabase.ts | 10 ++++--- yarn.lock | 3 ++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index fd8ec82d91..a83929a15d 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,6 +40,7 @@ "@backstage/plugin-azure-sites-backend": "workspace:^", "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-backend-module-github": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-code-coverage-backend": "workspace:^", "@backstage/plugin-entity-feedback-backend": "workspace:^", diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 404b816d4f..76841af260 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -311,3 +311,29 @@ export type Cursor = { */ totalItems?: number; }; + +/** + * The details of the conflicting entity. + */ +export type CatalogConflictEventPayload = { + /** + * The new conflicting entity + */ + entity: Entity; + /** + * The new conflicting entity's ref + */ + entityRef: string; + /** + * The location key of this new conflicting entity + */ + newLocationKey: string; + /** + * The location key of the entity already in the catalog that shares the same name and namespace as this entity + */ + existingLocationKey: string; + /** + * The datetime that the conflict was processed at + */ + lastConflictAt: string; +}; diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index e634d18c4a..fe61cc694e 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -44,9 +44,10 @@ import { checkLocationKeyConflict } from './operations/refreshState/checkLocatio import { insertUnprocessedEntity } from './operations/refreshState/insertUnprocessedEntity'; import { updateUnprocessedEntity } from './operations/refreshState/updateUnprocessedEntity'; import { generateStableHash } from './util'; -import { EventBroker } from '@backstage/plugin-events-node'; +import { EventBroker, EventParams } from '@backstage/plugin-events-node'; import { DateTime } from 'luxon'; import { CATALOG_CONFLICTS_TOPIC } from '../constants'; +import { CatalogConflictEventPayload } from '../catalog/types'; // The number of items that are sent per batch to the database layer, when // doing .batchInsert calls to knex. This needs to be low enough to not cause @@ -360,8 +361,8 @@ 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) { - await this.options.eventBroker?.publish({ + if (this.options.eventBroker && locationKey) { + const eventParams: EventParams = { topic: CATALOG_CONFLICTS_TOPIC, eventPayload: { entity, @@ -370,7 +371,8 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { existingLocationKey: conflictingKey, lastConflictAt: DateTime.now().toISO(), }, - }); + }; + await this.options.eventBroker?.publish(eventParams); } } } diff --git a/yarn.lock b/yarn.lock index db64dfc04e..d9b937d457 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5142,7 +5142,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": +"@backstage/plugin-catalog-backend-module-github@workspace:^, @backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github" dependencies: @@ -23482,6 +23482,7 @@ __metadata: "@backstage/plugin-azure-sites-backend": "workspace:^" "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-backend-module-github": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-entity-feedback-backend": "workspace:^" From c5c988e3681cd91dd11aad3fe2fc28f5c07e5d09 Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 4 Apr 2023 18:07:37 +0200 Subject: [PATCH 14/73] Remove redundant export Signed-off-by: sblausten --- plugins/events-backend/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/events-backend/src/index.ts b/plugins/events-backend/src/index.ts index b7089fb07d..be173b677c 100644 --- a/plugins/events-backend/src/index.ts +++ b/plugins/events-backend/src/index.ts @@ -21,6 +21,5 @@ */ export { EventsBackend } from './service/EventsBackend'; -export { InMemoryEventBroker } from './service/InMemoryEventBroker'; export { HttpPostIngressEventPublisher } from './service/http'; export { DefaultEventBroker } from './service/DefaultEventBroker'; From 7755bb1828a56393e39def3191c4966c4e1590b7 Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 4 Apr 2023 18:20:26 +0200 Subject: [PATCH 15/73] Fix out of date api-report Signed-off-by: sblausten --- plugins/events-backend/api-report.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/plugins/events-backend/api-report.md b/plugins/events-backend/api-report.md index adbe5e3592..aeb6f9363d 100644 --- a/plugins/events-backend/api-report.md +++ b/plugins/events-backend/api-report.md @@ -54,15 +54,4 @@ export class HttpPostIngressEventPublisher implements EventPublisher { // (undocumented) setEventBroker(eventBroker: EventBroker): Promise; } - -// @public -export class InMemoryEventBroker implements EventBroker { - constructor(logger: Logger); - // (undocumented) - publish(params: EventParams): Promise; - // (undocumented) - subscribe( - ...subscribers: Array> - ): void; -} ``` From a2cdf3796bb90fe7254e8b477a8c2fc0419cabcb Mon Sep 17 00:00:00 2001 From: sblausten Date: Fri, 12 May 2023 13:48:12 +0100 Subject: [PATCH 16/73] Address PR Comments Signed-off-by: sblausten --- .changeset/sweet-fans-juggle.md | 2 +- plugins/catalog-backend/api-report.md | 2 +- plugins/catalog-backend/src/constants.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/sweet-fans-juggle.md b/.changeset/sweet-fans-juggle.md index db8abd8ca6..ffb57a3e4c 100644 --- a/.changeset/sweet-fans-juggle.md +++ b/.changeset/sweet-fans-juggle.md @@ -3,4 +3,4 @@ '@backstage/plugin-events-backend': patch --- -Adds an optional `EventBroker` for sending an event when there are conflicts, and exports `InMemoryBroker` for use in other plugins. +Adds an optional `EventBroker` for sending an event when there are conflicts. diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 0c8a688fd1..3e97442dd4 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -115,7 +115,7 @@ export class BuiltinKindsEntityProcessor implements CatalogProcessor_2 { } // @public (undocumented) -export const CATALOG_CONFLICTS_TOPIC = 'catalog.conflict'; +export const CATALOG_CONFLICTS_TOPIC = 'experimental.catalog.conflict'; // @public export class CatalogBuilder { diff --git a/plugins/catalog-backend/src/constants.ts b/plugins/catalog-backend/src/constants.ts index 2ba21da629..00ae2673e2 100644 --- a/plugins/catalog-backend/src/constants.ts +++ b/plugins/catalog-backend/src/constants.ts @@ -15,4 +15,4 @@ */ /** @public */ -export const CATALOG_CONFLICTS_TOPIC = 'catalog.conflict'; +export const CATALOG_CONFLICTS_TOPIC = 'experimental.catalog.conflict'; From 0bc5ab7058405e806a6db7297b321f498045ab0a Mon Sep 17 00:00:00 2001 From: sblausten Date: Fri, 12 May 2023 13:50:44 +0100 Subject: [PATCH 17/73] Update changeset message Signed-off-by: sblausten --- .changeset/sweet-fans-juggle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/sweet-fans-juggle.md b/.changeset/sweet-fans-juggle.md index ffb57a3e4c..af299e9cac 100644 --- a/.changeset/sweet-fans-juggle.md +++ b/.changeset/sweet-fans-juggle.md @@ -3,4 +3,4 @@ '@backstage/plugin-events-backend': patch --- -Adds an optional `EventBroker` for sending an event when there are conflicts. +Adds an optional `EventBroker` that is used for sending an event when there are conflicts, with details of the conflict so that it can be handled elsewhere. From 6a694ce98e323bbee6ba3a7523c37ceb01badad1 Mon Sep 17 00:00:00 2001 From: ohjongsung Date: Mon, 22 May 2023 16:56:38 +0900 Subject: [PATCH 18/73] Add a scaffolder action that pull-requests for Bitbucket Server Signed-off-by: ohjongsung --- .changeset/rude-bags-count.md | 5 + .../actions/builtin/createBuiltinActions.ts | 5 + .../bitbucketServerPullRequest.test.ts | 389 ++++++++++++++++++ .../publish/bitbucketServerPullRequest.ts | 262 ++++++++++++ .../actions/builtin/publish/index.ts | 1 + 5 files changed, 662 insertions(+) create mode 100644 .changeset/rude-bags-count.md create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts diff --git a/.changeset/rude-bags-count.md b/.changeset/rude-bags-count.md new file mode 100644 index 0000000000..e2498f4abf --- /dev/null +++ b/.changeset/rude-bags-count.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Add a scaffolder action that pull-requests for bitbucket server diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 747b5cdaed..28a530eb04 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -52,6 +52,7 @@ import { createPublishBitbucketAction, createPublishBitbucketCloudAction, createPublishBitbucketServerAction, + createPublishBitbucketServerPullRequestAction, createPublishGerritAction, createPublishGerritReviewAction, createPublishGithubAction, @@ -162,6 +163,10 @@ export const createBuiltinActions = ( integrations, config, }), + createPublishBitbucketServerPullRequestAction({ + integrations, + config, + }), createPublishAzureAction({ integrations, config, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.test.ts new file mode 100644 index 0000000000..af3999097f --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.test.ts @@ -0,0 +1,389 @@ +/* + * 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. + */ + +jest.mock('../helpers', () => { + return { + initRepoAndPush: jest.fn().mockResolvedValue({ + commitHash: '220f19cc36b551763d157f1b5e4a4b446165dbd6', + }), + commitAndPushRepo: jest.fn().mockResolvedValue({ + commitHash: '220f19cc36b551763d157f1b5e4a4b446165dbd6', + }), + }; +}); + +import { createPublishBitbucketServerPullRequestAction } from './bitbucketServerPullRequest'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { ScmIntegrations } from '@backstage/integration'; +import { ConfigReader } from '@backstage/config'; +import { getVoidLogger } from '@backstage/backend-common'; +import { PassThrough } from 'stream'; + +describe('publish:bitbucketServer:pull-request', () => { + const config = new ConfigReader({ + integrations: { + bitbucketServer: [ + { + host: 'hosted.bitbucket.com', + token: 'thing', + apiBaseUrl: 'https://hosted.bitbucket.com/rest/api/1.0', + }, + { + host: 'basic-auth.bitbucket.com', + username: 'test-user', + password: 'test-password', + apiBaseUrl: 'https://basic-auth.bitbucket.com/rest/api/1.0', + }, + { + host: 'no-credentials.bitbucket.com', + }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + const action = createPublishBitbucketServerPullRequestAction({ + integrations, + config, + }); + const mockContext = { + input: { + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + title: 'Add Scaffolder actions for Bitbucket Server', + description: + 'I just made a Pull Request that Add Scaffolder actions for Bitbucket Server', + targetBranch: 'master', + sourceBranch: 'develop', + }, + workspacePath: 'wsp', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + const responseOfBranches = { + size: 3, + limit: 25, + isLastPage: true, + values: [ + { + id: 'refs/heads/master', + displayId: 'master', + type: 'BRANCH', + latestCommit: 'b1041e3f9b071b3d5cacd6826b7549cd624418f1', + latestChangeset: 'b1041e3f9b071b3d5cacd6826b7549cd624418f1', + isDefault: true, + }, + { + id: 'refs/heads/develop', + displayId: 'develop', + type: 'BRANCH', + latestCommit: '98e21148205367aeb11c25a52eaca3c2945253fa', + latestChangeset: '98e21148205367aeb11c25a52eaca3c2945253fa', + isDefault: false, + }, + { + id: 'refs/heads/develop-2', + displayId: 'develop-2', + type: 'BRANCH', + latestCommit: 'b1041e3f9b071b3d5cacd6826b7549cd624418f1', + latestChangeset: 'b1041e3f9b071b3d5cacd6826b7549cd624418f1', + isDefault: false, + }, + ], + start: 0, + }; + const responseOfPullRequests = { + id: 19, + version: 0, + title: 'Test for bitbucket server pull-requests', + description: 'Test for bitbucket server pull-requests', + state: 'OPEN', + open: true, + closed: false, + createdDate: 1684200289521, + updatedDate: 1684200289521, + fromRef: { + id: 'refs/heads/develop', + displayId: 'develop', + latestCommit: '98e21148205367aeb11c25a52eaca3c2945253fa', + type: 'BRANCH', + repository: { + slug: 'repo', + id: 1812, + name: 'repo', + description: 'This is a test repo', + hierarchyId: '1da8822903a9b11a27b8', + scmId: 'git', + state: 'AVAILABLE', + statusMessage: 'Available', + forkable: true, + project: {}, + public: false, + links: {}, + }, + }, + toRef: { + id: 'refs/heads/master', + displayId: 'master', + latestCommit: 'b1041e3f9b071b3d5cacd6826b7549cd624418f1', + type: 'BRANCH', + repository: { + slug: 'repo', + id: 1812, + name: 'repo', + description: 'This is a test repo', + hierarchyId: '1da8822903a9b11a27b8', + scmId: 'git', + state: 'AVAILABLE', + statusMessage: 'Available', + forkable: true, + project: {}, + public: false, + links: {}, + }, + }, + locked: false, + author: { + user: { + name: 'test-user', + emailAddress: 'test-user@sample.com', + id: 2944, + displayName: 'test-user', + active: true, + slug: 'test-user', + type: 'NORMAL', + links: {}, + }, + role: 'AUTHOR', + approved: false, + status: 'UNAPPROVED', + }, + reviewers: [], + participants: [], + links: { + self: [ + { + href: 'https://hosted.bitbucket.com/projects/project/repos/repo/pull-requests/1', + }, + ], + }, + }; + const handlers = [ + rest.get( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos/repo/branches', + (_, res, ctx) => { + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfBranches), + ); + }, + ), + rest.post( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos/repo/pull-requests', + (_, res, ctx) => { + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfPullRequests), + ); + }, + ), + ]; + + const server = setupServer(); + setupRequestMockHandlers(server); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should throw an error when the repoUrl is not well formed', async () => { + await expect( + action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?repo=repo', + }, + }), + ).rejects.toThrow(/missing project/); + + await expect( + action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?project=project', + }, + }), + ).rejects.toThrow(/missing repo/); + }); + + it('should throw if there is no integration config provided', async () => { + await expect( + action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'missing.com?project=project&repo=repo', + }, + }), + ).rejects.toThrow(/No matching integration configuration/); + }); + + it('should throw if there no credentials in the integration config that is returned', async () => { + await expect( + action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'no-credentials.bitbucket.com?project=project&repo=repo', + }, + }), + ).rejects.toThrow( + /Authorization has not been provided for no-credentials.bitbucket.com/, + ); + }); + + it('should call the correct APIs with token', async () => { + expect.assertions(3); + server.use( + rest.get( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos/repo/branches', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer thing'); + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfBranches), + ); + }, + ), + rest.post( + 'https://hosted.bitbucket.com/rest/api/1.0/projects/project/repos/repo/pull-requests', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe('Bearer thing'); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfPullRequests), + ); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'hosted.bitbucket.com?project=project&repo=repo', + }, + }); + }); + + it('should call the correct APIs with basic auth', async () => { + expect.assertions(3); + server.use( + rest.get( + 'https://basic-auth.bitbucket.com/rest/api/1.0/projects/project/repos/repo/branches', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe( + 'Basic dGVzdC11c2VyOnRlc3QtcGFzc3dvcmQ=', + ); + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfBranches), + ); + }, + ), + rest.post( + 'https://basic-auth.bitbucket.com/rest/api/1.0/projects/project/repos/repo/pull-requests', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe( + 'Basic dGVzdC11c2VyOnRlc3QtcGFzc3dvcmQ=', + ); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfPullRequests), + ); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'basic-auth.bitbucket.com?project=project&repo=repo', + }, + }); + }); + + it('should work if the token is provided through ctx.input', async () => { + expect.assertions(3); + const token = 'user-token'; + server.use( + rest.get( + 'https://no-credentials.bitbucket.com/rest/api/1.0/projects/project/repos/repo/branches', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe(`Bearer ${token}`); + return res( + ctx.status(200), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfBranches), + ); + }, + ), + rest.post( + 'https://no-credentials.bitbucket.com/rest/api/1.0/projects/project/repos/repo/pull-requests', + (req, res, ctx) => { + expect(req.headers.get('Authorization')).toBe(`Bearer ${token}`); + return res( + ctx.status(201), + ctx.set('Content-Type', 'application/json'), + ctx.json(responseOfPullRequests), + ); + }, + ), + ); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + repoUrl: 'no-credentials.bitbucket.com?project=project&repo=repo', + token: token, + }, + }); + }); + + it('should call outputs with the correct urls', async () => { + server.use(...handlers); + + await action.handler(mockContext); + + expect(mockContext.output).toHaveBeenCalledWith( + 'pullRequestUrl', + 'https://hosted.bitbucket.com/projects/project/repos/repo/pull-requests/1', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts new file mode 100644 index 0000000000..cfcccb05ce --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts @@ -0,0 +1,262 @@ +/* + * 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 { InputError } from '@backstage/errors'; +import { + getBitbucketServerRequestOptions, + ScmIntegrationRegistry, +} from '@backstage/integration'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import fetch, { RequestInit, Response } from 'node-fetch'; +import { parseRepoUrl } from './util'; +import { Config } from '@backstage/config'; + +const createPullRequest = async (opts: { + project: string; + repo: string; + title: string; + description?: string; + toRef: object; + fromRef: object; + authorization: string; + apiBaseUrl: string; +}) => { + const { + project, + repo, + title, + description, + toRef, + fromRef, + authorization, + apiBaseUrl, + } = opts; + + let response: Response; + const data: RequestInit = { + method: 'POST', + body: JSON.stringify({ + title: title, + description: description, + state: 'OPEN', + open: true, + closed: false, + locked: true, + toRef: toRef, + fromRef: fromRef, + }), + headers: { + Authorization: authorization, + 'Content-Type': 'application/json', + }, + }; + + try { + response = await fetch( + `${apiBaseUrl}/projects/${project}/repos/${repo}/pull-requests`, + data, + ); + } catch (e) { + throw new Error(`Unable to create pull-reqeusts, ${e}`); + } + + if (response.status !== 201) { + throw new Error( + `Unable to create pull requests, ${response.status} ${ + response.statusText + }, ${await response.text()}`, + ); + } + + const r = await response.json(); + return `${r.links.self[0].href}`; +}; +const findBranches = async (opts: { + project: string; + repo: string; + branchName: string; + authorization: string; + apiBaseUrl: string; +}) => { + const { project, repo, branchName, authorization, apiBaseUrl } = opts; + + let response: Response; + const options: RequestInit = { + method: 'GET', + headers: { + Authorization: authorization, + 'Content-Type': 'application/json', + }, + }; + + try { + response = await fetch( + `${apiBaseUrl}/projects/${project}/repos/${repo}/branches?boostMatches=true&filterText=${branchName}`, + options, + ); + } catch (e) { + throw new Error(`Unable to get branches, ${e}`); + } + + if (response.status !== 200) { + throw new Error( + `Unable to get branches, ${response.status} ${ + response.statusText + }, ${await response.text()}`, + ); + } + + const r = await response.json(); + let branch; + for (const object of r.values) { + if (object.displayId === branchName) { + branch = object; + break; + } + } + + return branch; +}; + +export function createPublishBitbucketServerPullRequestAction(options: { + integrations: ScmIntegrationRegistry; + config: Config; +}) { + const { integrations } = options; + + return createTemplateAction<{ + repoUrl: string; + title: string; + description?: string; + targetBranch: string; + sourceBranch: string; + token?: string; + }>({ + id: 'publish:bitbucketServer:pull-request', + schema: { + input: { + type: 'object', + required: ['repoUrl'], + properties: { + repoUrl: { + title: 'Repository Location', + type: 'string', + }, + title: { + title: 'Pull Request Name', + type: 'string', + description: 'The name for the pull request', + }, + description: { + title: 'Pull Request Description', + type: 'string', + description: 'The description of the pull request', + }, + targetBranch: { + title: 'Target Branch', + type: 'string', + description: 'The description of the pull request', + }, + sourceBranch: { + title: 'Source Branch', + type: 'string', + description: 'The description of the pull request', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: + 'The token to use for authorization to BitBucket Server', + }, + }, + }, + output: { + type: 'object', + properties: { + pullRequestUrl: { + title: 'A URL to the pull request with the provider', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + const { repoUrl, title, description, targetBranch, sourceBranch } = + ctx.input; + + const { project, repo, host } = parseRepoUrl(repoUrl, integrations); + + if (!project) { + throw new InputError( + `Invalid URL provider was included in the repo URL to create ${ctx.input.repoUrl}, missing project`, + ); + } + + const integrationConfig = integrations.bitbucketServer.byHost(host); + if (!integrationConfig) { + throw new InputError( + `No matching integration configuration for host ${host}, please check your integrations config`, + ); + } + + const token = ctx.input.token ?? integrationConfig.config.token; + + const authConfig = { + ...integrationConfig.config, + ...{ token }, + }; + + const reqOpts = getBitbucketServerRequestOptions(authConfig); + const authorization = reqOpts.headers.Authorization; + if (!authorization) { + throw new Error( + `Authorization has not been provided for ${integrationConfig.config.host}. Please add either (a) a user login auth token, or (b) a token or (c) username + password to the integration config.`, + ); + } + + const apiBaseUrl = integrationConfig.config.apiBaseUrl; + + const toRef = await findBranches({ + project, + repo, + branchName: targetBranch, + authorization, + apiBaseUrl, + }); + + const fromRef = await findBranches({ + project, + repo, + branchName: sourceBranch, + authorization, + apiBaseUrl, + }); + + const pullRequestUrl = await createPullRequest({ + project, + repo, + title, + description, + toRef, + fromRef, + authorization, + apiBaseUrl, + }); + + ctx.output('pullRequestUrl', pullRequestUrl); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/index.ts index a8a40ab1df..bed3a2316c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/index.ts @@ -18,6 +18,7 @@ export { createPublishAzureAction } from './azure'; export { createPublishBitbucketAction } from './bitbucket'; export { createPublishBitbucketCloudAction } from './bitbucketCloud'; export { createPublishBitbucketServerAction } from './bitbucketServer'; +export { createPublishBitbucketServerPullRequestAction } from './bitbucketServerPullRequest'; export { createPublishGerritAction } from './gerrit'; export { createPublishGerritReviewAction } from './gerritReview'; export { createPublishGithubAction } from './github'; From e76e0391fe5c9ce15dccb92bcd53309e3a282887 Mon Sep 17 00:00:00 2001 From: ohjongsung Date: Tue, 23 May 2023 10:27:01 +0900 Subject: [PATCH 19/73] Generate API reports Signed-off-by: ohjongsung --- plugins/scaffolder-backend/api-report.md | 16 ++++++++++++++++ .../publish/bitbucketServerPullRequest.ts | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 07dd5eaf1d..aed57e5bc2 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -448,6 +448,22 @@ export function createPublishBitbucketServerAction(options: { JsonObject >; +// @public +export function createPublishBitbucketServerPullRequestAction(options: { + integrations: ScmIntegrationRegistry; + config: Config; +}): TemplateAction_2< + { + repoUrl: string; + title: string; + description?: string | undefined; + targetBranch: string; + sourceBranch: string; + token?: string | undefined; + }, + JsonObject +>; + // @public export function createPublishGerritAction(options: { integrations: ScmIntegrationRegistry; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts index cfcccb05ce..4389e3a424 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts @@ -131,6 +131,10 @@ const findBranches = async (opts: { return branch; }; +/** + * Creates a BitbucketServer Pull Request action. + * @public + */ export function createPublishBitbucketServerPullRequestAction(options: { integrations: ScmIntegrationRegistry; config: Config; From 2ad15d5f8244f2f861a02297b73d5f508ba426cd Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 29 May 2023 12:30:00 +0200 Subject: [PATCH 20/73] Changes Signed-off-by: sblausten --- .changeset/sweet-fans-juggle.md | 3 +-- packages/backend/package.json | 1 - plugins/catalog-backend/src/catalog/types.ts | 2 +- yarn.lock | 3 +-- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.changeset/sweet-fans-juggle.md b/.changeset/sweet-fans-juggle.md index af299e9cac..72df182886 100644 --- a/.changeset/sweet-fans-juggle.md +++ b/.changeset/sweet-fans-juggle.md @@ -1,6 +1,5 @@ --- -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-events-backend': patch +'@backstage/plugin-catalog-backend': minor --- Adds an optional `EventBroker` that is used for sending an event when there are conflicts, with details of the conflict so that it can be handled elsewhere. diff --git a/packages/backend/package.json b/packages/backend/package.json index 61b01a57a0..b5a82fd611 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,7 +40,6 @@ "@backstage/plugin-azure-sites-backend": "workspace:^", "@backstage/plugin-badges-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", - "@backstage/plugin-catalog-backend-module-github": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-code-coverage-backend": "workspace:^", "@backstage/plugin-devtools-backend": "workspace:^", diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 76841af260..45a3ff6144 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -317,7 +317,7 @@ export type Cursor = { */ export type CatalogConflictEventPayload = { /** - * The new conflicting entity + * The new conflicting entity in raw, unvalidated form */ entity: Entity; /** diff --git a/yarn.lock b/yarn.lock index f9f870ce77..e2b0dabbde 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5385,7 +5385,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-backend-module-github@workspace:^, @backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": +"@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github" dependencies: @@ -23951,7 +23951,6 @@ __metadata: "@backstage/plugin-azure-sites-backend": "workspace:^" "@backstage/plugin-badges-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" - "@backstage/plugin-catalog-backend-module-github": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-devtools-backend": "workspace:^" From c1f1eebe36d55746cf95ab5ca1098c1458d893bc Mon Sep 17 00:00:00 2001 From: Maapteh Date: Mon, 29 May 2023 13:56:51 +0200 Subject: [PATCH 21/73] fix: start with some printable containers Signed-off-by: Maapteh --- packages/core-components/src/layout/Page/Page.tsx | 5 +++++ packages/core-components/src/layout/Sidebar/Bar.tsx | 3 +++ .../core-components/src/layout/Sidebar/MobileSidebar.tsx | 3 +++ packages/core-components/src/layout/Sidebar/Page.tsx | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/packages/core-components/src/layout/Page/Page.tsx b/packages/core-components/src/layout/Page/Page.tsx index 00988c475b..e388e0366a 100644 --- a/packages/core-components/src/layout/Page/Page.tsx +++ b/packages/core-components/src/layout/Page/Page.tsx @@ -33,6 +33,11 @@ const useStyles = makeStyles( [theme.breakpoints.down('xs')]: { height: '100%', }, + '@media print': { + display: 'block', + height: 'auto', + overflowY: 'inherit', + }, }, }), { name: 'BackstagePage' }, diff --git a/packages/core-components/src/layout/Sidebar/Bar.tsx b/packages/core-components/src/layout/Sidebar/Bar.tsx index 815d6bc0d6..8cb43ba007 100644 --- a/packages/core-components/src/layout/Sidebar/Bar.tsx +++ b/packages/core-components/src/layout/Sidebar/Bar.tsx @@ -63,6 +63,9 @@ const useStyles = makeStyles( '&::-webkit-scrollbar': { display: 'none', }, + '@media print': { + display: 'none', + }, }, drawerWidth: props => ({ width: props.sidebarConfig.drawerWidthClosed, diff --git a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx index 9000c2f10b..bf96703613 100644 --- a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx +++ b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx @@ -72,6 +72,9 @@ const useStyles = makeStyles( zIndex: theme.zIndex.snackbar, // SidebarDivider color borderTop: '1px solid #383838', + '@media print': { + display: 'none', + }, }, overlay: props => ({ diff --git a/packages/core-components/src/layout/Sidebar/Page.tsx b/packages/core-components/src/layout/Sidebar/Page.tsx index 5f660547d1..09935867b3 100644 --- a/packages/core-components/src/layout/Sidebar/Page.tsx +++ b/packages/core-components/src/layout/Sidebar/Page.tsx @@ -51,6 +51,10 @@ const useStyles = makeStyles< [theme.breakpoints.down('xs')]: { paddingBottom: props => props.sidebarConfig.mobileSidebarHeight, }, + '@media print': { + paddingLeft: '0px !important', + paddingBottom: '0px !important', + }, }, content: { zIndex: 0, From 36bedda8da9a3485d264f70c701ccea664911bb1 Mon Sep 17 00:00:00 2001 From: Maapteh Date: Mon, 29 May 2023 14:22:28 +0200 Subject: [PATCH 22/73] -s fix: each container not breaked in start... Signed-off-by: Maapteh --- packages/core-components/src/layout/InfoCard/InfoCard.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core-components/src/layout/InfoCard/InfoCard.tsx b/packages/core-components/src/layout/InfoCard/InfoCard.tsx index 3d8d0f3bb0..3034ce1cf2 100644 --- a/packages/core-components/src/layout/InfoCard/InfoCard.tsx +++ b/packages/core-components/src/layout/InfoCard/InfoCard.tsx @@ -92,6 +92,10 @@ const VARIANT_STYLES = { flexDirection: 'column', height: 'calc(100% - 10px)', // for pages without content header marginBottom: '10px', + breakInside: 'avoid', + '@media print': { + height: 'auto', + }, }, }, cardContent: { From e33beb1f2a8ef53bfc18339630eecf9c2ced45bb Mon Sep 17 00:00:00 2001 From: Maapteh Date: Mon, 29 May 2023 14:40:16 +0200 Subject: [PATCH 23/73] add changelog Signed-off-by: Maapteh --- .changeset/smart-ads-rush.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smart-ads-rush.md diff --git a/.changeset/smart-ads-rush.md b/.changeset/smart-ads-rush.md new file mode 100644 index 0000000000..4f7cad0d49 --- /dev/null +++ b/.changeset/smart-ads-rush.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Make the documentation pages printable (also handy for exporting to pdf when go-green) From 69db3a7e9427da205342e33d81ef755e5620d730 Mon Sep 17 00:00:00 2001 From: Maapteh Date: Mon, 29 May 2023 20:13:43 +0200 Subject: [PATCH 24/73] review Signed-off-by: Maapteh --- .changeset/smart-ads-rush.md | 2 +- packages/core-components/src/layout/Sidebar/Page.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.changeset/smart-ads-rush.md b/.changeset/smart-ads-rush.md index 4f7cad0d49..45ed2ff593 100644 --- a/.changeset/smart-ads-rush.md +++ b/.changeset/smart-ads-rush.md @@ -2,4 +2,4 @@ '@backstage/core-components': patch --- -Make the documentation pages printable (also handy for exporting to pdf when go-green) +Make the documentation pages printable (also handy for exporting to PDF) diff --git a/packages/core-components/src/layout/Sidebar/Page.tsx b/packages/core-components/src/layout/Sidebar/Page.tsx index 09935867b3..c0107256e1 100644 --- a/packages/core-components/src/layout/Sidebar/Page.tsx +++ b/packages/core-components/src/layout/Sidebar/Page.tsx @@ -52,8 +52,7 @@ const useStyles = makeStyles< paddingBottom: props => props.sidebarConfig.mobileSidebarHeight, }, '@media print': { - paddingLeft: '0px !important', - paddingBottom: '0px !important', + padding: '0px !important', }, }, content: { From f242762235ac2c0bf27498e7f782a50b3d75a994 Mon Sep 17 00:00:00 2001 From: Maapteh Date: Mon, 29 May 2023 20:16:08 +0200 Subject: [PATCH 25/73] review Signed-off-by: Maapteh --- packages/core-components/src/layout/InfoCard/InfoCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/layout/InfoCard/InfoCard.tsx b/packages/core-components/src/layout/InfoCard/InfoCard.tsx index 3034ce1cf2..c80e71b609 100644 --- a/packages/core-components/src/layout/InfoCard/InfoCard.tsx +++ b/packages/core-components/src/layout/InfoCard/InfoCard.tsx @@ -92,7 +92,7 @@ const VARIANT_STYLES = { flexDirection: 'column', height: 'calc(100% - 10px)', // for pages without content header marginBottom: '10px', - breakInside: 'avoid', + breakInside: 'avoid-page', '@media print': { height: 'auto', }, From 7493e042757efc83b45a192c8b58eedf530289a3 Mon Sep 17 00:00:00 2001 From: Maapteh Date: Tue, 30 May 2023 17:33:12 +0200 Subject: [PATCH 26/73] can not run techdocs maybe this is it.. Signed-off-by: Maapteh --- .../src/reader/transformers/styles/rules/layout.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts index c5e69e6084..24adabfcec 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts @@ -227,4 +227,14 @@ export default ({ theme, sidebar }: RuleOptions) => ` width: 12.1rem; } } + + +@media print { + .md-sidebar { + display: none; + } + .md-content { + margin: 0; + } +} `; From 4e15516aaf6364ed20592009a4d9636decb746fb Mon Sep 17 00:00:00 2001 From: Maapteh Date: Tue, 30 May 2023 17:38:10 +0200 Subject: [PATCH 27/73] only able to run e2e fixture documentation Signed-off-by: Maapteh --- .../techdocs/src/reader/transformers/styles/rules/layout.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts index 24adabfcec..4ab90e91e1 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts @@ -230,11 +230,14 @@ export default ({ theme, sidebar }: RuleOptions) => ` @media print { - .md-sidebar { + .md-sidebar, + #toggle-sidebar { display: none; } .md-content { margin: 0; + width: 100%; + max-width: 100%; } } `; From c695c3b5eaec1b4b3f3ed22caa755aaf4b310eb3 Mon Sep 17 00:00:00 2001 From: Maapteh Date: Tue, 30 May 2023 17:39:46 +0200 Subject: [PATCH 28/73] only able to run e2e fixture documentation Signed-off-by: Maapteh --- .changeset/smart-ads-rush.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changeset/smart-ads-rush.md b/.changeset/smart-ads-rush.md index 45ed2ff593..369e5ab25b 100644 --- a/.changeset/smart-ads-rush.md +++ b/.changeset/smart-ads-rush.md @@ -1,5 +1,6 @@ --- '@backstage/core-components': patch +'@backstage/plugin-techdocs': patch --- Make the documentation pages printable (also handy for exporting to PDF) From 42132761151a3d90c588a9cd127838fca2456018 Mon Sep 17 00:00:00 2001 From: Maapteh Date: Tue, 30 May 2023 17:44:05 +0200 Subject: [PATCH 29/73] only able to run e2e fixture documentation Signed-off-by: Maapteh --- .../TechDocsReaderPageContent/TechDocsReaderPageContent.tsx | 3 +++ .../TechDocsReaderPageSubheader.tsx | 3 +++ 2 files changed, 6 insertions(+) diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx index 000a1ba275..1e5459fc9d 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.tsx @@ -39,6 +39,9 @@ const useStyles = makeStyles({ width: 'calc(100% - 34.4rem)', margin: '0 auto', }, + '@media print': { + display: 'none', + }, }, }); diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx index f3612aa46e..85f04655fd 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.tsx @@ -39,6 +39,9 @@ const useStyles = makeStyles(theme => ({ flexDirection: 'column', minHeight: 'auto', padding: theme.spacing(3, 3, 0), + '@media print': { + display: 'none', + }, }, })); From c0806fe2b2e93f335264e411dd5b748fd195828a Mon Sep 17 00:00:00 2001 From: Maapteh Date: Tue, 30 May 2023 17:49:42 +0200 Subject: [PATCH 30/73] only able to run e2e fixture documentation Signed-off-by: Maapteh --- plugins/techdocs/src/reader/transformers/styles/rules/layout.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts index 4ab90e91e1..cce6af7d6f 100644 --- a/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts +++ b/plugins/techdocs/src/reader/transformers/styles/rules/layout.ts @@ -234,6 +234,7 @@ export default ({ theme, sidebar }: RuleOptions) => ` #toggle-sidebar { display: none; } + .md-content { margin: 0; width: 100%; From 5ecc3d7865f81e6989064d4543c1f9eca56d980f Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Thu, 1 Jun 2023 16:37:40 -0500 Subject: [PATCH 31/73] fix(catalog-import): Fix stepper component order. Signed-off-by: Carlos Esteban Lopez --- .../components/DefaultImportPage/DefaultImportPage.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx index 30cce9603a..f0c9d3c33a 100644 --- a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx +++ b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx @@ -47,14 +47,14 @@ export const DefaultImportPage = () => { - - - - - + + + + + From 309d2973adb4ef526fc0bd58508caefe19b2a029 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Thu, 1 Jun 2023 16:45:09 -0500 Subject: [PATCH 32/73] fix(catalog-import): Add changeset Signed-off-by: Carlos Esteban Lopez --- .changeset/cold-pillows-mix.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cold-pillows-mix.md diff --git a/.changeset/cold-pillows-mix.md b/.changeset/cold-pillows-mix.md new file mode 100644 index 0000000000..12dc9422aa --- /dev/null +++ b/.changeset/cold-pillows-mix.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-import': patch +--- + +Swap `ImportStepper` and `InfoCard` order to fix tab order in `catalog-import`. From 1aecd7e3811c27841ef849a4c35f94f156b1d111 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Thu, 1 Jun 2023 17:24:36 -0500 Subject: [PATCH 33/73] fix(catalog-import): Use media queries to sort content order Signed-off-by: Carlos Esteban Lopez --- .../DefaultImportPage/DefaultImportPage.tsx | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx index f0c9d3c33a..c777953808 100644 --- a/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx +++ b/plugins/catalog-import/src/components/DefaultImportPage/DefaultImportPage.tsx @@ -22,7 +22,7 @@ import { SupportButton, } from '@backstage/core-components'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { Grid } from '@material-ui/core'; +import { Grid, useMediaQuery, useTheme } from '@material-ui/core'; import React from 'react'; import { ImportInfoCard } from '../ImportInfoCard'; import { ImportStepper } from '../ImportStepper'; @@ -33,9 +33,21 @@ import { ImportStepper } from '../ImportStepper'; * @public */ export const DefaultImportPage = () => { + const theme = useTheme(); const configApi = useApi(configApiRef); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); const appTitle = configApi.getOptional('app.title') || 'Backstage'; + const contentItems = [ + + + , + + + + , + ]; + return (
@@ -48,13 +60,7 @@ export const DefaultImportPage = () => { - - - - - - - + {isMobile ? contentItems : contentItems.reverse()} From 058328d77d3abc4255e64135d579dcf21de922ce Mon Sep 17 00:00:00 2001 From: ohjongsung Date: Fri, 2 Jun 2023 16:02:58 +0900 Subject: [PATCH 34/73] Update Code and description based on feedback Signed-off-by: ohjongsung --- plugins/scaffolder-backend/api-report.md | 2 +- .../publish/bitbucketServerPullRequest.ts | 31 ++++++++++--------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index aed57e5bc2..5099ae18b8 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -457,7 +457,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { repoUrl: string; title: string; description?: string | undefined; - targetBranch: string; + targetBranch?: string | undefined; sourceBranch: string; token?: string | undefined; }, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts index 4389e3a424..a0ac0e20ac 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts @@ -120,15 +120,13 @@ const findBranches = async (opts: { } const r = await response.json(); - let branch; for (const object of r.values) { if (object.displayId === branchName) { - branch = object; - break; + return object; } } - return branch; + return undefined; }; /** @@ -145,7 +143,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { repoUrl: string; title: string; description?: string; - targetBranch: string; + targetBranch?: string; sourceBranch: string; token?: string; }>({ @@ -153,16 +151,16 @@ export function createPublishBitbucketServerPullRequestAction(options: { schema: { input: { type: 'object', - required: ['repoUrl'], + required: ['repoUrl', 'title', 'sourceBranch'], properties: { repoUrl: { title: 'Repository Location', type: 'string', }, title: { - title: 'Pull Request Name', + title: 'Pull Request title', type: 'string', - description: 'The name for the pull request', + description: 'The title for the pull request', }, description: { title: 'Pull Request Description', @@ -172,15 +170,15 @@ export function createPublishBitbucketServerPullRequestAction(options: { targetBranch: { title: 'Target Branch', type: 'string', - description: 'The description of the pull request', + description: `Branch of repository to apply changes to. The default value is 'master'`, }, sourceBranch: { title: 'Source Branch', type: 'string', - description: 'The description of the pull request', + description: 'Branch of repository to copy changes from', }, token: { - title: 'Authentication Token', + title: 'Authorization Token', type: 'string', description: 'The token to use for authorization to BitBucket Server', @@ -198,8 +196,13 @@ export function createPublishBitbucketServerPullRequestAction(options: { }, }, async handler(ctx) { - const { repoUrl, title, description, targetBranch, sourceBranch } = - ctx.input; + const { + repoUrl, + title, + description, + targetBranch = 'master', + sourceBranch, + } = ctx.input; const { project, repo, host } = parseRepoUrl(repoUrl, integrations); @@ -227,7 +230,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { const authorization = reqOpts.headers.Authorization; if (!authorization) { throw new Error( - `Authorization has not been provided for ${integrationConfig.config.host}. Please add either (a) a user login auth token, or (b) a token or (c) username + password to the integration config.`, + `Authorization has not been provided for ${integrationConfig.config.host}. Please add either (a) a user login auth token, or (b) a token input from the template or (c) username + password to the integration config.`, ); } From 1948845861b0950576da5dd32093f6773e198f5d Mon Sep 17 00:00:00 2001 From: Andrew Ochsner Date: Fri, 2 Jun 2023 10:04:07 -0500 Subject: [PATCH 35/73] add github:environment:create and github:deployKey:create Signed-off-by: Andrew Ochsner --- .changeset/strange-dolls-decide.md | 5 + docs/integrations/github/github-apps.md | 1 + plugins/scaffolder-backend/api-report.md | 44 +++ .../actions/builtin/createBuiltinActions.ts | 8 + .../builtin/github/githubDeployKey.test.ts | 112 ++++++++ .../actions/builtin/github/githubDeployKey.ts | 157 +++++++++++ .../builtin/github/githubEnvironment.test.ts | 258 ++++++++++++++++++ .../builtin/github/githubEnvironment.ts | 200 ++++++++++++++ .../actions/builtin/github/helpers.ts | 4 +- .../actions/builtin/github/index.ts | 2 + 10 files changed, 789 insertions(+), 2 deletions(-) create mode 100644 .changeset/strange-dolls-decide.md create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.ts diff --git a/.changeset/strange-dolls-decide.md b/.changeset/strange-dolls-decide.md new file mode 100644 index 0000000000..97dc99d2c9 --- /dev/null +++ b/.changeset/strange-dolls-decide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added `github:deployKey:create` and `github:environment:create` scaffolder actions. You will need to add `read/write` permissions to your GITHUB_TOKEN and/or Github Backstage App for Repository `Administration` (for deploy key functionality) and `Environments` (for Environment functionality) diff --git a/docs/integrations/github/github-apps.md b/docs/integrations/github/github-apps.md index 3cad69f56d..cc84704799 100644 --- a/docs/integrations/github/github-apps.md +++ b/docs/integrations/github/github-apps.md @@ -138,3 +138,4 @@ integration: - `Commit statuses`: `Read-only` - `Variables`: `Read & write` (if templates include GitHub Action Repository Variables) - `Secrets`: `Read & write` (if templates include GitHub Action Repository Secrets) + - `Environments`: `Read & write` (if templates include GitHub Environments) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 5e18ad15bf..86fadbacb0 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -211,6 +211,50 @@ export function createGithubActionsDispatchAction(options: { JsonObject >; +// @public +export function createGithubDeployKeyAction(options: { + integrations: ScmIntegrationRegistry; +}): TemplateAction_2< + { + repoUrl: string; + publicKey: string; + privateKey: string; + deployKeyName: string; + privateKeySecretName?: string | undefined; + token?: string | undefined; + }, + JsonObject +>; + +// @public +export function createGithubEnvironmentAction(options: { + integrations: ScmIntegrationRegistry; +}): TemplateAction_2< + { + repoUrl: string; + name: string; + deploymentBranchPolicy?: + | { + protected_branches: boolean; + custom_branch_policies: boolean; + } + | undefined; + customBranchPolicyNames?: string[] | undefined; + environmentVariables?: + | { + [key: string]: string; + } + | undefined; + secrets?: + | { + [key: string]: string; + } + | undefined; + token?: string | undefined; + }, + JsonObject +>; + // @public export function createGithubIssuesLabelAction(options: { integrations: ScmIntegrationRegistry; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 747b5cdaed..f5ea23f26f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -42,6 +42,8 @@ import { } from './filesystem'; import { createGithubActionsDispatchAction, + createGithubDeployKeyAction, + createGithubEnvironmentAction, createGithubIssuesLabelAction, createGithubRepoCreateAction, createGithubRepoPushAction, @@ -194,6 +196,12 @@ export const createBuiltinActions = ( config, githubCredentialsProvider, }), + createGithubEnvironmentAction({ + integrations, + }), + createGithubDeployKeyAction({ + integrations, + }), ]; return actions as TemplateAction[]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.test.ts new file mode 100644 index 0000000000..4df9294ff5 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.test.ts @@ -0,0 +1,112 @@ +/* + * 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 { PassThrough } from 'stream'; +import { createGithubDeployKeyAction } from './githubDeployKey'; +import { getVoidLogger } from '@backstage/backend-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; + +const mockOctokit = { + rest: { + actions: { + getRepoPublicKey: jest.fn(), + createOrUpdateRepoSecret: jest.fn(), + }, + repos: { + createDeployKey: jest.fn(), + }, + }, +}; +jest.mock('octokit', () => ({ + Octokit: class { + constructor() { + return mockOctokit; + } + }, +})); + +const publicKey = '2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvvcCU='; + +describe('github:deployKey:create', () => { + const config = new ConfigReader({ + integrations: { + github: [ + { host: 'github.com', token: 'tokenlols' }, + { host: 'ghe.github.com' }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + let action: TemplateAction; + + const mockContext = { + input: { + repoUrl: 'github.com?repo=repository&owner=owner', + publicKey: 'pubkey', + privateKey: 'privkey', + deployKeyName: 'Push Tags', + }, + workspacePath: 'lol', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + + action = createGithubDeployKeyAction({ + integrations, + }); + }); + + it('should work happy path', async () => { + mockOctokit.rest.actions.getRepoPublicKey.mockResolvedValue({ + data: { + key: publicKey, + key_id: 'keyid', + }, + }); + + await action.handler(mockContext); + + expect(mockOctokit.rest.repos.createDeployKey).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + title: 'Push Tags', + key: 'pubkey', + }); + + expect( + mockOctokit.rest.actions.createOrUpdateRepoSecret, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + secret_name: 'PUSH_TAGS_PRIVATE_KEY', + key_id: 'keyid', + encrypted_value: expect.any(String), + }); + + expect(mockContext.output).toHaveBeenCalledWith( + 'privateKeySecretName', + 'PUSH_TAGS_PRIVATE_KEY', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.ts new file mode 100644 index 0000000000..6ad646a89c --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubDeployKey.ts @@ -0,0 +1,157 @@ +/* + * 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 { InputError } from '@backstage/errors'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { parseRepoUrl } from '../publish/util'; +import { getOctokitOptions } from './helpers'; +import { Octokit } from 'octokit'; +import Sodium from 'libsodium-wrappers'; + +/** + * Creates an `github:deployKey:create` Scaffolder action that creates a Deploy Key + * + * @public + */ +export function createGithubDeployKeyAction(options: { + integrations: ScmIntegrationRegistry; +}) { + const { integrations } = options; + // For more information on how to define custom actions, see + // https://backstage.io/docs/features/software-templates/writing-custom-actions + return createTemplateAction<{ + repoUrl: string; + publicKey: string; + privateKey: string; + deployKeyName: string; + privateKeySecretName?: string; + token?: string; + }>({ + id: 'github:deployKey:create', + description: 'Creates and stores Deploy Keys', + schema: { + input: { + type: 'object', + required: ['repoUrl', 'publicKey', 'privateKey', 'deployKeyName'], + properties: { + repoUrl: { + title: 'Repository Location', + description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, + type: 'string', + }, + publicKey: { + title: 'SSH Public Key', + description: `Generated from ssh-keygen. Begins with 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'ssh-ed25519', 'sk-ecdsa-sha2-nistp256@openssh.com', or 'sk-ssh-ed25519@openssh.com'.`, + type: 'string', + }, + privateKey: { + title: 'SSH Private Key', + description: `SSH Private Key generated from ssh-keygen`, + type: 'string', + }, + deployKeyName: { + title: 'Deploy Key Name', + description: `Name of the Deploy Key`, + type: 'string', + }, + privateKeySecretName: { + title: 'Private Key GitHub Secret Name', + description: `Name of the GitHub Secret to store the private key related to the Deploy Key. Defaults to: 'KEY_NAME_PRIVATE_KEY' where 'KEY_NAME' is the name of the Deploy Key`, + type: 'string', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitHub', + }, + }, + }, + output: { + type: 'object', + properties: { + privateKeySecretName: { + title: 'The GitHub Action Repo Secret Name for the Private Key', + type: 'string', + }, + }, + }, + }, + async handler(ctx) { + const { + repoUrl, + publicKey, + privateKey, + deployKeyName, + privateKeySecretName = `${deployKeyName + .split(' ') + .join('_') + .toLocaleUpperCase('en-US')}_PRIVATE_KEY`, + token: providedToken, + } = ctx.input; + + const octokitOptions = await getOctokitOptions({ + integrations, + token: providedToken, + repoUrl: repoUrl, + }); + + const { owner, repo } = parseRepoUrl(repoUrl, integrations); + + if (!owner) { + throw new InputError(`No owner provided for repo ${repoUrl}`); + } + + const client = new Octokit(octokitOptions); + + await client.rest.repos.createDeployKey({ + owner: owner, + repo: repo, + title: deployKeyName, + key: publicKey, + }); + const publicKeyResponse = await client.rest.actions.getRepoPublicKey({ + owner: owner, + repo: repo, + }); + + await Sodium.ready; + const binaryKey = Sodium.from_base64( + publicKeyResponse.data.key, + Sodium.base64_variants.ORIGINAL, + ); + const binarySecret = Sodium.from_string(privateKey); + const encryptedBinarySecret = Sodium.crypto_box_seal( + binarySecret, + binaryKey, + ); + const encryptedBase64Secret = Sodium.to_base64( + encryptedBinarySecret, + Sodium.base64_variants.ORIGINAL, + ); + + await client.rest.actions.createOrUpdateRepoSecret({ + owner: owner, + repo: repo, + secret_name: privateKeySecretName, + encrypted_value: encryptedBase64Secret, + key_id: publicKeyResponse.data.key_id, + }); + + ctx.output('privateKeySecretName', privateKeySecretName); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.test.ts new file mode 100644 index 0000000000..d158bc122e --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.test.ts @@ -0,0 +1,258 @@ +/* + * 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 { PassThrough } from 'stream'; +import { createGithubEnvironmentAction } from './githubEnvironment'; +import { getVoidLogger } from '@backstage/backend-common'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; + +const mockOctokit = { + rest: { + actions: { + getRepoPublicKey: jest.fn(), + createEnvironmentVariable: jest.fn(), + createOrUpdateEnvironmentSecret: jest.fn(), + }, + repos: { + createDeploymentBranchPolicy: jest.fn(), + createOrUpdateEnvironment: jest.fn(), + get: jest.fn(), + }, + }, +}; +jest.mock('octokit', () => ({ + Octokit: class { + constructor() { + return mockOctokit; + } + }, +})); + +const publicKey = '2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvvcCU='; + +describe('github:environment:create', () => { + const config = new ConfigReader({ + integrations: { + github: [ + { host: 'github.com', token: 'tokenlols' }, + { host: 'ghe.github.com' }, + ], + }, + }); + + const integrations = ScmIntegrations.fromConfig(config); + let action: TemplateAction; + + const mockContext = { + input: { + repoUrl: 'github.com?repo=repository&owner=owner', + name: 'envname', + }, + workspacePath: 'lol', + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + beforeEach(() => { + mockOctokit.rest.actions.getRepoPublicKey.mockResolvedValue({ + data: { + key: publicKey, + key_id: 'keyid', + }, + }); + mockOctokit.rest.repos.get.mockResolvedValue({ + data: { + id: 'repoid', + }, + }); + + action = createGithubEnvironmentAction({ + integrations, + }); + }); + + afterEach(jest.resetAllMocks); + + it('should work happy path', async () => { + await action.handler(mockContext); + + expect( + mockOctokit.rest.repos.createOrUpdateEnvironment, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + deployment_branch_policy: null, + }); + }); + + it('should work specify deploymentBranchPolicy protected', async () => { + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + deploymentBranchPolicy: { + protected_branches: true, + custom_branch_policies: false, + }, + }, + }); + + expect( + mockOctokit.rest.repos.createOrUpdateEnvironment, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + deployment_branch_policy: { + protected_branches: true, + custom_branch_policies: false, + }, + }); + }); + it('should work specify deploymentBranchPolicy custom', async () => { + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + deploymentBranchPolicy: { + protected_branches: false, + custom_branch_policies: true, + }, + customBranchPolicyNames: ['main', '*.*.*'], + }, + }); + + expect( + mockOctokit.rest.repos.createOrUpdateEnvironment, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + deployment_branch_policy: { + protected_branches: false, + custom_branch_policies: true, + }, + }); + + expect( + mockOctokit.rest.repos.createDeploymentBranchPolicy, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + name: 'main', + }); + expect( + mockOctokit.rest.repos.createDeploymentBranchPolicy, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + name: '*.*.*', + }); + }); + + it('should work specify environment variables', async () => { + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + environmentVariables: { + key1: 'val1', + key2: 'val2', + }, + }, + }); + + expect( + mockOctokit.rest.repos.createOrUpdateEnvironment, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + deployment_branch_policy: null, + }); + + expect( + mockOctokit.rest.actions.createEnvironmentVariable, + ).toHaveBeenCalledTimes(2); + expect( + mockOctokit.rest.actions.createEnvironmentVariable, + ).toHaveBeenCalledWith({ + repository_id: 'repoid', + environment_name: 'envname', + name: 'key1', + value: 'val1', + }); + expect( + mockOctokit.rest.actions.createEnvironmentVariable, + ).toHaveBeenCalledWith({ + repository_id: 'repoid', + environment_name: 'envname', + name: 'key2', + value: 'val2', + }); + }); + + it('should work specify secrets', async () => { + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + secrets: { + key1: 'val1', + key2: 'val2', + }, + }, + }); + + expect( + mockOctokit.rest.repos.createOrUpdateEnvironment, + ).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repository', + environment_name: 'envname', + deployment_branch_policy: null, + }); + + expect( + mockOctokit.rest.actions.createOrUpdateEnvironmentSecret, + ).toHaveBeenCalledTimes(2); + expect( + mockOctokit.rest.actions.createOrUpdateEnvironmentSecret, + ).toHaveBeenCalledWith({ + repository_id: 'repoid', + environment_name: 'envname', + secret_name: 'key1', + key_id: 'keyid', + encrypted_value: expect.any(String), + }); + expect( + mockOctokit.rest.actions.createOrUpdateEnvironmentSecret, + ).toHaveBeenCalledWith({ + repository_id: 'repoid', + environment_name: 'envname', + secret_name: 'key2', + key_id: 'keyid', + encrypted_value: expect.any(String), + }); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.ts new file mode 100644 index 0000000000..04b33ed259 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/githubEnvironment.ts @@ -0,0 +1,200 @@ +/* + * 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 { InputError } from '@backstage/errors'; +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { ScmIntegrationRegistry } from '@backstage/integration'; +import { parseRepoUrl } from '../publish/util'; +import { getOctokitOptions } from './helpers'; +import { Octokit } from 'octokit'; +import Sodium from 'libsodium-wrappers'; + +/** + * Creates an `github:environment:create` Scaffolder action that creates a Github Environment. + * + * @public + */ +export function createGithubEnvironmentAction(options: { + integrations: ScmIntegrationRegistry; +}) { + const { integrations } = options; + // For more information on how to define custom actions, see + // https://backstage.io/docs/features/software-templates/writing-custom-actions + return createTemplateAction<{ + repoUrl: string; + name: string; + deploymentBranchPolicy?: { + protected_branches: boolean; + custom_branch_policies: boolean; + }; + customBranchPolicyNames?: string[]; + environmentVariables?: { [key: string]: string }; + secrets?: { [key: string]: string }; + token?: string; + }>({ + id: 'github:environment:create', + description: 'Creates Deployment Environments', + schema: { + input: { + type: 'object', + required: ['repoUrl', 'name'], + properties: { + repoUrl: { + title: 'Repository Location', + description: `Accepts the format 'github.com?repo=reponame&owner=owner' where 'reponame' is the new repository name and 'owner' is an organization or username`, + type: 'string', + }, + name: { + title: 'Environment Name', + description: `Name of the deployment environment to create`, + type: 'string', + }, + deploymentBranchPolicy: { + title: 'Deployment Branch Policy', + description: `The type of deployment branch policy for this environment. To allow all branches to deploy, set to null.`, + type: 'object', + required: ['protected_branches', 'custom_branch_policies'], + properties: { + protected_branches: { + title: 'Protected Branches', + description: `Whether only branches with branch protection rules can deploy to this environment. If protected_branches is true, custom_branch_policies must be false; if protected_branches is false, custom_branch_policies must be true.`, + type: 'boolean', + }, + custom_branch_policies: { + title: 'Custom Branch Policies', + description: `Whether only branches that match the specified name patterns can deploy to this environment. If custom_branch_policies is true, protected_branches must be false; if custom_branch_policies is false, protected_branches must be true.`, + type: 'boolean', + }, + }, + }, + customBranchPolicyNames: { + title: 'Custom Branch Policy Name', + description: `The name pattern that branches must match in order to deploy to the environment. + + Wildcard characters will not match /. For example, to match branches that begin with release/ and contain an additional single slash, use release/*/*. For more information about pattern matching syntax, see the Ruby File.fnmatch documentation.`, + type: 'array', + items: { + type: 'string', + }, + }, + environmentVariables: { + title: 'Environment Variables', + description: `Environment variables attached to the deployment environment`, + type: 'object', + }, + secrets: { + title: 'Deployment Secrets', + description: `Secrets attached to the deployment environment`, + type: 'object', + }, + token: { + title: 'Authentication Token', + type: 'string', + description: 'The token to use for authorization to GitHub', + }, + }, + }, + }, + async handler(ctx) { + const { + repoUrl, + name, + deploymentBranchPolicy, + customBranchPolicyNames, + environmentVariables, + secrets, + token: providedToken, + } = ctx.input; + + const octokitOptions = await getOctokitOptions({ + integrations, + token: providedToken, + repoUrl: repoUrl, + }); + + const { owner, repo } = parseRepoUrl(repoUrl, integrations); + + if (!owner) { + throw new InputError(`No owner provided for repo ${repoUrl}`); + } + + const client = new Octokit(octokitOptions); + const repository = await client.rest.repos.get({ + owner: owner, + repo: repo, + }); + + await client.rest.repos.createOrUpdateEnvironment({ + owner: owner, + repo: repo, + environment_name: name, + deployment_branch_policy: deploymentBranchPolicy ?? null, + }); + + if (customBranchPolicyNames) { + for (const item of customBranchPolicyNames) { + await client.rest.repos.createDeploymentBranchPolicy({ + owner: owner, + repo: repo, + environment_name: name, + name: item, + }); + } + } + + for (const [key, value] of Object.entries(environmentVariables ?? {})) { + await client.rest.actions.createEnvironmentVariable({ + repository_id: repository.data.id, + environment_name: name, + name: key, + value, + }); + } + + if (secrets) { + const publicKeyResponse = await client.rest.actions.getRepoPublicKey({ + owner: owner, + repo: repo, + }); + + await Sodium.ready; + const binaryKey = Sodium.from_base64( + publicKeyResponse.data.key, + Sodium.base64_variants.ORIGINAL, + ); + for (const [key, value] of Object.entries(secrets)) { + const binarySecret = Sodium.from_string(value); + const encryptedBinarySecret = Sodium.crypto_box_seal( + binarySecret, + binaryKey, + ); + const encryptedBase64Secret = Sodium.to_base64( + encryptedBinarySecret, + Sodium.base64_variants.ORIGINAL, + ); + + await client.rest.actions.createOrUpdateEnvironmentSecret({ + repository_id: repository.data.id, + environment_name: name, + secret_name: key, + encrypted_value: encryptedBase64Secret, + key_id: publicKeyResponse.data.key_id, + }); + } + } + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts index dc1b4eb91c..edef7cec5c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/helpers.ts @@ -98,7 +98,7 @@ export async function createGithubRepoWithCollaboratorsAndTopics( client: Octokit, repo: string, owner: string, - repoVisibility: 'private' | 'internal' | 'public', + repoVisibility: 'private' | 'internal' | 'public' | undefined, description: string | undefined, homepage: string | undefined, deleteBranchOnMerge: boolean, @@ -149,7 +149,7 @@ export async function createGithubRepoWithCollaboratorsAndTopics( name: repo, org: owner, private: repoVisibility === 'private', - // @ts-ignore + // @ts-ignore https://github.com/octokit/types.ts/issues/522 visibility: repoVisibility, description: description, delete_branch_on_merge: deleteBranchOnMerge, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts index 6746aef37e..ecc8ce59f2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/github/index.ts @@ -19,3 +19,5 @@ export { createGithubIssuesLabelAction } from './githubIssuesLabel'; export { createGithubRepoCreateAction } from './githubRepoCreate'; export { createGithubRepoPushAction } from './githubRepoPush'; export { createGithubWebhookAction } from './githubWebhook'; +export { createGithubDeployKeyAction } from './githubDeployKey'; +export { createGithubEnvironmentAction } from './githubEnvironment'; From 84b0e47373db5b51b99862bd29f5ecef159a0c61 Mon Sep 17 00:00:00 2001 From: mingfu Date: Mon, 5 Jun 2023 15:08:19 +0800 Subject: [PATCH 36/73] chore: Add `TargetBranchName` variable and output for the `publish:gitlab:merge-request` and `publish:github:pull-request` s'cascaffolder actions. Signed-off-by: mingfu --- .changeset/fifty-shirts-brush.md | 5 + plugins/scaffolder-backend/api-report.md | 5 + .../builtin/publish/githubPullRequest.test.ts | 92 +++++++++++++++++++ .../builtin/publish/githubPullRequest.ts | 24 ++++- .../publish/gitlabMergeRequest.test.ts | 51 ++++++++++ .../builtin/publish/gitlabMergeRequest.ts | 28 ++++-- 6 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 .changeset/fifty-shirts-brush.md diff --git a/.changeset/fifty-shirts-brush.md b/.changeset/fifty-shirts-brush.md new file mode 100644 index 0000000000..98cd7b885c --- /dev/null +++ b/.changeset/fifty-shirts-brush.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Add `TargetBranchName` variable and output for the `publish:gitlab:merge-request` and `publish:github:pull-request` s'cascaffolder actions. diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 5e18ad15bf..0e686c31f3 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -584,6 +584,7 @@ export const createPublishGithubPullRequestAction: ( { title: string; branchName: string; + targetBranchName?: string | undefined; description: string; repoUrl: string; draft?: boolean | undefined; @@ -626,6 +627,7 @@ export const createPublishGitlabMergeRequestAction: (options: { title: string; description: string; branchName: string; + targetBranchName?: string | undefined; sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; @@ -772,6 +774,9 @@ export type OctokitWithPullRequestPluginClient = Octokit & { data: { html_url: string; number: number; + base: { + ref: string; + }; }; } | null>; }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts index 7750277728..82f8d22aea 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.test.ts @@ -62,6 +62,9 @@ describe('createPublishGithubPullRequestAction', () => { data: { html_url: 'https://github.com/myorg/myrepo/pull/123', number: 123, + base: { + ref: 'main', + }, }, }; }), @@ -90,6 +93,94 @@ describe('createPublishGithubPullRequestAction', () => { jest.resetAllMocks(); }); + describe('with targetBranchName', () => { + let input: GithubPullRequestActionInput; + let ctx: ActionContext; + + beforeEach(() => { + fakeClient = { + createPullRequest: jest.fn(async (_: any) => { + return { + url: 'https://api.github.com/myorg/myrepo/pull/123', + headers: {}, + status: 201, + data: { + html_url: 'https://github.com/myorg/myrepo/pull/123', + number: 123, + base: { + ref: 'test', + }, + }, + }; + }), + rest: { + pulls: { + requestReviewers: jest.fn(async (_: any) => ({ data: {} })), + }, + }, + }; + + input = { + repoUrl: 'github.com?owner=myorg&repo=myrepo', + title: 'Create my new app', + branchName: 'new-app', + targetBranchName: 'test', + description: 'This PR is really good', + draft: true, + }; + + mockFs({ + [workspacePath]: { 'file.txt': 'Hello there!' }, + }); + + ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + }); + + it('creates a pull request', async () => { + await instance.handler(ctx); + + expect(fakeClient.createPullRequest).toHaveBeenCalledWith({ + owner: 'myorg', + repo: 'myrepo', + title: 'Create my new app', + head: 'new-app', + base: 'test', + body: 'This PR is really good', + draft: true, + changes: [ + { + commit: 'Create my new app', + files: { + 'file.txt': { + content: Buffer.from('Hello there!').toString('base64'), + encoding: 'base64', + mode: '100644', + }, + }, + }, + ], + }); + }); + + it('creates outputs for the pull request url and number', async () => { + await instance.handler(ctx); + + expect(ctx.output).toHaveBeenCalledWith('targetBranchName', 'test'); + expect(ctx.output).toHaveBeenCalledWith( + 'remoteUrl', + 'https://github.com/myorg/myrepo/pull/123', + ); + expect(ctx.output).toHaveBeenCalledWith('pullRequestNumber', 123); + }); + }); + describe('with no sourcePath', () => { let input: GithubPullRequestActionInput; let ctx: ActionContext; @@ -145,6 +236,7 @@ describe('createPublishGithubPullRequestAction', () => { it('creates outputs for the pull request url and number', async () => { await instance.handler(ctx); + expect(ctx.output).toHaveBeenCalledWith('targetBranchName', 'main'); expect(ctx.output).toHaveBeenCalledWith( 'remoteUrl', 'https://github.com/myorg/myrepo/pull/123', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts index 6706ad9c06..167fedc88e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts @@ -42,6 +42,9 @@ export type OctokitWithPullRequestPluginClient = Octokit & { data: { html_url: string; number: number; + base: { + ref: string; + }; }; } | null>; }; @@ -128,6 +131,7 @@ export const createPublishGithubPullRequestAction = ( return createTemplateAction<{ title: string; branchName: string; + targetBranchName?: string; description: string; repoUrl: string; draft?: boolean; @@ -154,6 +158,11 @@ export const createPublishGithubPullRequestAction = ( title: 'Branch Name', description: 'The name for the branch', }, + targetBranchName: { + type: 'string', + title: 'Target Branch Name', + description: 'The target branch name of the merge request', + }, title: { type: 'string', title: 'Pull Request Name', @@ -214,6 +223,10 @@ export const createPublishGithubPullRequestAction = ( required: ['remoteUrl'], type: 'object', properties: { + targetBranchName: { + title: 'Target branch name of the merge request', + type: 'string', + }, remoteUrl: { type: 'string', title: 'Pull Request URL', @@ -231,6 +244,7 @@ export const createPublishGithubPullRequestAction = ( const { repoUrl, branchName, + targetBranchName, title, description, draft, @@ -298,7 +312,7 @@ export const createPublishGithubPullRequestAction = ( ); try { - const response = await client.createPullRequest({ + const createOptions: createPullRequest.Options = { owner, repo, title, @@ -311,7 +325,11 @@ export const createPublishGithubPullRequestAction = ( body: description, head: branchName, draft, - }); + }; + if (targetBranchName) { + createOptions.base = targetBranchName; + } + const response = await client.createPullRequest(createOptions); if (!response) { throw new GithubResponseError('null response from Github'); @@ -329,6 +347,8 @@ export const createPublishGithubPullRequestAction = ( ); } + const targetBranch = response.data.base.ref; + ctx.output('targetBranchName', targetBranch); ctx.output('remoteUrl', response.data.html_url); ctx.output('pullRequestNumber', pullRequestNumber); } catch (e) { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts index c3d0fe58f1..afb93b348a 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.test.ts @@ -101,6 +101,49 @@ describe('createGitLabMergeRequest', () => { mockFs.restore(); }); + describe('createGitLabMergeRequestWithSpecifiedTargetBranch', () => { + it('removeSourceBranch is false by default when not passed in options', async () => { + const input = { + repoUrl: 'gitlab.com?repo=repo&owner=owner', + title: 'Create my new MR', + branchName: 'new-mr', + targetBranchName: 'test', + description: 'This MR is really good', + targetPath: 'Subdirectory', + }; + mockFs({ + [workspacePath]: { + source: { 'foo.txt': 'Hello there!' }, + irrelevant: { 'bar.txt': 'Nothing to see here' }, + }, + }); + const ctx = { + createTemporaryDirectory: jest.fn(), + output: jest.fn(), + logger: getRootLogger(), + logStream: new Writable(), + input, + workspacePath, + }; + await instance.handler(ctx); + + expect(mockGitlabClient.Projects.show).not.toHaveBeenCalled(); + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'test', + ); + expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'test', + 'Create my new MR', + { description: 'This MR is really good', removeSourceBranch: false }, + ); + expect(ctx.output).toHaveBeenCalledWith('targetBranchName', 'test'); + }); + }); + describe('createGitLabMergeRequestWithoutRemoveBranch', () => { it('removeSourceBranch is false by default when not passed in options', async () => { const input = { @@ -126,6 +169,12 @@ describe('createGitLabMergeRequest', () => { }; await instance.handler(ctx); + expect(mockGitlabClient.Projects.show).toHaveBeenCalledWith('owner/repo'); + expect(mockGitlabClient.Branches.create).toHaveBeenCalledWith( + 'owner/repo', + 'new-mr', + 'main', + ); expect(mockGitlabClient.MergeRequests.create).toHaveBeenCalledWith( 'owner/repo', 'new-mr', @@ -133,6 +182,8 @@ describe('createGitLabMergeRequest', () => { 'Create my new MR', { description: 'This MR is really good', removeSourceBranch: false }, ); + + expect(ctx.output).toHaveBeenCalledWith('targetBranchName', 'main'); }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts index 3dfe0cff5c..8abb53288c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts @@ -39,6 +39,7 @@ export const createPublishGitlabMergeRequestAction = (options: { title: string; description: string; branchName: string; + targetBranchName?: string; sourcePath?: string; targetPath?: string; token?: string; @@ -77,8 +78,13 @@ export const createPublishGitlabMergeRequestAction = (options: { }, branchName: { type: 'string', - title: 'Destination Branch name', - description: 'The description of the merge request', + title: 'Source Branch Name', + description: 'The source branch name of the merge request', + }, + targetBranchName: { + type: 'string', + title: 'Target Branch Name', + description: 'The target branch name of the merge request', }, sourcePath: { type: 'string', @@ -119,6 +125,10 @@ export const createPublishGitlabMergeRequestAction = (options: { output: { type: 'object', properties: { + targetBranchName: { + title: 'Target branch name of the merge request', + type: 'string', + }, projectid: { title: 'Gitlab Project id/Name(slug)', type: 'string', @@ -139,6 +149,7 @@ export const createPublishGitlabMergeRequestAction = (options: { const { assignee, branchName, + targetBranchName, description, repoUrl, removeSourceBranch, @@ -211,12 +222,16 @@ export const createPublishGitlabMergeRequestAction = (options: { execute_filemode: file.executable, })); - const projects = await api.Projects.show(repoID); + let targetBranch = targetBranchName; + if (!targetBranch) { + const projects = await api.Projects.show(repoID); - const { default_branch: defaultBranch } = projects; + const { default_branch: defaultBranch } = projects; + targetBranch = defaultBranch!; + } try { - await api.Branches.create(repoID, branchName, String(defaultBranch)); + await api.Branches.create(repoID, branchName, String(targetBranch)); } catch (e) { throw new InputError( `The branch creation failed. Please check that your repo does not already contain a branch named '${branchName}'. ${e}`, @@ -235,7 +250,7 @@ export const createPublishGitlabMergeRequestAction = (options: { const mergeRequestUrl = await api.MergeRequests.create( repoID, branchName, - String(defaultBranch), + String(targetBranch), title, { description, @@ -246,6 +261,7 @@ export const createPublishGitlabMergeRequestAction = (options: { return mergeRequest.web_url; }); ctx.output('projectid', repoID); + ctx.output('targetBranchName', targetBranch); ctx.output('projectPath', repoID); ctx.output('mergeRequestUrl', mergeRequestUrl); } catch (e) { From 7d478b9bea086f9adf277eea1b8f2081caaedd9c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 17:33:50 +0000 Subject: [PATCH 37/73] fix(deps): update dependency google-auth-library to v8.8.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 943bd87958..e0410836ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25833,13 +25833,13 @@ __metadata: languageName: node linkType: hard -"gcp-metadata@npm:^5.0.0": - version: 5.0.0 - resolution: "gcp-metadata@npm:5.0.0" +"gcp-metadata@npm:^5.2.0": + version: 5.2.0 + resolution: "gcp-metadata@npm:5.2.0" dependencies: gaxios: ^5.0.0 json-bigint: ^1.0.0 - checksum: b75635e564a39ef0a6ebbff0daa97cea37382c3d6f0d7a6a0406e03a275de804a74e3f3d410d5313a6c9dd3496023e96bc81474917fa8369974398eb069d9645 + checksum: 4e7ed589c814bb79cbf052b0eda1d5e219fbee030f4772eca27ec1e6e1faa85ba0ef3b17ea5c3fd51a54fc5429c924b4edbb260ac147701f211fb9807b893544 languageName: node linkType: hard @@ -26192,19 +26192,19 @@ __metadata: linkType: hard "google-auth-library@npm:^8.0.0, google-auth-library@npm:^8.0.1, google-auth-library@npm:^8.0.2": - version: 8.7.0 - resolution: "google-auth-library@npm:8.7.0" + version: 8.8.0 + resolution: "google-auth-library@npm:8.8.0" dependencies: arrify: ^2.0.0 base64-js: ^1.3.0 ecdsa-sig-formatter: ^1.0.11 fast-text-encoding: ^1.0.0 gaxios: ^5.0.0 - gcp-metadata: ^5.0.0 + gcp-metadata: ^5.2.0 gtoken: ^6.1.0 jws: ^4.0.0 lru-cache: ^6.0.0 - checksum: 978d1c5f763aceddbc0218cd76fa578c8ba54a0653cefffaf61847bb8d246ebf26e7fcd276d8885b8a3354c17eef0a11cfae9e60e4df62c01cae4378d4eb78e4 + checksum: 4552805466679e258febc4c0621d401d510df267f2f105957b8925b79c1454d9a2e5d53af211dd90a1848658f608babac7f5bc2f3c536c441ba32ba3641d335d languageName: node linkType: hard From 7f2edfa6f07ffab07e5f16abac9dd66716fcd317 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 6 Jun 2023 10:00:14 -0400 Subject: [PATCH 38/73] chore(docs): Refresh CLI command details Signed-off-by: Adam Harvey --- docs/local-dev/cli-commands.md | 85 +++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/docs/local-dev/cli-commands.md b/docs/local-dev/cli-commands.md index 66a1855fca..29cc8635aa 100644 --- a/docs/local-dev/cli-commands.md +++ b/docs/local-dev/cli-commands.md @@ -10,55 +10,64 @@ and where to use them. ## help This command displays a help summary or detailed help screens for each command. -Below is a cleaned up output of `yarn backstage-cli --help` +Below is a cleaned up output of `yarn backstage-cli --help`: ```text -repo [command] Command that run across an entire Backstage project -package [command] Lifecycle scripts for individual packages -migrate [command] Migration utilities - -create Open up an interactive guide to creating new things in your app - -config:docs Browse the configuration reference documentation -config:print Print the app configuration for the current package -config:check Validate that the given configuration loads and matches schema -config:schema Dump the app configuration schema - -versions:bump Bump Backstage packages to the latest versions -versions:check Check Backstage package versioning - -build-workspace Builds a temporary dist workspace from the provided packages -create-github-app Create new GitHub App in your organization (experimental) - -info Show helpful information for debugging and reporting bugs -help [command] display help for command +new [options] Open up an interactive guide to creating new things in + your app +test Run tests, forwarding args to Jest, defaulting to watch + mode [DEPRECATED] +config:docs [options] Browse the configuration reference documentation +config:print [options] Print the app configuration for the current package +config:check [options] Validate that the given configuration loads and matches + schema +config:schema [options] Print configuration schema +repo [command] Command that run across an entire Backstage project +package [command] Lifecycle scripts for individual packages +migrate [command] Migration utilities +versions:bump [options] Bump Backstage packages to the latest versions +versions:check [options] Check Backstage package versioning +clean Delete cache directories [DEPRECATED] +build-workspace [packages...] Builds a temporary dist workspace from the provided + packages +create-github-app Create new GitHub App in your organization. +info Show helpful information for debugging and reporting bugs +help [command] display help for command ``` -The `package` command category, `yarn backstage-cli package --help` +The `package` command category, `yarn backstage-cli package --help`: ```text -start [options] Start a package for local development -build [options] Build a package for production deployment or publishing -lint [options] Lint a package -test Run tests, forwarding args to Jest, defaulting to watch mode -clean Delete cache directories -prepack Prepares a package for packaging before publishing -postpack Restores the changes made by the prepack command +start [options] Start a package for local development +build [options] Build a package for production deployment or publishing +lint [options] [directories...] Lint a package +test Run tests, forwarding args to Jest, defaulting to watch mode +clean Delete cache directories +prepack Prepares a package for packaging before publishing +postpack Restores the changes made by the prepack command +help [command] display help for command ``` -The `repo` command category, `yarn backstage-cli repo --help` +The `repo` command category, `yarn backstage-cli repo --help`: ```text -build [options] Build packages in the project, excluding bundled app and backend packages. -lint [options] Lint all packages in the project +build [options] Build packages in the project, excluding bundled app and backend packages. +lint [options] Lint all packages in the project +clean Delete cache and output directories +list-deprecations [options] List deprecations +test [options] Run tests, forwarding args to Jest, defaulting to watch mode +help [command] display help for command ``` -The `migrate` command category, `yarn backstage-cli migrate --help` +The `migrate` command category, `yarn backstage-cli migrate --help`: ```text package-roles Add package role field to packages that don't have it package-scripts Set package scripts according to each package role +package-exports Synchronize package subpath export definitions package-lint-configs Migrates all packages to use @backstage/cli/config/eslint-factory +react-router-deps Migrates the react-router dependencies for all packages to be peer dependencies +help [command] display help for command ``` ## repo build @@ -235,7 +244,7 @@ Options: -h, --help display help for command ``` -## config:docs +## config\:docs This commands opens up the reference documentation of your apps local configuration schema in the browser. This is useful to get an overview of what @@ -252,7 +261,7 @@ Options: -h, --help display help for command ``` -## config:print +## config\:print Print the static configuration, defaulting to reading `app-config.yaml` in the repo root, using schema collected from all local packages in the repo. @@ -277,7 +286,7 @@ Options: -h, --help display help for command ``` -## config:check +## config\:check Validate that static configuration loads and matches schema, defaulting to reading `app-config.yaml` in the repo root and using schema collected from all @@ -296,7 +305,7 @@ Options: -h, --help display help for command ``` -## config:schema +## config\:schema Dump the configuration schema that was collected from all local packages in the repo. @@ -315,7 +324,7 @@ Options: -h, --help display help for command ``` -## versions:bump +## versions\:bump Bump all `@backstage` packages to the latest versions. This checks for updates in the package registry, and will update entries both in `yarn.lock` and @@ -330,7 +339,7 @@ Options: --release Bump to a specific Backstage release line or version (default: "main") ``` -## versions:check +## versions\:check Validate `@backstage` dependencies within the repo, making sure that there are no duplicates of packages that might lead to breakages. From c7f2097f373ed5fb05aba3fe241d18ce10388e23 Mon Sep 17 00:00:00 2001 From: djamaile Date: Tue, 16 May 2023 14:31:49 +0200 Subject: [PATCH 39/73] docs: add docs about Backstage Deploy Signed-off-by: djamaile --- docs/deployment/backstage-deploy/aws.md | 188 ++++++++++++++++++++++++ microsite/sidebars.json | 9 +- 2 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 docs/deployment/backstage-deploy/aws.md diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md new file mode 100644 index 0000000000..cac9ede624 --- /dev/null +++ b/docs/deployment/backstage-deploy/aws.md @@ -0,0 +1,188 @@ +--- +id: aws +title: Deploying Backstage on AWS Lightsail +sidebar_label: AWS +description: How to deploy Backstage on AWS Lightsail +--- + +> **DISCLAIMER: The `deploy` command is in alpha and still experimental. Do not use the `deploy` command for production deployments.** + +Getting started with Backstage often involves setting up an instance on a cloud provider and sharing it with your team so they can experiment. To make this cloud deployment easier, we've built a `deploy` command to stand up a proof-of-concept instance on AWS (using Lightsail). + +## What is AWS Lightsail + +:::tip + +AWS offers a free tier for up to three months on $10 USD/month Container service (Micro -1 node). By default we use the `nano` node, so if you are a new user this approach shouldn't cost you anything. For more information, refer to the [pricing](https://aws.amazon.com/lightsail/pricing/) documentation. + +::: + +AWS Lightsail offers a simple way to run containers in the cloud. To learn more about AWS Lightsail, please refer to the [official documentation](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-container-services-deployments). + +## Creating user in AWS + +- Open the AWS console and navigate to the IAM section +- In the left side menu click on `Users` and then click on `Add users` +- Specify a username and then click on `Next` +- Afterwards you can assign permissions, select `Attach policies directly` and then click on `Create policy`. + This should take you to a new window in which you can create a new policy based on `JSON`. + Copy over the following: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "ecr:DescribeImageReplicationStatus", + "ecr:ListTagsForResource", + "ecr:UploadLayerPart", + "ecr:BatchGetRepositoryScanningConfiguration", + "ecr:DeleteRepository", + "ecr:GetRegistryScanningConfiguration", + "ecr:CompleteLayerUpload", + "ecr:TagResource", + "ecr:DescribeRepositories", + "ecr:DeleteRepositoryPolicy", + "ecr:BatchCheckLayerAvailability", + "ecr:GetLifecyclePolicy", + "ecr:GetRegistryPolicy", + "ecr:PutLifecyclePolicy", + "ecr:DescribeImageScanFindings", + "ecr:GetLifecyclePolicyPreview", + "ecr:CreateRepository", + "ecr:DescribeRegistry", + "ecr:GetDownloadUrlForLayer", + "ecr:GetAuthorizationToken", + "ecr:DeleteLifecyclePolicy", + "ecr:PutImage", + "ecr:UntagResource", + "ecr:SetRepositoryPolicy", + "ecr:BatchGetImage", + "ecr:InitiateLayerUpload", + "ecr:GetRepositoryPolicy", + "lightsail:CreateContainerService", + "lightsail:GetKeyPair", + "lightsail:GetContainerServiceDeployments", + "lightsail:CreateContainerServiceRegistryLogin", + "lightsail:GetContainerImages", + "lightsail:UntagResource", + "lightsail:RegisterContainerImage", + "lightsail:GetContainerServices", + "lightsail:GetContainerServicePowers", + "lightsail:GetKeyPairs", + "lightsail:CreateContainerServiceDeployment", + "lightsail:GetContainerServiceMetricData", + "lightsail:GetContainerAPIMetadata", + "lightsail:DeleteContainerService", + "lightsail:GetContainerLog", + "lightsail:TagResource" + ], + "Resource": "*" + }, + { + "Sid": "Statement1", + "Effect": "Allow", + "Action": [], + "Resource": [] + } + ] +} +``` + +Then click on `Next` and give the policy a name and a description of your liking. Afterwards, click on `Create policy`. + +- Navigate back to the user creation window and press on the refresh button and search for the policy you just created. Now, create the user. +- Now you will be redirected to all users, click on the user you just created and click on `Security credentials` +- Scroll below and click on `Create access key` +- Choose `Command Line Interface (CLI)` +- Now export the following values + +```bash +$ export AWS_ACCESS_KEY_ID=... (first value) +$ export AWS_SECRET_ACCESS_KEY=.... (second secret value) +``` + +## Configuring the Pulumi CLI + +Second, install the [Pulumi CLI](https://www.pulumi.com/docs/get-started/install/). + +Then we need to execute the following commands, to set Pulumi up: + +```bash +$ pulumi login --local +$ export PULUMI_CONFIG_PASSPHRASE="" +``` + +By using `pulumi login --local` we are making sure that Pulumi stores our state on the local file disk. The environment variable `PULUMI_CONFIG_PASSPHRASE` is used by Pulumi to generate a unique key for your stack + +## Deploying your instance on Lightsail + +:::warning + +Make sure that [Docker](https://docs.docker.com/) is running before you start with this section. + +::: + +After you have made your changes to your local instance, it's time to deploy it on Lightsail. + +First, we need to configure the `app-config.yaml` and update the `baseUrl`. + +```diff +app: +- baseUrl: http://localhost:3000 ++ baseUrl: ${BACKSTAGE_HOST} + +backend: +- baseUrl: http://localhost:7007 ++ baseUrl: ${BACKSTAGE_HOST} + listen: + port: 7007 +``` + +The environment variable `BACKSTAGE_HOST` will be set to the endpoint that AWS Lightsail creates. + +In addition, you should create a `app-config.local.yaml`: + +```bash +$ touch app-config.local.yaml +``` + +And then update the file with the following yaml: + +```yaml +app: + baseUrl: http://localhost:3000 + +backend: + baseUrl: http://localhost:7007 +``` + +Now we can deploy our instance! + +```bash +$ npx backstage-deploy aws --stack backstage-poc --create-dockerfile +``` + +In the first part of the command, we are specifying that we want to deploy our instance on AWS. With the [`--stack`](https://www.pulumi.com/docs/reference/cli/pulumi_stack/) option, we are providing Pulumi a reference to our container deployment. Furthermore, with the `--create-dockerfile` option, there will be a `Dockerfile` and `.dockerignore` created in the root of the project. + +After running the command, Pulumi will start creating the following resources for you in AWS: + +- ECR Repository +- Lightsail Container Service +- Lightsail Container Service Deployment +- Policy that allows Lightsail to pull from ECR + +If it's the first time building the Docker image, it might take a while for everything to be fully provisioned. After the command is finished running, your Backstage instance should be up and running on AWS Lightsail! 🎉 + +### Cleaning up resources + +Cleaning up the resources is also done with the deploy command. + +```bash +$ npx backstage-deploy aws --stack backstage-poc --destroy +``` + +This will delete everything that was originally created by the `deploy` command. \ No newline at end of file diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 972a67f424..f697255539 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -325,7 +325,14 @@ "deployment/scaling", "deployment/docker", "deployment/k8s", - "deployment/heroku" + "deployment/heroku", + { + "type": "category", + "label": "Deploying on a cloud provider with Backstage Deploy", + "items": [ + "deployment/backstage-deploy/aws" + ] + } ], "Designing for Backstage": [ "dls/design", From ff7fe9abdd119a9b35ee3ffb1283b0a90ec6d553 Mon Sep 17 00:00:00 2001 From: djamaile Date: Tue, 16 May 2023 14:52:45 +0200 Subject: [PATCH 40/73] fix: add words to vale Signed-off-by: djamaile --- .github/vale/Vocab/Backstage/accept.txt | 2 ++ docs/deployment/backstage-deploy/aws.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index e9fc74b874..2c50b55219 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -434,3 +434,5 @@ zod Zolotusky zoomable zsh +Pulumi +Lightsail diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md index cac9ede624..e5309b8a83 100644 --- a/docs/deployment/backstage-deploy/aws.md +++ b/docs/deployment/backstage-deploy/aws.md @@ -185,4 +185,4 @@ Cleaning up the resources is also done with the deploy command. $ npx backstage-deploy aws --stack backstage-poc --destroy ``` -This will delete everything that was originally created by the `deploy` command. \ No newline at end of file +This will delete everything that was originally created by the `deploy` command. From 4dd8b4dea28fd91de945481f8516d3cbd4e3dfbd Mon Sep 17 00:00:00 2001 From: djamaile Date: Tue, 16 May 2023 16:07:25 +0200 Subject: [PATCH 41/73] fix: run prettier on sidebar Signed-off-by: djamaile --- microsite/sidebars.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/microsite/sidebars.json b/microsite/sidebars.json index f697255539..dc24a57737 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -329,9 +329,7 @@ { "type": "category", "label": "Deploying on a cloud provider with Backstage Deploy", - "items": [ - "deployment/backstage-deploy/aws" - ] + "items": ["deployment/backstage-deploy/aws"] } ], "Designing for Backstage": [ From 60f31ee9ea8b3e32829c056e18061eede35b077b Mon Sep 17 00:00:00 2001 From: Djam Date: Wed, 31 May 2023 21:37:19 +0200 Subject: [PATCH 42/73] Update docs/deployment/backstage-deploy/aws.md Co-authored-by: Patrik Oldsberg Signed-off-by: Djam --- docs/deployment/backstage-deploy/aws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md index e5309b8a83..897eb440c3 100644 --- a/docs/deployment/backstage-deploy/aws.md +++ b/docs/deployment/backstage-deploy/aws.md @@ -122,7 +122,7 @@ By using `pulumi login --local` we are making sure that Pulumi stores our state :::warning -Make sure that [Docker](https://docs.docker.com/) is running before you start with this section. +Make sure that [Docker](https://docs.docker.com/) is running before you start this section. ::: From 124ab2fd477129d7a234cf21bb0d1b020d7b7082 Mon Sep 17 00:00:00 2001 From: djamaile Date: Wed, 31 May 2023 21:59:50 +0200 Subject: [PATCH 43/73] chore: address feedback Signed-off-by: djamaile --- docs/deployment/backstage-deploy/aws.md | 10 ++++++++-- microsite/sidebars.json | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md index 897eb440c3..9d5fdc3ebb 100644 --- a/docs/deployment/backstage-deploy/aws.md +++ b/docs/deployment/backstage-deploy/aws.md @@ -1,7 +1,7 @@ --- -id: aws +id: aws-lightsail title: Deploying Backstage on AWS Lightsail -sidebar_label: AWS +sidebar_label: AWS Lightsail description: How to deploy Backstage on AWS Lightsail --- @@ -111,6 +111,12 @@ Second, install the [Pulumi CLI](https://www.pulumi.com/docs/get-started/install Then we need to execute the following commands, to set Pulumi up: +:::tip + +Make sure to store your passphrase somewhere save as it is used to encrypt/decrypt your Pulumi config. + +::: + ```bash $ pulumi login --local $ export PULUMI_CONFIG_PASSPHRASE="" diff --git a/microsite/sidebars.json b/microsite/sidebars.json index dc24a57737..f612e7b880 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -328,8 +328,8 @@ "deployment/heroku", { "type": "category", - "label": "Deploying on a cloud provider with Backstage Deploy", - "items": ["deployment/backstage-deploy/aws"] + "label": "Using Backstage Deploy (alpha)", + "items": ["deployment/backstage-deploy/aws-lightsail"] } ], "Designing for Backstage": [ From e939b298a527a776fe878034ad4a13d1f2ee000d Mon Sep 17 00:00:00 2001 From: djamaile Date: Thu, 1 Jun 2023 17:15:02 +0200 Subject: [PATCH 44/73] chore: rewrite app-config instructrions Signed-off-by: djamaile --- docs/deployment/backstage-deploy/aws.md | 26 ++++++------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md index 9d5fdc3ebb..93f38bcc3e 100644 --- a/docs/deployment/backstage-deploy/aws.md +++ b/docs/deployment/backstage-deploy/aws.md @@ -134,38 +134,24 @@ Make sure that [Docker](https://docs.docker.com/) is running before you start th After you have made your changes to your local instance, it's time to deploy it on Lightsail. -First, we need to configure the `app-config.yaml` and update the `baseUrl`. - -```diff -app: -- baseUrl: http://localhost:3000 -+ baseUrl: ${BACKSTAGE_HOST} - -backend: -- baseUrl: http://localhost:7007 -+ baseUrl: ${BACKSTAGE_HOST} - listen: - port: 7007 -``` - -The environment variable `BACKSTAGE_HOST` will be set to the endpoint that AWS Lightsail creates. - -In addition, you should create a `app-config.local.yaml`: +First, we need to configure a new `app-config` file and update the `baseUrl`. ```bash -$ touch app-config.local.yaml +$ touch app-config.deployment.yaml ``` And then update the file with the following yaml: ```yaml app: - baseUrl: http://localhost:3000 + baseUrl: ${BACKSTAGE_HOST} backend: - baseUrl: http://localhost:7007 + baseUrl: ${BACKSTAGE_HOST} ``` +The environment variable `BACKSTAGE_HOST` will be set to the endpoint that AWS Lightsail creates. + Now we can deploy our instance! ```bash From 705f31bb012b89ecd557190a2b1e873120b00836 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 7 Jun 2023 11:47:23 +0200 Subject: [PATCH 45/73] Update docs/deployment/backstage-deploy/aws.md Signed-off-by: Patrik Oldsberg --- docs/deployment/backstage-deploy/aws.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md index 93f38bcc3e..957dc27437 100644 --- a/docs/deployment/backstage-deploy/aws.md +++ b/docs/deployment/backstage-deploy/aws.md @@ -113,7 +113,7 @@ Then we need to execute the following commands, to set Pulumi up: :::tip -Make sure to store your passphrase somewhere save as it is used to encrypt/decrypt your Pulumi config. +Make sure to store your passphrase somewhere safe as it is used to encrypt/decrypt your Pulumi config. ::: From 91f39df52d60e2a1cb870fc0e747a09c176f5b59 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Wed, 7 Jun 2023 14:01:34 -0500 Subject: [PATCH 46/73] feat(kubernetes-backend): HEADER_KUBERNETES_CLUSTER optional in single cluster setup Signed-off-by: Carlos Esteban Lopez --- .changeset/fuzzy-pots-worry.md | 5 + .../src/service/KubernetesProxy.test.ts | 148 ++++++++++++------ .../src/service/KubernetesProxy.ts | 21 ++- 3 files changed, 119 insertions(+), 55 deletions(-) create mode 100644 .changeset/fuzzy-pots-worry.md diff --git a/.changeset/fuzzy-pots-worry.md b/.changeset/fuzzy-pots-worry.md new file mode 100644 index 0000000000..f84531b502 --- /dev/null +++ b/.changeset/fuzzy-pots-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +K8s proxy HEADER_KUBERNETES_CLUSTER is now optional in single-cluster setups. diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 4ed1c8a7ae..aaf3843e61 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -104,6 +104,56 @@ describe('KubernetesProxy', () => { ).rejects.toThrow(NotFoundError); }); + it('should return a ERROR_NOT_FOUND if multi-cluster & no cluster selected', async () => { + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'local', + url: 'http:/localhost:8001', + authProvider: 'localKubectlProxy', + skipMetricsLookup: true, + } as ClusterDetails, + { + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: 'tokenA', + authProvider: 'googleServiceAccount', + } as ClusterDetails, + ]); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + const req = buildMockRequest(undefined, 'api'); + const { res, next } = getMockRes(); + + await expect( + proxy.createRequestHandler({ permissionApi })(req, res, next), + ).rejects.toThrow(NotFoundError); + }); + + it('should return a ERROR_NOT_FOUND if selected cluster not in config', async () => { + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: 'tokenA', + authProvider: 'googleServiceAccount', + } as ClusterDetails, + ]); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + const req = buildMockRequest('test', 'api'); + const { res, next } = getMockRes(); + + await expect( + proxy.createRequestHandler({ permissionApi })(req, res, next), + ).rejects.toThrow(NotFoundError); + }); + it('should pass the exact response from Kubernetes', async () => { const apiResponse = { kind: 'APIVersions', @@ -155,6 +205,55 @@ describe('KubernetesProxy', () => { expect(response.body).toStrictEqual(apiResponse); }); + it('should pass the exact response from Kubernetes default cluster & no cluster selected in single cluster setup', async () => { + const apiResponse = { + kind: 'APIVersions', + versions: ['v1'], + serverAddressByClientCIDRs: [ + { + clientCIDR: '0.0.0.0/0', + serverAddress: '192.168.0.1:3333', + }, + ], + }; + + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: '', + authProvider: 'serviceAccount', + }, + ] as ClusterDetails[]); + + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); + + authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ + name: 'cluster1', + url: 'https://localhost:9999', + serviceAccountToken: '', + authProvider: 'serviceAccount', + } as ClusterDetails); + + const router = Router(); + router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); + const app = express().use(router); + const requestPromise = request(app).get('/mountpath/api'); + worker.use( + rest.get('https://localhost:9999/api', (_: any, res: any, ctx: any) => + res(ctx.status(299), ctx.json(apiResponse)), + ), + rest.all(requestPromise.url, (req: any) => req.passthrough()), + ); + + const response = await requestPromise; + + expect(response.status).toEqual(299); + expect(response.body).toStrictEqual(apiResponse); + }); + it('sets host header to support clusters behind name-based virtual hosts', async () => { worker.use( rest.get( @@ -481,55 +580,6 @@ describe('KubernetesProxy', () => { }); }); - it('should return a 400 error if Backstage-Kubernetes-Cluster field isnt provided in request', async () => { - worker.use( - rest.get('https://localhost:9999/api/v1/namespaces', (_req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ - kind: 'NamespaceList', - apiVersion: 'v1', - items: [], - }), - ); - }), - ); - - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - - clusterSupplier.getClusters.mockResolvedValue([ - { - name: 'cluster1', - url: 'https://localhost:9999', - authProvider: 'googleServiceAccount', - }, - ] as ClusterDetails[]); - - authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ - name: 'cluster1', - url: 'https://localhost:9999', - serviceAccountToken: 'tokenA', - authProvider: 'googleServiceAccount', - } as ClusterDetails); - - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - router.use(errorHandler()); - const app = express().use(router); - - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_AUTH, 'tokenB'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); - - const response = await requestPromise; - - expect(response.status).toEqual(400); - }); - it('returns a 500 error if authTranslator errors out and Backstage-Kubernetes-Authorization field is not provided', async () => { worker.use( rest.get('https://localhost:9999/api/v1/namespaces', (req, res, ctx) => { diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index b4ca87d6f0..8e8fd54c77 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -17,7 +17,6 @@ import { ErrorResponseBody, ForwardedError, - InputError, NotAllowedError, NotFoundError, serializeError, @@ -175,13 +174,23 @@ export class KubernetesProxy { private async getClusterForRequest(req: Request): Promise { const clusterName = req.header(HEADER_KUBERNETES_CLUSTER); - if (!clusterName) { - throw new InputError(`Missing '${HEADER_KUBERNETES_CLUSTER}' header.`); + const clusters = await this.clusterSupplier.getClusters(); + + if (!clusters || clusters.length <= 0) { + throw new NotFoundError(`No Clusters configured`); + } + + const hasClusterNameHeader = + typeof clusterName === 'string' && clusterName.length > 0; + + let cluster: ClusterDetails | undefined; + + if (hasClusterNameHeader) { + cluster = clusters.find(c => c.name === clusterName); + } else if (clusters.length === 1) { + cluster = clusters.at(0); } - const cluster = await this.clusterSupplier - .getClusters() - .then(clusters => clusters.find(c => c.name === clusterName)); if (!cluster) { throw new NotFoundError(`Cluster '${clusterName}' not found`); } From f9f912342841b53218cdf82154f3090a0391d78a Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Thu, 8 Jun 2023 21:41:16 +0200 Subject: [PATCH 47/73] Update discovery.md Signed-off-by: Alex Eftimie --- docs/integrations/github/discovery.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md index f01085dd86..46d59cbf1b 100644 --- a/docs/integrations/github/discovery.md +++ b/docs/integrations/github/discovery.md @@ -94,7 +94,7 @@ export default async function createPlugin( scheduler: env.scheduler, }); env.eventBroker.subscribe(githubProvider); - builder.addEntityProvider(demoProvider); + builder.addEntityProvider(githubProvider); /* highlight-add-end */ const { processingEngine, router } = await builder.build(); await processingEngine.start(); From e9c45927d5d549c580ffd9d6bc4bb68c1a328bd8 Mon Sep 17 00:00:00 2001 From: djamaile Date: Fri, 9 Jun 2023 01:38:08 +0200 Subject: [PATCH 48/73] chore: add docs reference back Signed-off-by: djamaile --- microsite/blog/2023-05-06-backstage-deploy-alpha.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx index cc0f3ee1a9..1a783b026a 100644 --- a/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx +++ b/microsite/blog/2023-05-06-backstage-deploy-alpha.mdx @@ -38,7 +38,7 @@ It's now time to put the Deploy CLI into action and deploy a Backstage POC. The Deploy CLI makes use of [Pulumi](https://www.pulumi.com/docs/) which is an infrastructure-as-code tool that helps provision resources in the cloud. Before you get started, ensure you have the [Pulumi CLI](https://www.pulumi.com/docs/cli/) and [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed on your local machine. -You can find the step-by-step installation documentation for Pulumi under the [Deployment section](https://backstage.io/docs/deployment/pulumi/aws). +You can find the step-by-step installation documentation for Pulumi under the [Deployment section](https://backstage.io/docs/deployment/backstage-deploy/aws-lightsail). But we summarize the steps to deploy your POC here. You can invoke the the CLI you can use the following command: @@ -74,5 +74,6 @@ So, please try this new CLI out and let us know what you think on [Discord](http Useful links: - [Backstage Deploy](https://github.com/backstage/backstage-deploy) +- [Documentation](https://backstage.io/docs/deployment/backstage-deploy/aws-lightsail) - [Pulumi docs](https://www.pulumi.com/docs/) - [#deployment](https://discord.com/channels/687207715902193673/995973463208644678) channel in Discord From af03e921924a77e284293a43dd1af79aca385a7b Mon Sep 17 00:00:00 2001 From: siddhant1 Date: Mon, 22 May 2023 15:02:57 +0530 Subject: [PATCH 49/73] Fix tabindex Signed-off-by: siddhant1 --- .../search-react/src/components/SearchFilter/SearchFilter.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx b/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx index 6194ab8387..8579f01caa 100644 --- a/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx +++ b/plugins/search-react/src/components/SearchFilter/SearchFilter.tsx @@ -138,7 +138,6 @@ export const CheckboxFilter = (props: SearchFilterComponentProps) => { control={ Date: Wed, 7 Jun 2023 12:09:06 +0200 Subject: [PATCH 50/73] docs: add changeset file Signed-off-by: Camila Belo --- .changeset/chilly-parrots-pay.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chilly-parrots-pay.md diff --git a/.changeset/chilly-parrots-pay.md b/.changeset/chilly-parrots-pay.md new file mode 100644 index 0000000000..f6f19f5f64 --- /dev/null +++ b/.changeset/chilly-parrots-pay.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-react': patch +--- + +Fix accessibility issue in `SearchCheckbox` component, making it possible to use the field via keyboard. From 7374b3fd68a5f372a73b7eb3cfadcd6385f702fb Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 9 Jun 2023 13:50:43 +0200 Subject: [PATCH 51/73] fix: remove sidebar item headings Signed-off-by: Camila Belo --- .../src/layout/Sidebar/Items.tsx | 6 ++++- .../src/layout/Sidebar/SidebarSubmenu.tsx | 2 +- .../src/layout/Sidebar/SidebarSubmenuItem.tsx | 26 +++++++++++++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/core-components/src/layout/Sidebar/Items.tsx b/packages/core-components/src/layout/Sidebar/Items.tsx index 924182086f..715e0d4af7 100644 --- a/packages/core-components/src/layout/Sidebar/Items.tsx +++ b/packages/core-components/src/layout/Sidebar/Items.tsx @@ -411,7 +411,11 @@ const SidebarItemBase = forwardRef((props, ref) => { {itemIcon} {text && ( - + {text} )} diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx index 949148d7a1..85ba923672 100644 --- a/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx +++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx @@ -127,7 +127,7 @@ export const SidebarSubmenu = (props: SidebarSubmenuProps) => { [classes.drawerOpen]: isSubmenuOpen, })} > - + {props.title} {props.children} diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx index d05ee23636..d1925036bb 100644 --- a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx +++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx @@ -172,11 +172,19 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { )} > {Icon && } - + {title}
{subtitle && ( - + {subtitle} )} @@ -204,7 +212,7 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { onClick={closeSubmenu} onTouchStart={e => e.stopPropagation()} > - + {object.title} @@ -230,11 +238,19 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => { onTouchStart={e => e.stopPropagation()} > {Icon && } - + {title}
{subtitle && ( - + {subtitle} )} From 25eb82eec147f5b4815dcabb39de57ef95792fc5 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 9 Jun 2023 14:07:09 +0200 Subject: [PATCH 52/73] fix(explore): tools card header Signed-off-by: Camila Belo --- plugins/explore/src/components/ToolCard/ToolCard.test.tsx | 8 ++++++-- plugins/explore/src/components/ToolCard/ToolCard.tsx | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/explore/src/components/ToolCard/ToolCard.test.tsx b/plugins/explore/src/components/ToolCard/ToolCard.test.tsx index a216f65c5d..20bf6bb594 100644 --- a/plugins/explore/src/components/ToolCard/ToolCard.test.tsx +++ b/plugins/explore/src/components/ToolCard/ToolCard.test.tsx @@ -36,8 +36,12 @@ describe('', () => { }); it('renders props correctly', () => { - const { getByText } = render(wrapInTestApp()); - expect(getByText(minProps.card.title)).toBeInTheDocument(); + const { getByRole, getByText } = render( + wrapInTestApp(), + ); + expect( + getByRole('heading', { name: minProps.card.title }), + ).toBeInTheDocument(); expect(getByText(minProps.card.description)).toBeInTheDocument(); }); diff --git a/plugins/explore/src/components/ToolCard/ToolCard.tsx b/plugins/explore/src/components/ToolCard/ToolCard.tsx index f6137d9c01..a39806dceb 100644 --- a/plugins/explore/src/components/ToolCard/ToolCard.tsx +++ b/plugins/explore/src/components/ToolCard/ToolCard.tsx @@ -74,7 +74,7 @@ export const ToolCard = ({ card, objectFit }: Props) => { })} /> - + {title}{' '} {lifecycle && lifecycle.toLocaleLowerCase('en-US') !== 'ga' && ( Date: Fri, 9 Jun 2023 16:47:59 +0200 Subject: [PATCH 53/73] docs: add changeset files Signed-off-by: Camila Belo --- .changeset/good-sloths-pretend.md | 5 +++++ .changeset/two-cobras-shake.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/good-sloths-pretend.md create mode 100644 .changeset/two-cobras-shake.md diff --git a/.changeset/good-sloths-pretend.md b/.changeset/good-sloths-pretend.md new file mode 100644 index 0000000000..a0d8859707 --- /dev/null +++ b/.changeset/good-sloths-pretend.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Enhance the sidebar item accessibility by using appropriate header semantics. diff --git a/.changeset/two-cobras-shake.md b/.changeset/two-cobras-shake.md new file mode 100644 index 0000000000..173d68e626 --- /dev/null +++ b/.changeset/two-cobras-shake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-explore': patch +--- + +Enhance the tools card accessibility by using appropriate header semantics. From 3da5866edb35e04499cb7164919520916683e16d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 15:53:47 +0000 Subject: [PATCH 54/73] chore(deps): update backstage/actions action to v0.6.4 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/automate_changeset_feedback.yml | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/cron.yml | 2 +- .github/workflows/deploy_docker-image.yml | 2 +- .github/workflows/deploy_nightly.yml | 2 +- .github/workflows/deploy_packages.yml | 4 ++-- .github/workflows/issue.yaml | 2 +- .github/workflows/pr-review-comment.yaml | 2 +- .github/workflows/pr.yaml | 2 +- .github/workflows/sync_code-formatting.yml | 2 +- .github/workflows/sync_snyk-github-issues.yml | 2 +- .github/workflows/uffizzi-build.yml | 2 +- .github/workflows/verify_accessibility.yml | 2 +- .github/workflows/verify_e2e-kubernetes.yml | 2 +- .github/workflows/verify_e2e-linux.yml | 2 +- .github/workflows/verify_storybook.yml | 2 +- 16 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index f02ecc3525..9cadf12b4f 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -29,7 +29,7 @@ jobs: ref: 'refs/pull/${{ github.event.pull_request.number }}/merge' - name: fetch base run: git fetch --depth 1 origin ${{ github.base_ref }} - - uses: backstage/actions/changeset-feedback@v0.6.3 + - uses: backstage/actions/changeset-feedback@v0.6.4 name: Generate feedback with: diff-ref: 'origin/master' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec0a791dcb..3e9b079e9f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -66,7 +66,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -188,7 +188,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 3164fd138e..ef8906818f 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -8,7 +8,7 @@ jobs: cron: runs-on: ubuntu-latest steps: - - uses: backstage/actions/cron@v0.6.3 + - uses: backstage/actions/cron@v0.6.4 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 4cd296827d..6fdfd5d5a4 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -26,7 +26,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/deploy_nightly.yml b/.github/workflows/deploy_nightly.yml index 2a9c91b820..e48a6b97ab 100644 --- a/.github/workflows/deploy_nightly.yml +++ b/.github/workflows/deploy_nightly.yml @@ -22,7 +22,7 @@ jobs: node-version: 18.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v18.x diff --git a/.github/workflows/deploy_packages.yml b/.github/workflows/deploy_packages.yml index 836d33398f..ce9a2648ee 100644 --- a/.github/workflows/deploy_packages.yml +++ b/.github/workflows/deploy_packages.yml @@ -68,7 +68,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -145,7 +145,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index 4d7f345391..89595db189 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -10,4 +10,4 @@ jobs: if: github.repository == 'backstage/backstage' steps: - name: Issue sync - uses: backstage/actions/issue-sync@v0.6.3 + uses: backstage/actions/issue-sync@v0.6.4 diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml index 73c4b64dca..0930c75ddd 100644 --- a/.github/workflows/pr-review-comment.yaml +++ b/.github/workflows/pr-review-comment.yaml @@ -35,7 +35,7 @@ jobs: const prNumber = artifact.name.slice('pr_number-'.length) core.setOutput('pr-number', prNumber); - - uses: backstage/actions/re-review@v0.6.3 + - uses: backstage/actions/re-review@v0.6.4 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 72393b1c28..a92effbd14 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -18,7 +18,7 @@ jobs: if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) steps: - name: PR sync - uses: backstage/actions/pr-sync@v0.6.3 + uses: backstage/actions/pr-sync@v0.6.4 with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index 412fbfe59d..6471b265bc 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -20,7 +20,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index b3c8291b65..6b55609bd5 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -19,7 +19,7 @@ jobs: node-version: 18.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v18.x diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml index 1b031f50ad..fc62d36563 100644 --- a/.github/workflows/uffizzi-build.yml +++ b/.github/workflows/uffizzi-build.yml @@ -27,7 +27,7 @@ jobs: registry-url: https://registry.npmjs.org/ - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: linux-v16 diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index cf7b750c54..11c0ca41b6 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -25,7 +25,7 @@ jobs: with: node-version: 16.x - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v16.x - name: run Lighthouse CI diff --git a/.github/workflows/verify_e2e-kubernetes.yml b/.github/workflows/verify_e2e-kubernetes.yml index 87056957f5..c05339f595 100644 --- a/.github/workflows/verify_e2e-kubernetes.yml +++ b/.github/workflows/verify_e2e-kubernetes.yml @@ -30,7 +30,7 @@ jobs: registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index b4a969bb47..33cc4f83ec 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -52,7 +52,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_storybook.yml b/.github/workflows/verify_storybook.yml index 92d6222b52..b1d370ec3f 100644 --- a/.github/workflows/verify_storybook.yml +++ b/.github/workflows/verify_storybook.yml @@ -37,7 +37,7 @@ jobs: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@v0.6.3 + uses: backstage/actions/yarn-install@v0.6.4 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} - name: storybook yarn install From cd9707180390b8b97d7f13c3b5f9b22722e46450 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 15:58:13 +0000 Subject: [PATCH 55/73] chore(deps): update dependency @types/codemirror to v5.60.8 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7f430b63bf..cfa0856c21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16163,11 +16163,11 @@ __metadata: linkType: hard "@types/codemirror@npm:^5.0.0": - version: 5.60.7 - resolution: "@types/codemirror@npm:5.60.7" + version: 5.60.8 + resolution: "@types/codemirror@npm:5.60.8" dependencies: "@types/tern": "*" - checksum: 0312ce032eb139b408588a7e7cf3b392a510a2cfa6f477f2dd20d8bca1990e5e6e5540e708f9a69d1a58e68ea7fd234b789c801aa7ef4f3b3dc32a1478b04a91 + checksum: bc3a63eab0308b3ef5ed2ca22afb7f1c0b8acde6477e1d569df7e93f3fe4f78754d28a3e081c72931259fe1bf906a319b54bcdeba74600b989e5558d32478496 languageName: node linkType: hard From 6d63709da95da27171851b2b35b0c9e47a87854e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 16:40:56 +0000 Subject: [PATCH 56/73] chore(deps): update dependency @types/node to v16.18.35 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index cfa0856c21..5a914cf9fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17074,9 +17074,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 20.2.5 - resolution: "@types/node@npm:20.2.5" - checksum: 38ce7c7e9d76880dc632f71d71e0d5914fcda9d5e9a7095d6c339abda55ca4affb0f2a882aeb29398f8e09d2c5151f0b6586c81c8ccdfe529c34b1ea3337425e + version: 20.3.0 + resolution: "@types/node@npm:20.3.0" + checksum: 613e878174febc0104dae210088645cbb5096a19ae5fdf57fbc06fa6ef71755b839858c2b313fb8c1df8b7c6660e1b5f7a64db2126af9d47d1d9238e2bc0a86d languageName: node linkType: hard @@ -17095,9 +17095,9 @@ __metadata: linkType: hard "@types/node@npm:^14.14.31": - version: 14.18.48 - resolution: "@types/node@npm:14.18.48" - checksum: bc410153cd12b5f5218c2c2a5ab4a65e8dc99ebffe98261a30e9d4beb8f9a0e4ee48c41b850f8cb80da6ed1024e42bba8dee1592869aa5b1826ddb7c29ad6899 + version: 14.18.50 + resolution: "@types/node@npm:14.18.50" + checksum: afaa48355811f377f1f7e70b397ef26297024ebc213cf9338d230d2f5ef228a9bf6a36800aa0952c519ac64f02cee8506c7bdf6e96b0abe0d90636bfce7804ae languageName: node linkType: hard @@ -17109,16 +17109,16 @@ __metadata: linkType: hard "@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.34 - resolution: "@types/node@npm:16.18.34" - checksum: 35c0ffe09687578d002ceb7e706d0ba450546aeb3d2716f28691f2af0063bd274dbde0f741d087ea217f2a8db413eb700d22dfb4f08a67986ff801423bd7be8d + version: 16.18.35 + resolution: "@types/node@npm:16.18.35" + checksum: 68e3015eb24f009d2b5a7ad959d1e1090016847248f22242c520b75a2780eb19e2d212e775e68022ed474fac00bcc8edaebcd02712f1dfee542efa23e2a4027e languageName: node linkType: hard "@types/node@npm:^18.11.17": - version: 18.16.16 - resolution: "@types/node@npm:18.16.16" - checksum: 0efad726dd1e0bef71c392c708fc5d78c5b39c46b0ac5186fee74de4ccb1b2e847b3fa468da67d62812f56569da721b15bf31bdc795e6c69b56c73a45079ed2d + version: 18.16.17 + resolution: "@types/node@npm:18.16.17" + checksum: 2f7e3a552d525ef4b7a2620ef5ef59b3fdfb1d8ab20627b537e090732b35c2bd103944933d347a319cc7d478b3866b0d1bc3d629ee5899ca663a4547ca078cee languageName: node linkType: hard From ca05927dccfa4cfbf8dff2c5cdf0bffa23a1a830 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 17:25:56 +0000 Subject: [PATCH 57/73] chore(deps): update dependency msw to v1.2.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5a914cf9fc..4cd9739af9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32054,8 +32054,8 @@ __metadata: linkType: hard "msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1": - version: 1.2.1 - resolution: "msw@npm:1.2.1" + version: 1.2.2 + resolution: "msw@npm:1.2.2" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.5 @@ -32077,13 +32077,13 @@ __metadata: type-fest: ^2.19.0 yargs: ^17.3.1 peerDependencies: - typescript: ">= 4.4.x <= 5.0.x" + typescript: ">= 4.4.x <= 5.1.x" peerDependenciesMeta: typescript: optional: true bin: msw: cli/index.js - checksum: 97b9c5ffc81b4380dd24ff40ac52ca02f406c88f86d8209ba991da19aad0bcfc37e807794aa1b9bf29f89cd86fd31e492bf4418c5ff02559b4f80d6ce4fb417b + checksum: e42cec8f5523663020bdecf6a7977a10aa86a4718d1920def3fbde0ff3734391873668cc6e3996d6790add3c74dac95a952f8560ce2543697280125eb55138e8 languageName: node linkType: hard From 7427a861225e30bd3fbc44a868d4c40ef60bc0ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 04:59:17 +0000 Subject: [PATCH 58/73] fix(deps): update dependency @apollo/server to v4.7.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 68 +++++++++++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4cd9739af9..3d14490f9f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -182,8 +182,8 @@ __metadata: linkType: hard "@apollo/server@npm:^4.0.0": - version: 4.7.1 - resolution: "@apollo/server@npm:4.7.1" + version: 4.7.3 + resolution: "@apollo/server@npm:4.7.3" dependencies: "@apollo/cache-control-types": ^1.0.2 "@apollo/server-gateway-interface": ^1.1.0 @@ -193,7 +193,7 @@ __metadata: "@apollo/utils.isnodelike": ^2.0.0 "@apollo/utils.keyvaluecache": ^2.1.0 "@apollo/utils.logger": ^2.0.0 - "@apollo/utils.usagereporting": ^2.0.0 + "@apollo/utils.usagereporting": ^2.1.0 "@apollo/utils.withrequired": ^2.0.0 "@graphql-tools/schema": ^9.0.0 "@josephg/resolvable": ^1.0.0 @@ -213,7 +213,7 @@ __metadata: whatwg-mimetype: ^3.0.0 peerDependencies: graphql: ^16.6.0 - checksum: 6c8bdd240a4c688641bfec0520375db0eb78d2495286f30f962d7b6e97d7db70f105c09364e56103e1b93543e5760621666655eaa8ae7218312ac54ca7200d4b + checksum: afc97f4f2280a1b541efee92de4d6296c72109d4c0db59db534a0e47055494a24e28c6892c5fb612966ef4d024dae3ce6906022e8a44ab351449d9da0ecca5d7 languageName: node linkType: hard @@ -236,12 +236,12 @@ __metadata: languageName: node linkType: hard -"@apollo/utils.dropunuseddefinitions@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.0" +"@apollo/utils.dropunuseddefinitions@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: aaabd487ce25b56488f6bbf6606aecdc2b1f57805ec1b7fa16e21510947d4d5b4b1d557ebaa499dfecb8dfaef4058b696812feed6896bac5d7fb52e9bb1e1b2c + checksum: c12166f2551fb44045a8210317b7776abc263136bd07bfe3c6eecdb050468590fc73e524efc437cad21cc4cfcd1efc3e110285025150c2073a4b303934898ac1 languageName: node linkType: hard @@ -276,57 +276,57 @@ __metadata: languageName: node linkType: hard -"@apollo/utils.printwithreducedwhitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.0" +"@apollo/utils.printwithreducedwhitespace@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 0e1d374f2e0afd2d0fd31ff1c6717476b4ddeb642981d8f731a44420137f4991a28c1f9e278abf4229bb3174ae68037736e8cd8e13de5e316bf384dc32246518 + checksum: 16cd191e66f3801b15deb581426cd1f55066bb824c32d63fe9de9c255bea2e2b6ee1ffc88873607830d2df0f3b4d9a14c707b709f205062e21a502f08f40d513 languageName: node linkType: hard -"@apollo/utils.removealiases@npm:2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.removealiases@npm:2.0.0" +"@apollo/utils.removealiases@npm:2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.removealiases@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 4f97e5864353386b8326eb62dd923be19c7e1f6b7ddc0935ceac1e34462aa471908d015f223f47a9cdd819e2d844f9dbdd27800bb451f5ffb4f376c4da8d2c41 + checksum: 2f3f925b239bce49fe9d80bb9fbb551992c8d9180af160e780faf1c88971a30ef16b842e82e1f27a0e1f8c649af0a442ef95f6838d4cde6148939ec73d9464f6 languageName: node linkType: hard -"@apollo/utils.sortast@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.sortast@npm:2.0.0" +"@apollo/utils.sortast@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.sortast@npm:2.0.1" dependencies: lodash.sortby: ^4.7.0 peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 50cfbdb6b8af735e9786af225edd6d4350e7530f5109bc330ae7f32edf38f15eed7711184d133a0801c5673fbc9a988a6521c7f69f3dc27910f2bd9fb6fbbb22 + checksum: b71245558ebd64bf93b98aec933d4b5f5758e0fecf7915728d94725ed4201fb2515e2af92fe01a595638147e5e0ef50a27ab5323d9b76eeb126769fb1e58f051 languageName: node linkType: hard -"@apollo/utils.stripsensitiveliterals@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.0" +"@apollo/utils.stripsensitiveliterals@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: d0a740a6d1e525b72c7d7066fa87a4ee273b3ce7401f3578542278121819bf90c97d32227270e07c923ab205afee2b52afb03261865175ba0040666a8988d479 + checksum: a3f74af0626f89d61f7ed1d25194f6b77006a06653399eecaea0b246cf685a85465091f2dc70280b127871b5c1eda7ded799ce176271c2612946acdc9453d388 languageName: node linkType: hard -"@apollo/utils.usagereporting@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.usagereporting@npm:2.0.0" +"@apollo/utils.usagereporting@npm:^2.1.0": + version: 2.1.0 + resolution: "@apollo/utils.usagereporting@npm:2.1.0" dependencies: - "@apollo/usage-reporting-protobuf": ^4.0.0 - "@apollo/utils.dropunuseddefinitions": ^2.0.0 - "@apollo/utils.printwithreducedwhitespace": ^2.0.0 - "@apollo/utils.removealiases": 2.0.0 - "@apollo/utils.sortast": ^2.0.0 - "@apollo/utils.stripsensitiveliterals": ^2.0.0 + "@apollo/usage-reporting-protobuf": ^4.1.0 + "@apollo/utils.dropunuseddefinitions": ^2.0.1 + "@apollo/utils.printwithreducedwhitespace": ^2.0.1 + "@apollo/utils.removealiases": 2.0.1 + "@apollo/utils.sortast": ^2.0.1 + "@apollo/utils.stripsensitiveliterals": ^2.0.1 peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 599e44d236728d6e57953c6fb9372cc35bc5e8e0d572b951907c94683228c134662efef4e97e456e7655d2871215319b912cabc3662c799111b5265de7873880 + checksum: 7a676f9b519563955d105264a93668e3897108d937115063c4cd3df310f32be29b8d7bdfe12eeca8d5966558d8c7f07742bcfd9ebb844c48b6ad1acee620183f languageName: node linkType: hard From 7a44b749e8a063834a954f163ae5734a69b795a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 05:44:51 +0000 Subject: [PATCH 59/73] chore(deps): update dependency @frsource/cypress-plugin-visual-regression-diff to v3.3.9 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d14490f9f..9caca1ca6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11161,8 +11161,8 @@ __metadata: linkType: hard "@frsource/cypress-plugin-visual-regression-diff@npm:^3.2.8": - version: 3.3.8 - resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.3.8" + version: 3.3.9 + resolution: "@frsource/cypress-plugin-visual-regression-diff@npm:3.3.9" dependencies: "@frsource/base64": 1.0.14 glob: 8.0.3 @@ -11173,7 +11173,7 @@ __metadata: sharp: 0.31.2 peerDependencies: cypress: ">=4.5.0" - checksum: 657cd8f4343da939677ae8db611445846eed21176fd2494617050ac267aed7665ce1b084aba0ce774170f7113a7bd79af41b3207e457af28a212e46b07f4783d + checksum: da3bfaec2d54a314e8bcda915f85e9bc9f7cf53224e588a24ab594d7f0047ad9b5bbda3be8d6f63602f8612d2c7e35c8ca4de307b4f9eb098e04c3af593f090c languageName: node linkType: hard From e033d3c1056ad57c09650edd42014fce3b3cd841 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:25:57 +0000 Subject: [PATCH 60/73] fix(deps): update dependency @jest-mock/express to v2.0.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9caca1ca6d..afa91b371b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12285,11 +12285,11 @@ __metadata: linkType: hard "@jest-mock/express@npm:^2.0.1": - version: 2.0.1 - resolution: "@jest-mock/express@npm:2.0.1" + version: 2.0.2 + resolution: "@jest-mock/express@npm:2.0.2" dependencies: - "@types/express": ^4.17.13 - checksum: 999ea0a953b3e911d0b8ecc4cb3b78ac252b3354832db9659be6754094410b10508f1688f3e623ab13fe40c28d89fd5a81699e6acd148dd8128abec4e81f3f14 + "@types/express": ^4.17.17 + checksum: 558feb47e7e9620a5e53b83c51b3802782ecf7ab32b8d81077b16f641b7e1a6dc6fffa652d2ab48b28ba0f0634fa6387bd21b08f62b92bd730dfca167a4c2795 languageName: node linkType: hard @@ -16547,7 +16547,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.6": +"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.17, @types/express@npm:^4.17.6": version: 4.17.17 resolution: "@types/express@npm:4.17.17" dependencies: From c7d401f16aeed8efc238df8d4ac2693b8f395c01 Mon Sep 17 00:00:00 2001 From: ohjongsung Date: Mon, 12 Jun 2023 15:49:59 +0900 Subject: [PATCH 61/73] Change objects to precise type and apply encodeURIComponent to url Signed-off-by: ohjongsung --- .../publish/bitbucketServerPullRequest.ts | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts index a0ac0e20ac..79711b9d69 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucketServerPullRequest.ts @@ -29,8 +29,22 @@ const createPullRequest = async (opts: { repo: string; title: string; description?: string; - toRef: object; - fromRef: object; + toRef: { + id: string; + displayId: string; + type: string; + latestCommit: string; + latestChangeset: string; + isDefault: boolean; + }; + fromRef: { + id: string; + displayId: string; + type: string; + latestCommit: string; + latestChangeset: string; + isDefault: boolean; + }; authorization: string; apiBaseUrl: string; }) => { @@ -66,7 +80,9 @@ const createPullRequest = async (opts: { try { response = await fetch( - `${apiBaseUrl}/projects/${project}/repos/${repo}/pull-requests`, + `${apiBaseUrl}/projects/${encodeURIComponent( + project, + )}/repos/${encodeURIComponent(repo)}/pull-requests`, data, ); } catch (e) { @@ -104,7 +120,13 @@ const findBranches = async (opts: { try { response = await fetch( - `${apiBaseUrl}/projects/${project}/repos/${repo}/branches?boostMatches=true&filterText=${branchName}`, + `${apiBaseUrl}/projects/${encodeURIComponent( + project, + )}/repos/${encodeURIComponent( + repo, + )}/branches?boostMatches=true&filterText=${encodeURIComponent( + branchName, + )}`, options, ); } catch (e) { From a0fe4f398fbc1e0c590f77f0836d34961b891bfe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:37:50 +0000 Subject: [PATCH 62/73] fix(deps): update dependency @octokit/webhooks-methods to v3.0.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9caca1ca6d..921b968c99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14091,9 +14091,9 @@ __metadata: linkType: hard "@octokit/webhooks-methods@npm:^3.0.0": - version: 3.0.2 - resolution: "@octokit/webhooks-methods@npm:3.0.2" - checksum: 4608d6a394bd94846301b709f44adc2bde0f43517840c49d235e3cb355986e2e9736d60b4a39c3492b31c06d10401f32cab878ec83e83b890606f58619cad5ef + version: 3.0.3 + resolution: "@octokit/webhooks-methods@npm:3.0.3" + checksum: 1caccc8b27ad53bbb8e39cf3db98a3ef5abcec9f919024d7f89618a5156044c6585871cc97176ec63fb2503bfe6b6ca8e4a18313e1eaed1c0163b194a4dada09 languageName: node linkType: hard From 1d3308cdfa1f7d1454879efe93babdf3a434038e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:17:50 +0000 Subject: [PATCH 63/73] fix(deps): update dependency @roadiehq/backstage-plugin-buildkite to v2.1.10 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1363f6a404..6d95bbe388 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14632,14 +14632,14 @@ __metadata: linkType: hard "@roadiehq/backstage-plugin-buildkite@npm:^2.0.8": - version: 2.1.9 - resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.9" + version: 2.1.10 + resolution: "@roadiehq/backstage-plugin-buildkite@npm:2.1.10" dependencies: "@backstage/catalog-model": ^1.3.0 - "@backstage/core-components": ^0.13.0 + "@backstage/core-components": ^0.13.1 "@backstage/core-plugin-api": ^1.5.1 - "@backstage/plugin-catalog-react": ^1.5.0 - "@backstage/theme": ^0.2.19 + "@backstage/plugin-catalog-react": ^1.6.0 + "@backstage/theme": ^0.3.0 "@material-ui/core": ^4.12.1 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 @@ -14651,7 +14651,7 @@ __metadata: react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: e7218a5c1abe34eac99840da194159ba9b779f9a447050f6e793dd38c104e502fc8d67e4986dd4d14fbe847d841c124e2029c86735411c25842de072d16b2033 + checksum: 7463cecec0329d5b19cb539a234699d6857234a045c5eb5b1589643b2d6e2817c0942274a71aa788047c32270fc095d9e27bb389cd0fe4430058fc1e43f572d7 languageName: node linkType: hard From 1a4fbb1356d05e59f6f00d5fe0d8ffd1d2a9c9c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:18:20 +0000 Subject: [PATCH 64/73] fix(deps): update dependency @roadiehq/backstage-plugin-github-insights to v2.3.13 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1363f6a404..fb8a1727df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4496,7 +4496,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.12": +"@backstage/integration-react@npm:^1.1.13": version: 1.1.13 resolution: "@backstage/integration-react@npm:1.1.13" dependencies: @@ -14656,15 +14656,15 @@ __metadata: linkType: hard "@roadiehq/backstage-plugin-github-insights@npm:^2.0.5": - version: 2.3.12 - resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.12" + version: 2.3.13 + resolution: "@roadiehq/backstage-plugin-github-insights@npm:2.3.13" dependencies: "@backstage/catalog-model": ^1.3.0 - "@backstage/core-components": ^0.13.0 + "@backstage/core-components": ^0.13.1 "@backstage/core-plugin-api": ^1.5.1 - "@backstage/integration-react": ^1.1.12 - "@backstage/plugin-catalog-react": ^1.5.0 - "@backstage/theme": ^0.2.19 + "@backstage/integration-react": ^1.1.13 + "@backstage/plugin-catalog-react": ^1.6.0 + "@backstage/theme": ^0.3.0 "@date-io/core": 2.10.7 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 @@ -14679,7 +14679,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 4c2b14b43e0daa6aa17aef44b51c74c74a3aa41d48d50644cae58e5e9ae5fdf656d2b71aa7175a3c9c8269ac9cdacfa64c1339f212273849e83020342298ed8c + checksum: eb555d1b4bab82cd6cf66ea823b35fedb72d1ca3a6615b619d6cd2ff24af131501346b9ac2b1dcfb83f5d69b42ac95fb96f081e644a82b75a77a71b45344f2fc languageName: node linkType: hard From 599ad683de8da7b26a1f17d364b3342f9a85cb62 Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 12 Jun 2023 11:07:25 +0100 Subject: [PATCH 65/73] Change field name Signed-off-by: sblausten --- plugins/catalog-backend/src/catalog/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 45a3ff6144..156b8aa64d 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -319,7 +319,7 @@ export type CatalogConflictEventPayload = { /** * The new conflicting entity in raw, unvalidated form */ - entity: Entity; + unprocessedEntity: Entity; /** * The new conflicting entity's ref */ From 1684c673d225d6e920708a6fadb7662d69015164 Mon Sep 17 00:00:00 2001 From: sblausten Date: Mon, 12 Jun 2023 11:10:20 +0100 Subject: [PATCH 66/73] Api report Signed-off-by: sblausten --- .../catalog-backend/src/database/DefaultProcessingDatabase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 04005101da..4959a33eef 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -370,7 +370,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { const eventParams: EventParams = { topic: CATALOG_CONFLICTS_TOPIC, eventPayload: { - entity, + unprocessedEntity: entity, entityRef, newLocationKey: locationKey, existingLocationKey: conflictingKey, From 2fd290238202550af6cafede892dc197f6a9497f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:11:49 +0000 Subject: [PATCH 67/73] fix(deps): update dependency @roadiehq/backstage-plugin-github-pull-requests to v2.5.11 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9ccdb45900..cfc4c3c230 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7351,7 +7351,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@npm:^0.5.1": +"@backstage/plugin-home@npm:^0.5.2": version: 0.5.2 resolution: "@backstage/plugin-home@npm:0.5.2" dependencies: @@ -14684,14 +14684,14 @@ __metadata: linkType: hard "@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7": - version: 2.5.10 - resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.10" + version: 2.5.11 + resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.11" dependencies: "@backstage/catalog-model": ^1.3.0 - "@backstage/core-components": ^0.13.0 + "@backstage/core-components": ^0.13.1 "@backstage/core-plugin-api": ^1.5.1 - "@backstage/plugin-catalog-react": ^1.5.0 - "@backstage/plugin-home": ^0.5.1 + "@backstage/plugin-catalog-react": ^1.6.0 + "@backstage/plugin-home": ^0.5.2 "@material-ui/core": ^4.11.0 "@material-ui/icons": ^4.9.1 "@material-ui/lab": ^4.0.0-alpha.60 @@ -14708,7 +14708,7 @@ __metadata: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 react-router: 6.0.0-beta.0 || ^6.3.0 - checksum: 0f273ede63024635f850fc9df662941589f5f8848307507e3f6e376ea0bd9b7e17026e1182808d5c193be90ee9a2725c83a0850475547b364cd3d7cf35bf7b74 + checksum: fe7c6cd35bbf23b4464fe94dbbd9a085b1b164bab214e095e6efc4e7ec5b5ca19670a9384541d83eeaa1a6d6ba2aa22a3f457c7166165ec0f078f18c2355e3e1 languageName: node linkType: hard From ca74de96e247d2b1ee3b872c73ee8dd6dd47db92 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:07:38 +0000 Subject: [PATCH 68/73] fix(deps): update dependency @uiw/react-codemirror to v4.21.3 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 842d50ea41..f89da4a931 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18120,9 +18120,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.21.1": - version: 4.21.1 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.1" +"@uiw/codemirror-extensions-basic-setup@npm:4.21.3": + version: 4.21.3 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.3" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -18139,19 +18139,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: ac1f90f9396b5542bd30222c513354e6756972c455931e4a48327ceaadb4c0c9fa0763a87c6d166ee3cfe45941cb348661f6ee4672f71fd67e8708e73231095b + checksum: 6e6081c363391192c9f83c8277cc6e9de15ac6d9ad54a1318a165dae17a0ac944c2ed0fac6c955cf89dfefbd2c66ccac4ca43a085002dd70f580a02ca725fd46 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.21.1 - resolution: "@uiw/react-codemirror@npm:4.21.1" + version: 4.21.3 + resolution: "@uiw/react-codemirror@npm:4.21.3" dependencies: "@babel/runtime": ^7.18.6 "@codemirror/commands": ^6.1.0 "@codemirror/state": ^6.1.1 "@codemirror/theme-one-dark": ^6.0.0 - "@uiw/codemirror-extensions-basic-setup": 4.21.1 + "@uiw/codemirror-extensions-basic-setup": 4.21.3 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -18161,7 +18161,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 359848cad18ae9a70d9767e07f9f520459b0794f32b9558ec442db92ea83f392a5f0b0fcab56804328e18bf4d1371a18ef2eaa5847c5e94603ff9a2dc1123a26 + checksum: 7864f63b23283c2cab85e1bfce6cc00b0cd8787867ad878b359fa047676f70eac0b96d68d98dc0925ed8b2f6ba4e1cc4ee7196ddc70053bacbd5ca0948e67944 languageName: node linkType: hard From e81b8d29ba2b4ef4b5a15f8b8e17e848f7b3ec13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:08:13 +0000 Subject: [PATCH 69/73] fix(deps): update dependency jenkins to v1.0.2 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 842d50ea41..9380c1b95b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28380,11 +28380,11 @@ __metadata: linkType: hard "jenkins@npm:^1.0.0": - version: 1.0.1 - resolution: "jenkins@npm:1.0.1" + version: 1.0.2 + resolution: "jenkins@npm:1.0.2" dependencies: papi: ^1.1.0 - checksum: b57eab2e9bed834849bc5acf32cc3b1d5c1ed78c568a17db94f3081a72bb279a6ed889a2837688b380de0d8e6a78a537c0c3f90cdc132a721adc5892a8090d12 + checksum: b400698ccbfee44ce5d69fdd264d8c0f24c8b9fbfa89e882b77e224ef22816d21af7c1abf7297a8922044e852c8cdfdf9850e138d938383d2c3b734d4dc76ef9 languageName: node linkType: hard From 530b6f364c8c27543275cf61ea8667f520626f64 Mon Sep 17 00:00:00 2001 From: Jordan Snow Date: Wed, 17 May 2023 13:04:50 -0400 Subject: [PATCH 70/73] Adding info on entities selected to catalog table title Signed-off-by: Jordan Snow --- .changeset/tiny-shrimps-beam.md | 5 +++++ .../src/components/CatalogTable/CatalogTable.test.tsx | 7 ++++++- .../catalog/src/components/CatalogTable/CatalogTable.tsx | 7 +++++-- 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 .changeset/tiny-shrimps-beam.md diff --git a/.changeset/tiny-shrimps-beam.md b/.changeset/tiny-shrimps-beam.md new file mode 100644 index 0000000000..b538d465f9 --- /dev/null +++ b/.changeset/tiny-shrimps-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Adding in type and kind entity details to catalog table title for user clarity diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx index c80b340349..c242372a97 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx @@ -95,6 +95,11 @@ describe('CatalogTable component', () => { () => false, () => false, ), + kind: { + value: 'component', + getCatalogFilters: () => ({ kind: 'component' }), + toQueryValue: () => 'component', + }, }, }} > @@ -107,7 +112,7 @@ describe('CatalogTable component', () => { }, }, ); - expect(screen.getByText(/Owned \(3\)/)).toBeInTheDocument(); + expect(screen.getByText(/Owned components \(3\)/)).toBeInTheDocument(); expect(screen.getByText(/component1/)).toBeInTheDocument(); expect(screen.getByText(/component2/)).toBeInTheDocument(); expect(screen.getByText(/component3/)).toBeInTheDocument(); diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index 3d0cc75f7c..bddf7715bf 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -226,7 +226,8 @@ export const CatalogTable = (props: CatalogTableProps) => { typeColumn.hidden = !showTypeColumn; } const showPagination = rows.length > 20; - + const currentKind = filters.kind?.value || ''; + const currentType = filters.type?.value || ''; return ( isLoading={loading} @@ -241,7 +242,9 @@ export const CatalogTable = (props: CatalogTableProps) => { pageSizeOptions: [20, 50, 100], ...tableOptions, }} - title={`${titlePreamble} (${entities.length})`} + title={`${titlePreamble} ${currentType} ${currentKind}${ + currentKind ? 's' : '' + } (${entities.length})`} data={rows} actions={actions || defaultActions} subtitle={subtitle} From 1345664b5c55e523bb60122d17d4e2d7b8c15809 Mon Sep 17 00:00:00 2001 From: Jordan Snow Date: Wed, 17 May 2023 14:49:28 -0400 Subject: [PATCH 71/73] Streamlining title and fixing external component tests Signed-off-by: Jordan Snow --- .../DefaultApiExplorerPage.test.tsx | 4 +-- .../CatalogPage/DefaultCatalogPage.test.tsx | 34 ++++++++++++++----- .../components/CatalogTable/CatalogTable.tsx | 8 +++-- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx index f89897524d..e3723dba5b 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx @@ -168,7 +168,7 @@ describe('DefaultApiExplorerPage', () => { const { findByTitle, findByText } = await renderWrapped( , ); - expect(await findByText(/All \(1\)/)).toBeInTheDocument(); + expect(await findByText(/All apis \(1\)/)).toBeInTheDocument(); expect(await findByTitle(/View/)).toBeInTheDocument(); expect(await findByTitle(/View/)).toBeInTheDocument(); expect(await findByTitle(/Edit/)).toBeInTheDocument(); @@ -198,7 +198,7 @@ describe('DefaultApiExplorerPage', () => { const { findByTitle, findByText } = await renderWrapped( , ); - expect(await findByText(/All \(1\)/)).toBeInTheDocument(); + expect(await findByText(/All apis \(1\)/)).toBeInTheDocument(); expect(await findByTitle(/Foo Action/)).toBeInTheDocument(); expect(await findByTitle(/Bar Action/)).toBeInTheDocument(); expect((await findByTitle(/Bar Action/)).firstChild).toBeDisabled(); diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx index 3411656426..485cb490d8 100644 --- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx @@ -205,7 +205,9 @@ describe('DefaultCatalogPage', () => { it('should render the default actions of an item in the grid', async () => { await renderWrapped(); fireEvent.click(screen.getByTestId('user-picker-owned')); - await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/Owned components \(1\)/), + ).resolves.toBeInTheDocument(); await expect(screen.findByTitle(/View/)).resolves.toBeInTheDocument(); await expect(screen.findByTitle(/Edit/)).resolves.toBeInTheDocument(); await expect( @@ -235,7 +237,9 @@ describe('DefaultCatalogPage', () => { await renderWrapped(); fireEvent.click(screen.getByTestId('user-picker-owned')); - await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/Owned components \(1\)/), + ).resolves.toBeInTheDocument(); await expect(screen.findByTitle(/Foo Action/)).resolves.toBeInTheDocument(); await expect(screen.findByTitle(/Bar Action/)).resolves.toBeInTheDocument(); await expect( @@ -249,14 +253,20 @@ describe('DefaultCatalogPage', () => { it('should render', async () => { await renderWrapped(); fireEvent.click(screen.getByTestId('user-picker-owned')); - await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/Owned components \(1\)/), + ).resolves.toBeInTheDocument(); fireEvent.click(screen.getByTestId('user-picker-all')); - await expect(screen.findByText(/All \(2\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/All components \(2\)/), + ).resolves.toBeInTheDocument(); }, 20_000); it('should set initial filter correctly', async () => { await renderWrapped(); - await expect(screen.findByText(/All \(2\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/All components \(2\)/), + ).resolves.toBeInTheDocument(); }, 20_000); // this test is for fixing the bug after favoriting an entity, the matching @@ -264,7 +274,9 @@ describe('DefaultCatalogPage', () => { it('should render the correct entities filtered on the selected filter', async () => { await renderWrapped(); fireEvent.click(screen.getByTestId('user-picker-owned')); - await expect(screen.findByText(/Owned \(1\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/Owned components \(1\)/), + ).resolves.toBeInTheDocument(); // The "Starred" menu option should initially be disabled, since there // aren't any starred entities. expect(screen.getByTestId('user-picker-starred')).toHaveAttribute( @@ -272,11 +284,15 @@ describe('DefaultCatalogPage', () => { 'true', ); fireEvent.click(screen.getByTestId('user-picker-all')); - await expect(screen.findByText(/All \(2\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/All components \(2\)/), + ).resolves.toBeInTheDocument(); const starredIcons = await screen.findAllByTitle('Add to favorites'); fireEvent.click(starredIcons[0]); - await expect(screen.findByText(/All \(2\)/)).resolves.toBeInTheDocument(); + await expect( + screen.findByText(/All components \(2\)/), + ).resolves.toBeInTheDocument(); // Now that we've starred an entity, the "Starred" menu option should be // enabled. @@ -286,7 +302,7 @@ describe('DefaultCatalogPage', () => { ); fireEvent.click(screen.getByTestId('user-picker-starred')); await expect( - screen.findByText(/Starred \(1\)/), + screen.findByText(/Starred components \(1\)/), ).resolves.toBeInTheDocument(); }, 20_000); diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index bddf7715bf..a8a513e2f4 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -228,6 +228,10 @@ export const CatalogTable = (props: CatalogTableProps) => { const showPagination = rows.length > 20; const currentKind = filters.kind?.value || ''; const currentType = filters.type?.value || ''; + const titleDisplay = [titlePreamble, currentType, currentKind] + .filter(s => s) + .join(' '); + return ( isLoading={loading} @@ -242,9 +246,7 @@ export const CatalogTable = (props: CatalogTableProps) => { pageSizeOptions: [20, 50, 100], ...tableOptions, }} - title={`${titlePreamble} ${currentType} ${currentKind}${ - currentKind ? 's' : '' - } (${entities.length})`} + title={`${titleDisplay}${currentKind ? 's' : ''} (${entities.length})`} data={rows} actions={actions || defaultActions} subtitle={subtitle} From 1c7f7053b0ef0207d5b9e0ae4353f54e2b8d8a7c Mon Sep 17 00:00:00 2001 From: Jordan Snow Date: Wed, 7 Jun 2023 14:02:33 -0400 Subject: [PATCH 72/73] Using pluralize for table title Signed-off-by: Jordan Snow --- plugins/catalog/src/components/CatalogTable/CatalogTable.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index a8a513e2f4..67579d5273 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -43,6 +43,7 @@ import { capitalize } from 'lodash'; import React, { ReactNode, useMemo } from 'react'; import { columnFactories } from './columns'; import { CatalogTableRow } from './types'; +import pluralize from 'pluralize'; /** * Props for {@link CatalogTable}. @@ -228,7 +229,7 @@ export const CatalogTable = (props: CatalogTableProps) => { const showPagination = rows.length > 20; const currentKind = filters.kind?.value || ''; const currentType = filters.type?.value || ''; - const titleDisplay = [titlePreamble, currentType, currentKind] + const titleDisplay = [titlePreamble, currentType, pluralize(currentKind)] .filter(s => s) .join(' '); @@ -246,7 +247,7 @@ export const CatalogTable = (props: CatalogTableProps) => { pageSizeOptions: [20, 50, 100], ...tableOptions, }} - title={`${titleDisplay}${currentKind ? 's' : ''} (${entities.length})`} + title={`${titleDisplay} (${entities.length})`} data={rows} actions={actions || defaultActions} subtitle={subtitle} From 5f2c38c70f5baa55ab95dfe0165fd77c45904c78 Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Mon, 12 Jun 2023 21:55:02 +0200 Subject: [PATCH 73/73] fix(deps): fix SNYK-JS-FASTXMLPARSER-5668858 Fixes SNYK-JS-FASTXMLPARSER-5668858 by upgrading aws-sdk dependencies to their latest version. The upgrade of `fast-xml-parser` to version 4.2.4 (or higher) was included in release v3.347.1 of the aws-sdk. Latest release is v3.350.0, however, not for all packages. The previous version's requirement would have allowed to use a newer version of the aws-sdk to fix it locally to a backstage project setup. This change will enforce a version including the fix. Closes: #18164 Signed-off-by: Patrick Jungermann --- .changeset/hot-tables-yawn.md | 10 + packages/backend-common/package.json | 10 +- packages/integration-aws-node/package.json | 8 +- .../catalog-backend-module-aws/package.json | 14 +- .../package.json | 4 +- plugins/kubernetes-backend/package.json | 4 +- plugins/techdocs-node/package.json | 10 +- yarn.lock | 1410 ++++++++--------- 8 files changed, 740 insertions(+), 730 deletions(-) create mode 100644 .changeset/hot-tables-yawn.md diff --git a/.changeset/hot-tables-yawn.md b/.changeset/hot-tables-yawn.md new file mode 100644 index 0000000000..f78a2fa129 --- /dev/null +++ b/.changeset/hot-tables-yawn.md @@ -0,0 +1,10 @@ +--- +'@backstage/plugin-events-backend-module-aws-sqs': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/integration-aws-node': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/backend-common': patch +'@backstage/plugin-techdocs-node': patch +--- + +Fix SNYK-JS-FASTXMLPARSER-5668858 (`fast-xml-parser`) by upgrading aws-sdk to at least the current latest version. diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index e1192dac00..65e4488db6 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -46,10 +46,10 @@ "test:kubernetes": "backstage-cli package test -t KubernetesContainerRunner --no-watch" }, "dependencies": { - "@aws-sdk/abort-controller": "^3.310.0", - "@aws-sdk/client-s3": "^3.310.0", - "@aws-sdk/credential-providers": "^3.310.0", - "@aws-sdk/types": "^3.310.0", + "@aws-sdk/abort-controller": "^3.347.0", + "@aws-sdk/client-s3": "^3.350.0", + "@aws-sdk/credential-providers": "^3.350.0", + "@aws-sdk/types": "^3.347.0", "@backstage/backend-app-api": "workspace:^", "@backstage/backend-dev-utils": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", @@ -114,7 +114,7 @@ } }, "devDependencies": { - "@aws-sdk/util-stream-node": "^3.310.0", + "@aws-sdk/util-stream-node": "^3.350.0", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/archiver": "^5.1.0", diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index 2903a54a51..9bce0dede6 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -32,10 +32,10 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@aws-sdk/client-sts": "^3.310.0", - "@aws-sdk/credential-provider-node": "^3.310.0", - "@aws-sdk/credential-providers": "^3.310.0", - "@aws-sdk/types": "^3.310.0", + "@aws-sdk/client-sts": "^3.350.0", + "@aws-sdk/credential-provider-node": "^3.350.0", + "@aws-sdk/credential-providers": "^3.350.0", + "@aws-sdk/types": "^3.347.0", "@aws-sdk/util-arn-parser": "^3.310.0", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^" diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index a79839e5e2..5b875a2f70 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -45,12 +45,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { - "@aws-sdk/client-eks": "^3.310.0", - "@aws-sdk/client-organizations": "^3.310.0", - "@aws-sdk/client-s3": "^3.310.0", - "@aws-sdk/credential-providers": "^3.310.0", - "@aws-sdk/middleware-endpoint": "^3.310.0", - "@aws-sdk/types": "^3.310.0", + "@aws-sdk/client-eks": "^3.350.0", + "@aws-sdk/client-organizations": "^3.350.0", + "@aws-sdk/client-s3": "^3.350.0", + "@aws-sdk/credential-providers": "^3.350.0", + "@aws-sdk/middleware-endpoint": "^3.347.0", + "@aws-sdk/types": "^3.347.0", "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", @@ -69,7 +69,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@aws-sdk/util-stream-node": "^3.310.0", + "@aws-sdk/util-stream-node": "^3.350.0", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/lodash": "^4.14.151", diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index e4857d952c..eecfd83d1c 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -35,7 +35,7 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@aws-sdk/client-sqs": "^3.310.0", + "@aws-sdk/client-sqs": "^3.350.0", "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", @@ -46,7 +46,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@aws-sdk/types": "^3.310.0", + "@aws-sdk/types": "^3.347.0", "@backstage/backend-common": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index e09ead60e2..ccd4ccd04a 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -50,8 +50,8 @@ }, "dependencies": { "@aws-crypto/sha256-js": "^3.0.0", - "@aws-sdk/credential-providers": "^3.310.0", - "@aws-sdk/signature-v4": "^3.310.0", + "@aws-sdk/credential-providers": "^3.350.0", + "@aws-sdk/signature-v4": "^3.347.0", "@azure/identity": "^2.0.4", "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index faaff43fd5..2a344895c2 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -39,11 +39,11 @@ "url": "https://github.com/backstage/backstage/issues" }, "dependencies": { - "@aws-sdk/client-s3": "^3.310.0", - "@aws-sdk/credential-providers": "^3.310.0", - "@aws-sdk/lib-storage": "^3.310.0", - "@aws-sdk/node-http-handler": "^3.310.0", - "@aws-sdk/types": "^3.310.0", + "@aws-sdk/client-s3": "^3.350.0", + "@aws-sdk/credential-providers": "^3.350.0", + "@aws-sdk/lib-storage": "^3.350.0", + "@aws-sdk/node-http-handler": "^3.350.0", + "@aws-sdk/types": "^3.347.0", "@azure/identity": "^2.1.0", "@azure/storage-blob": "^12.5.0", "@backstage/backend-common": "workspace:^", diff --git a/yarn.lock b/yarn.lock index 51da36570f..aa7862e1a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -531,13 +531,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.342.0, @aws-sdk/abort-controller@npm:^3.310.0": - version: 3.342.0 - resolution: "@aws-sdk/abort-controller@npm:3.342.0" +"@aws-sdk/abort-controller@npm:3.347.0, @aws-sdk/abort-controller@npm:^3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/abort-controller@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 5681ba5f943c1843b841a16290f9a093d01a75f16fc2348ae140a1b83ecdae983696f5f59936cd91f33eb8f76701b9f4dae11ad68f6d29c785327767a6564057 + checksum: fb7d8205987c6edd7825035e3599ab5587b1b79a5e8df1e10fc66c8c64f33f9d9354fed6dd029073c262c750d661fc64e68ced40955101b930cf7636597ff690 languageName: node linkType: hard @@ -550,628 +550,628 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.345.0" +"@aws-sdk/client-cognito-identity@npm:3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.345.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/client-sts": 3.350.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: 7dead889b689a3e4bd0c911008cafc8f362bf09377b0590f1d467a47819ca8f3185b4fe786f6b81cd0df68a5010a4ca092e4e8edc18491f71460745d0b9604d7 + checksum: 113a702815437ebeba02f1aff54051ee9574c793c86fe2834980395f8c44a62d1336692ade820b5ef196b5af5abb4fd1d46affbf22f3b5fc85f54e03f3a4171a languageName: node linkType: hard -"@aws-sdk/client-eks@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/client-eks@npm:3.345.0" +"@aws-sdk/client-eks@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-eks@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.345.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/client-sts": 3.350.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 - "@aws-sdk/util-waiter": 3.342.0 + "@aws-sdk/util-waiter": 3.347.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 tslib: ^2.5.0 uuid: ^8.3.2 - checksum: 5d3488054155e05afe3cc700cd8156cfaa17098b869a240f596e12b64f0b3714f95ae41f4a8f19c91951eaa7ba1a5e7ab47d8eb7f69c982728f3cff594cc1417 + checksum: 475973abf7cba32c40aa79ed345229f3b887c548e47651ff781b48174d0d1cba0526c7de29a25c13d2d3f2cba905173d146a7d23101e2caed6196b1f3fe232ba languageName: node linkType: hard -"@aws-sdk/client-organizations@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/client-organizations@npm:3.345.0" +"@aws-sdk/client-organizations@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-organizations@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.345.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/client-sts": 3.350.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: 2a50e58cdcac75cd6b4bc5ca8b985feadc8de100db9a12e1820189a22098b983695dbba7927f7ab8dc48bbb1d6210d33006cf9712f275d1afa10b61a4923e7f7 + checksum: 553e3510601c2305be0561abf5b0d8a92faafc23952ec4620358960cc7d3d72b62ff9a76fb174377286b1d339d75194d23ee63bbf35ea5379187ea46b86268a2 languageName: node linkType: hard -"@aws-sdk/client-s3@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/client-s3@npm:3.345.0" +"@aws-sdk/client-s3@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-s3@npm:3.350.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.345.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/eventstream-serde-browser": 3.342.0 - "@aws-sdk/eventstream-serde-config-resolver": 3.342.0 - "@aws-sdk/eventstream-serde-node": 3.342.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-blob-browser": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/hash-stream-node": 3.342.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/md5-js": 3.342.0 - "@aws-sdk/middleware-bucket-endpoint": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-expect-continue": 3.342.0 - "@aws-sdk/middleware-flexible-checksums": 3.342.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-location-constraint": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-sdk-s3": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/middleware-ssec": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/signature-v4-multi-region": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/client-sts": 3.350.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/eventstream-serde-browser": 3.347.0 + "@aws-sdk/eventstream-serde-config-resolver": 3.347.0 + "@aws-sdk/eventstream-serde-node": 3.347.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-blob-browser": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/hash-stream-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/md5-js": 3.347.0 + "@aws-sdk/middleware-bucket-endpoint": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-expect-continue": 3.347.0 + "@aws-sdk/middleware-flexible-checksums": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-location-constraint": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-sdk-s3": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/middleware-ssec": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/signature-v4-multi-region": 3.347.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-stream-browser": 3.342.0 - "@aws-sdk/util-stream-node": 3.344.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-stream-browser": 3.347.0 + "@aws-sdk/util-stream-node": 3.350.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 - "@aws-sdk/util-waiter": 3.342.0 + "@aws-sdk/util-waiter": 3.347.0 "@aws-sdk/xml-builder": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 - fast-xml-parser: 4.1.2 + fast-xml-parser: 4.2.4 tslib: ^2.5.0 - checksum: 586a4067378e3e8a276608d247b7d0d2a74039ab1f7990750f8fb961689e1bb07a6faf1b4f7ae57e63195bf15a497f8dacd50a388367825de52cdbecefd420ca + checksum: 3e7c5ca478abf866dec86d069c355b77ba8dcefe462817f953fb672560f4a56499a544180e5b534400de917bbc5220479c93f67373bd7b8278ceb80d030a41ca languageName: node linkType: hard -"@aws-sdk/client-sqs@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/client-sqs@npm:3.345.0" +"@aws-sdk/client-sqs@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-sqs@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.345.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/md5-js": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-sdk-sqs": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/client-sts": 3.350.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/md5-js": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-sdk-sqs": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 - fast-xml-parser: 4.1.2 + fast-xml-parser: 4.2.4 tslib: ^2.5.0 - checksum: f6a8cd2a1437d43596c4b1a2e63bedb7215bdda96ccf1820f8ae18a42b9ceaade239b0a335a4fb34c65f635a6d65b827907085aebb1ae7f18702f944659840f8 + checksum: bdbd7f2c6c0eb977664848088b874ea991c7a838285552ecbc6dfcbf30f858990c06930dffec25d97ca4689f94f00ee6e2172e74c9b32b18a594a0bb64e20b56 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.345.0" +"@aws-sdk/client-sso-oidc@npm:3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: 6241236088ad895f87cb1c0c5bcb176cfa20613097d99308dc513cea8f0b10efcab05b4a2d4f22819ca2c4ec8aee384c566e72e4177eb65cdd87136a650f1062 + checksum: 25a46fe18c3429b6a790f1439dacfb50d843976887742f56a3800c3ff2b3b7dc406c6ce896ff204621c938ef4af7c684bd08257db740321dab705312f82a20cd languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/client-sso@npm:3.345.0" +"@aws-sdk/client-sso@npm:3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-sso@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 tslib: ^2.5.0 - checksum: 6ecbb35aeaa928ca1c4a57e72d677eeba40bdbd97131e9b860ef658886840f07335593841117287fa62551ad9d2c655bb5abdb05909a46ff81ed8a2c6441f421 + checksum: f4e2648590ade175e60e72abec8ccd6e68fa515e4a6c0b5bbc64fb883d368f0d5048ef0bd5548d225fc58b7793884096227bcc7a67822c42f6eb6e4525fbd989 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.345.0, @aws-sdk/client-sts@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/client-sts@npm:3.345.0" +"@aws-sdk/client-sts@npm:3.350.0, @aws-sdk/client-sts@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/client-sts@npm:3.350.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/hash-node": 3.344.0 - "@aws-sdk/invalid-dependency": 3.342.0 - "@aws-sdk/middleware-content-length": 3.342.0 - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/middleware-host-header": 3.342.0 - "@aws-sdk/middleware-logger": 3.342.0 - "@aws-sdk/middleware-recursion-detection": 3.342.0 - "@aws-sdk/middleware-retry": 3.342.0 - "@aws-sdk/middleware-sdk-sts": 3.342.0 - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/middleware-user-agent": 3.345.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/hash-node": 3.347.0 + "@aws-sdk/invalid-dependency": 3.347.0 + "@aws-sdk/middleware-content-length": 3.347.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/middleware-host-header": 3.347.0 + "@aws-sdk/middleware-logger": 3.347.0 + "@aws-sdk/middleware-recursion-detection": 3.347.0 + "@aws-sdk/middleware-retry": 3.347.0 + "@aws-sdk/middleware-sdk-sts": 3.347.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/middleware-user-agent": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/smithy-client": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-body-length-browser": 3.310.0 "@aws-sdk/util-body-length-node": 3.310.0 - "@aws-sdk/util-defaults-mode-browser": 3.342.0 - "@aws-sdk/util-defaults-mode-node": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 - "@aws-sdk/util-user-agent-browser": 3.345.0 - "@aws-sdk/util-user-agent-node": 3.345.0 + "@aws-sdk/util-defaults-mode-browser": 3.347.0 + "@aws-sdk/util-defaults-mode-node": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 + "@aws-sdk/util-user-agent-browser": 3.347.0 + "@aws-sdk/util-user-agent-node": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 "@smithy/protocol-http": ^1.0.1 "@smithy/types": ^1.0.0 - fast-xml-parser: 4.1.2 + fast-xml-parser: 4.2.4 tslib: ^2.5.0 - checksum: 46dd7929a56e6126f750cde095569375aa12fe321ce1d71ea9749e0de6878e45f983e6db141dc3d804745324b810ddc8a512ff1afa4d3c8cd6d00823bc9dd857 + checksum: c9c96789fdab51db29be656f45ec15d0053646d0a98db45e8afc3ee3a76ec3bb81f71f1b0ed6aee8807c2369f178dfe0d7f1a4051e476c366bb997af1a9a5fb7 languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/config-resolver@npm:3.342.0" +"@aws-sdk/config-resolver@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/config-resolver@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-config-provider": 3.310.0 - "@aws-sdk/util-middleware": 3.342.0 + "@aws-sdk/util-middleware": 3.347.0 tslib: ^2.5.0 - checksum: 61ac05c7e1999151b883280055655d59377675a1174c59c08d137f44d481facc0d7a2c612224f329b4fb97b8ff89636376ff03ab4d53b0cc44e0310134991e00 + checksum: 8179cfb21e0c48852d735a78d175fc4e2d4f28ad2f130de4c2392e642c21e0101724b3fd826cfdc48aa8f4993fe1a6171645079224c01c50519226df6fb4c600 languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.345.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.351.0": + version: 3.351.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.351.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.345.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/client-cognito-identity": 3.350.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 11ba057d43d1e36d0da8ca4281c381b5059e8c21a309ef4fb910ac44fa02cd8cdcde32a189b07aff7ddaaff1820be0c539010bd5a8644b339e3eda16e14f5a2f + checksum: 5a117f2ff6e1de449970537736a62a462dd25ac89aa6c8fc1f933abd1b40d5455bcd71e38a1e892655f635f956fb67b1a693e12b82a8ebcf31854c123957ed7d languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.342.0" +"@aws-sdk/credential-provider-env@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.347.0" dependencies: - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 086bde1f5388877e029ba381d44b342dccac2751e1de8a89db301d09f5e36c29bf7bffcb1e2cf66f3935077e22e061eeb35c0c62b587d1763cfdfebfe39e2392 + checksum: 51c159e8ce0db1a0f70615fadccb6d6bb96804d018de33aba0e0c2b3f6f949746ed78b9568b31fbffe2b89dbb61a6033081234c8b1b72a4a8f5e9cc332679a83 languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/credential-provider-imds@npm:3.342.0" +"@aws-sdk/credential-provider-imds@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/credential-provider-imds@npm:3.347.0" dependencies: - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 tslib: ^2.5.0 - checksum: ea6341c9c1c98d164d1cf5f1643c701ef76fa0353659079046045e808964f7f0dfe911c827932ec72182b57781c3cfaaa970a2759657444c0a877b609e93c047 + checksum: 4fdac326041f5488c5a7efb7cdcbb8ad8c30f5c782f97f2fe3a4096b162ad054b1d77c5ea0c860d0643194df4afd287bfbad106bf55c225a59a9497ea32136d8 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.345.0" +"@aws-sdk/credential-provider-ini@npm:3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.350.0" dependencies: - "@aws-sdk/credential-provider-env": 3.342.0 - "@aws-sdk/credential-provider-imds": 3.342.0 - "@aws-sdk/credential-provider-process": 3.342.0 - "@aws-sdk/credential-provider-sso": 3.345.0 - "@aws-sdk/credential-provider-web-identity": 3.342.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/shared-ini-file-loader": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/credential-provider-env": 3.347.0 + "@aws-sdk/credential-provider-imds": 3.347.0 + "@aws-sdk/credential-provider-process": 3.347.0 + "@aws-sdk/credential-provider-sso": 3.350.0 + "@aws-sdk/credential-provider-web-identity": 3.347.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/shared-ini-file-loader": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 126aa2ea79b3079802a5ce3b97b2ba24351c662fe0bf66c8f07f47463c88be27a63a76d79f95ab60e04eb74fab07fa11ecc7f3826085612ad663ef809bcbcfbf + checksum: 8a67c5c0505e0275b1d3288fdea4ce5e1f9d7c907d86e43c17bfd709047cbce43776a35b5aeb87bf0652d657af9b8a79c6bd000f5745d0302453c98cec845082 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.345.0, @aws-sdk/credential-provider-node@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.345.0" +"@aws-sdk/credential-provider-node@npm:3.350.0, @aws-sdk/credential-provider-node@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.350.0" dependencies: - "@aws-sdk/credential-provider-env": 3.342.0 - "@aws-sdk/credential-provider-imds": 3.342.0 - "@aws-sdk/credential-provider-ini": 3.345.0 - "@aws-sdk/credential-provider-process": 3.342.0 - "@aws-sdk/credential-provider-sso": 3.345.0 - "@aws-sdk/credential-provider-web-identity": 3.342.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/shared-ini-file-loader": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/credential-provider-env": 3.347.0 + "@aws-sdk/credential-provider-imds": 3.347.0 + "@aws-sdk/credential-provider-ini": 3.350.0 + "@aws-sdk/credential-provider-process": 3.347.0 + "@aws-sdk/credential-provider-sso": 3.350.0 + "@aws-sdk/credential-provider-web-identity": 3.347.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/shared-ini-file-loader": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: b869e25f8559eb6476841aeb6d297fb6be360029bcbabc594edc2573b2afc1293dd1895d2f61a6995ee96fea5cd9770297d4bd40f7af252e7e277358116b431b + checksum: c337566d8642468a146aa9994d7efd44c3dadd11ead3140f9065dcf47a4809239258fe7e9f5600f62e17ee9f51ab89d31326e48815a61fd96068ac7fd88d7d90 languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.342.0" +"@aws-sdk/credential-provider-process@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.347.0" dependencies: - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/shared-ini-file-loader": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/shared-ini-file-loader": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 87936656e9a838971b610ed811fc658ba0b8359f9a87b2d8a4a1f1d8efb47f46c6a5d44f57f282473c6eea3db36f24ce28fb862c6680f96987dfb8792347f7a7 + checksum: 7e72d29faa4423b6c01614f4692523c4d1a7be1744563c622d1df81397662b58c51242a686aca7ecb9f9e13904ab1deaf14ab282a0610ea0dc76a2608d6ddb7a languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.345.0" +"@aws-sdk/credential-provider-sso@npm:3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.350.0" dependencies: - "@aws-sdk/client-sso": 3.345.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/shared-ini-file-loader": 3.342.0 - "@aws-sdk/token-providers": 3.345.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/client-sso": 3.350.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/shared-ini-file-loader": 3.347.0 + "@aws-sdk/token-providers": 3.350.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 0a7e42c44cb3b5da25c70c17ffbe532aa3edf0995692c137f1072c6cb247efa6557fac64913617a201b518fc57ac6a896240e1af9fa1aee1a63459c5ec5fafce + checksum: a91dc758dff04fbabb11cbd1ca700253be5d0591151778d59dbb681be7e0e2c3b71a62f9b73ae58cdd6761535ae33822ef1a735d886019590b7a666b3ebff53f languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.342.0" +"@aws-sdk/credential-provider-web-identity@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.347.0" dependencies: - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 19de3af2ee63e9bf9ff88d60c7add38d65b91df043e92281b4ea3caf91184ae9e94d2c890c8a2e38650cfec2d9976d3b03b750e6b3003ea510ae8965e2701452 + checksum: e2df45265f6c18e63b1ce2a95adbee10f6a25cbce89528630c92bc901c33486e29ab4609a16c3ec5c35ff10b9f3699ee36c8092b9a5ba04ea7d8b7cdbe2ca1a6 languageName: node linkType: hard -"@aws-sdk/credential-providers@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/credential-providers@npm:3.345.0" +"@aws-sdk/credential-providers@npm:^3.350.0": + version: 3.351.0 + resolution: "@aws-sdk/credential-providers@npm:3.351.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.345.0 - "@aws-sdk/client-sso": 3.345.0 - "@aws-sdk/client-sts": 3.345.0 - "@aws-sdk/credential-provider-cognito-identity": 3.345.0 - "@aws-sdk/credential-provider-env": 3.342.0 - "@aws-sdk/credential-provider-imds": 3.342.0 - "@aws-sdk/credential-provider-ini": 3.345.0 - "@aws-sdk/credential-provider-node": 3.345.0 - "@aws-sdk/credential-provider-process": 3.342.0 - "@aws-sdk/credential-provider-sso": 3.345.0 - "@aws-sdk/credential-provider-web-identity": 3.342.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/client-cognito-identity": 3.350.0 + "@aws-sdk/client-sso": 3.350.0 + "@aws-sdk/client-sts": 3.350.0 + "@aws-sdk/credential-provider-cognito-identity": 3.351.0 + "@aws-sdk/credential-provider-env": 3.347.0 + "@aws-sdk/credential-provider-imds": 3.347.0 + "@aws-sdk/credential-provider-ini": 3.350.0 + "@aws-sdk/credential-provider-node": 3.350.0 + "@aws-sdk/credential-provider-process": 3.347.0 + "@aws-sdk/credential-provider-sso": 3.350.0 + "@aws-sdk/credential-provider-web-identity": 3.347.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 7b9860d2a374216601e1195db3ae51c44f17c9d1329afb84d2090e3180c61c4f2fe5d56e21168357cd10b48b410ab48441d8fac97b9a899b043715d652f47cf6 + checksum: 5fda553cf6bcc3d46b9c5807eae6d676f5f30951fbcb031ddc65fa56cfee65541ef04050612bbeef4c6c7d70802d5efa2a50a0c780136ad75a55f4666b21ea6f languageName: node linkType: hard -"@aws-sdk/eventstream-codec@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/eventstream-codec@npm:3.342.0" +"@aws-sdk/eventstream-codec@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/eventstream-codec@npm:3.347.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-hex-encoding": 3.310.0 tslib: ^2.5.0 - checksum: 2922d430c6de801e584ff86bc8ee96eb055dbd2509b786c695c8e2f6029e5969d23ab6f815526a81460cbef9b8bf83ed70977855bbfba374e8daaf3043c88431 + checksum: 5279095f6c3c90ff301ae378e77ef3a74c9bec660f59be9aa1f6f2917f37529170d8a84d7d68763a8046507d43818a25a757f166744a4fbde398af398ebf7d14 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-browser@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/eventstream-serde-browser@npm:3.342.0" +"@aws-sdk/eventstream-serde-browser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/eventstream-serde-browser@npm:3.347.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/eventstream-serde-universal": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 47ded9d3674207946a611ee3f12f7173386ede8d1e60537b1a4782a491ac782e3251fed0096465d307ed0e9597c9d6ace3a7a709b485cd1af8b47abaadfa8006 + checksum: e1a24dfcd18ea0ea8f04b6d2ecb5589d586131e0b73c6f2f896d73d5829266ee00401c3c7d04c662645ebbe654028c9ba62ff267ab0f0cca124283f179f0471f languageName: node linkType: hard -"@aws-sdk/eventstream-serde-config-resolver@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.342.0" +"@aws-sdk/eventstream-serde-config-resolver@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: c7bac1de5aeedae2393d43d63b87865b9b25b25f56bdd0aeb081490da01b4aa8caecc36a1ded6205b811a8986d7b5a3dd9858eab808c4ccf0f37552d32fffb83 + checksum: d40574c294ae23983c5957b64508625985ddfb1198835e9fe295a67947f81c26227d930189043751e04b0d3201976009e9209e8a23c7de38c63231955eec7342 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-node@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/eventstream-serde-node@npm:3.342.0" +"@aws-sdk/eventstream-serde-node@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/eventstream-serde-node@npm:3.347.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/eventstream-serde-universal": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 32683ca9a1aaf531bcd27d94f4d5e80d4955dfe426c9d71d60f0a03fdd5ffebd07c44bb4eb5bf1c4302b270abe37c0e8f361aadf77c67ff50b9eac4eef020f70 + checksum: 223445d11155c88762fd5ede06845b8b68045a36ca644bceee76dcf48e66e3788c79edf6e68cf35233a3a81cc32ca13342da62163fe2fad0ce0dee05b7822102 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-universal@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/eventstream-serde-universal@npm:3.342.0" +"@aws-sdk/eventstream-serde-universal@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/eventstream-serde-universal@npm:3.347.0" dependencies: - "@aws-sdk/eventstream-codec": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/eventstream-codec": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: c7a53aacf39596a98882488d547eb65fd7e40ac56b68f5a2eb0db8a08437c44ad98c75929a2c477b0a26e5ac4ebf3d1bfd712cf31f9d6f379dc00ef2738afe74 + checksum: 67df71b0dc77c5944b797e9df4277a236ee77634cd3b58b6afc5d17b327dfbcefbdfdb9e8a8df45a7a34a696eb36e0943c195116f3d78b1fa362f3279c42956b languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.342.0" +"@aws-sdk/fetch-http-handler@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/fetch-http-handler@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/querystring-builder": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/querystring-builder": 3.347.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-base64": 3.310.0 tslib: ^2.5.0 - checksum: da02fd9ff17e5fefaee3f2a070e13ad105b7bdd194a9e591299b04af556da01024dc8da2c41ef84be0435b68e8f32d88dd67b175c322983d3ed6b1ee5a2b8231 + checksum: 42251dd957fc32753bbb08676a044dfa6bd195eb6cad041822cb96b05b3e46a33f91404e25e18f1b6dca20555a3b21ad135b13ad91cea97dd8adff59326df07e languageName: node linkType: hard -"@aws-sdk/hash-blob-browser@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/hash-blob-browser@npm:3.342.0" +"@aws-sdk/hash-blob-browser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/hash-blob-browser@npm:3.347.0" dependencies: "@aws-sdk/chunked-blob-reader": 3.310.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: ebc4e8773e90a8fcf23e04661c91bdcb32b8c05a570ec8572858b9540d8898490401f20b9611a6e8a1c6e520bea499c212874f31810b494b4c348883c93be2cb + checksum: 75042a61979760b821118d8e777bf56862ed2486fc9145e0275c8604831e42de7caaee45be18663500962fc145f0d62abb4f28efd75ab53612b80b0b96d507f6 languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.344.0": - version: 3.344.0 - resolution: "@aws-sdk/hash-node@npm:3.344.0" +"@aws-sdk/hash-node@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/hash-node@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-buffer-from": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 361d96625d39c43a5c1873e4a549014eaeed56a2c1d3c4fa46047610cba9542252f4df5760f802ac268f29fbe1c863d70dbd298b5d0c0ed2dff26073adff9b8f + checksum: 5e33eb7b3adb291d661a105306f737eca932330b1b0395d6825f216c97a3eca47a19bb708a4dc10d68c8d80d78073886ba2714cd8cdeb27c6099da8760b37ead languageName: node linkType: hard -"@aws-sdk/hash-stream-node@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/hash-stream-node@npm:3.342.0" +"@aws-sdk/hash-stream-node@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/hash-stream-node@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 812a1c3987219af25073e8cc6bd304b85ea84e170e14b3dcc63c04b2b0b9c35c4b15c6c1194b67872cf113b3307a691d1c27583d0b457717c3abcb22e3c29c5d + checksum: c379b66cbbaadb4cc3807aa06941c987952fa09af50c3d59b9cc44670a64d049c991d6b15208e9f4928438e6ccb7145ef2cad4b9d5e1a916a4a0fc8b18be836d languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/invalid-dependency@npm:3.342.0" +"@aws-sdk/invalid-dependency@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/invalid-dependency@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 58694fa950beae12bc780687d4dc43bf93bf5764f89c02935fb143d47532ebf8102da854f27aae767399fe507ca76513c625c05cb181935e0579fb35641e2f65 + checksum: 78abc0831478c0bfa83df7bbbdf346d42a9b0f379f2392bba11576198e1b6a3a3b24e95aea46eabe7eb6233ab20ab1e5dc2c6f7c48d2b296d1590bd9370afcae languageName: node linkType: hard @@ -1184,12 +1184,12 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/lib-storage@npm:^3.310.0": - version: 3.345.0 - resolution: "@aws-sdk/lib-storage@npm:3.345.0" +"@aws-sdk/lib-storage@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/lib-storage@npm:3.350.0" dependencies: - "@aws-sdk/middleware-endpoint": 3.344.0 - "@aws-sdk/smithy-client": 3.342.0 + "@aws-sdk/middleware-endpoint": 3.347.0 + "@aws-sdk/smithy-client": 3.347.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -1197,388 +1197,388 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: 1bece781ac04a3f7e12a0b1831d645f9077416f526dea47f93ca3997d997d154c79951392d2e56006823dd70e99b6d996548a51153d4d506ac33d6937b088791 + checksum: 69c073f7bc9a197214bd7e465682daa3455e5fa255e2d7eb8ae9414ecf75c52db0ed09622b61c3d494574d873a8ee233692a8033fdb09f768ab1ab3c76cbaade languageName: node linkType: hard -"@aws-sdk/md5-js@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/md5-js@npm:3.342.0" +"@aws-sdk/md5-js@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/md5-js@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 750dcbac2ce6cb4ec0dc05bf6ee5827b79fea14e64f2826cd20421c1b9460e7d9afe7bf7c7ac48e7b9478d2be00138f5e9127a5f1e9fba398e488318efcd4e10 + checksum: ee1d07546d1d6a6f5dbb30567bfdac658523569a75bd46cf7d2a0f4ab2360a6877f8377e081484733e7a38979f84531f2a8d3a2c5edd8acff6f50390bcf6efa6 languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.342.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-arn-parser": 3.310.0 "@aws-sdk/util-config-provider": 3.310.0 tslib: ^2.5.0 - checksum: b3d436234049b38af9e0215354787e5262cd5337ef6e4dccd4363fe040b7be82720717270f0803ff3832b0af24abba547df1c1c83e572e8ac82270561d09527a + checksum: 5a92cf322812d0942b658a354369133530467f836a5a31afb4ad5a6a27cfbbaf43ecbf359f564f92d9a581ea470220487afb68608b66caa779e5a81f3d6d4a30 languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.342.0" +"@aws-sdk/middleware-content-length@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-content-length@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 397d211c6497b104457702581b3c8b29afd8dfbc6b07ca49f6c6d57375cb389cfa2c0675af447e635b81843f51382aa550882175d07a8c8c0bf707be7c125b59 + checksum: b22e25918d41e8bf382dda43f1b9558a0b06a5db9c953e0ea492d56be2f83a444e69b96c9a23fb6505e6955ff03727501f933ed7d936a5d9cf7655ab7d42d092 languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.344.0, @aws-sdk/middleware-endpoint@npm:^3.310.0": - version: 3.344.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.344.0" +"@aws-sdk/middleware-endpoint@npm:3.347.0, @aws-sdk/middleware-endpoint@npm:^3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-endpoint@npm:3.347.0" dependencies: - "@aws-sdk/middleware-serde": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/url-parser": 3.342.0 - "@aws-sdk/util-middleware": 3.342.0 + "@aws-sdk/middleware-serde": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/url-parser": 3.347.0 + "@aws-sdk/util-middleware": 3.347.0 tslib: ^2.5.0 - checksum: 74c8b14104ce6283214d7bb5ce83dc95ccf3e9aec627cb13ee58237d85717d3ed84bffb1d97ba8510e9b154486007cde14a18b0b04592b29ffe4ca19bbcbb46f + checksum: 0c6b0c5adb1bf3035f39fd3df3aa93fcd7e5d67c0f049a178ddaaa548896c23e0b7571686579b49f69fd82e3a74bd939d8386986a66b53e900fde9a24f0c35f7 languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.342.0" +"@aws-sdk/middleware-expect-continue@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: aaca4517e61c87775079f7eb673c9474ecd426ca0cbcb8bf891a560518f363de91d0f9ede352d59ec1b1644a789db7a13d79c9ace6e848fc7fc365456dc53309 + checksum: 6da6dfe3ae754317f053860cdcc3c0e730800c9cde97248d6b42be0376397a6f61440739dbb576569c65d31a3cdda0a1667d64982686cc855187207458af5ade languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.342.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.347.0" dependencies: "@aws-crypto/crc32": 3.0.0 "@aws-crypto/crc32c": 3.0.0 "@aws-sdk/is-array-buffer": 3.310.0 - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 31c6a3a01a64420765af3bb5b94f7b096412ad01b746a77b2391dafe9482e2d0b88d01d10be9f4103449c872ddf7411c29434956970112641b0c9fe0227087bc + checksum: e4d7522c1445b569d5eb3226874377bb109bcf64df16592123eb5051fc63345f0491d4b0f58678a607c8c5e5e02bd87b5b39b46a3f9c17d623fa7b53d42d118b languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.342.0" +"@aws-sdk/middleware-host-header@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: eb26b492a2674baabedd96b5ce8152f5f0dab901931b5ae4ef15ad53e59d6967f58c68afe7e7ac53b183d818cc1b5640fd27e7b74b5ecbf7377783d18a35317b + checksum: 7aaf9ca270fa90bf6c99f24dbbc2a9ad36c663a605df548630e46ac50783402fcc0b49784d60cb9367697be78835ebcf0592218973d6a176e6b15f12a1f7ae70 languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.342.0" +"@aws-sdk/middleware-location-constraint@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 7fea65c01b47c7c4b971a6446a1d439d0d914aa160b61ca8aba1ff7ad244d487056a7fd022b9d9a06722d225ef69f08b1994f9ddf9d5eb20f7f66515db5ca040 + checksum: 0c362bdf6e7f6e3f041ed78ab8e4afdaca1b3cbc093b611e83374814512b3a224eb9c677ab75ca1f46e8be8bd9eee72f152ed8d2ae88638250125b7b4be383df languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-logger@npm:3.342.0" +"@aws-sdk/middleware-logger@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-logger@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: bada09358137c161d781021336ea988d423f8db067c1eea2942ed7664fdb9ce852a9ee17d3da63a4f3678ff27e789996110848e7043963b771e78505f5cb693e + checksum: dd88e3b525ee46cef3324925003d9690e48900397e27fa6c6bbdfcaae1e56bfb9bd4115d0aea30a09c60ae47757eb089358e3049bd4090726e52415a4d945c62 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.342.0" +"@aws-sdk/middleware-recursion-detection@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 4871056c3a8e3c9de17f59f946bfdcad85a5ee9f16cf96914fc0dfe6e2aa9e850e688dc4cfcb908eee0afe9591b6092b3dfb7d3bc3c1fac25f6cd4c6c83ac4d3 + checksum: 380f79b18c8fa70f7d8e7f31fbe4c3d43336043d7abb6b577945349d69ddda487d50f61a9de2b7305e0149ad896f5c9605d27da9cd8011d1da0cd82225659eaf languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-retry@npm:3.342.0" +"@aws-sdk/middleware-retry@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-retry@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/service-error-classification": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/util-middleware": 3.342.0 - "@aws-sdk/util-retry": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/service-error-classification": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/util-middleware": 3.347.0 + "@aws-sdk/util-retry": 3.347.0 tslib: ^2.5.0 uuid: ^8.3.2 - checksum: 066268ccab655680b75865c8c47beb19f269d5b3bc14d85c4f6c53af9a4fac50f9b7c2f7bc0ca93fcb4b3f9bbb5d14b89c21bf855504e90b9a86cd370d4f8e0b + checksum: 313d1c190f201f87d8df31732d8aaf1bb4dc7bc6a2210bc96ecdedf44e688174db86aed23a911968022e13dffcebaf0280af460a2f3d2cb91c5d17088be72262 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.342.0" +"@aws-sdk/middleware-sdk-s3@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-arn-parser": 3.310.0 tslib: ^2.5.0 - checksum: 5bf9789bc3e745ac754829d1e0dc6bb6fef7659cacfa38d41bd97df2b5357dbc5429defdb32e6b7fe0e27bc75ed9f04ebb1e42045b5a77e7f132f923d8287ccb + checksum: b1110352d5f794537931f820a429d86f5d6891be9461cd16cbbcfdea7f8666d9f953ef3e0a939fda7961b8d5554fa819159cfe88f36307ffd4fdd396b341f420 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sqs@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.342.0" +"@aws-sdk/middleware-sdk-sqs@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-hex-encoding": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 450d44dd0b66da4137a7c2cf96c0a5de88c40b0dd8281cddc90d7ea42ee54c8690243ae95584273de1c5d591149ca0f34c4da575467b01c85479395c3f7fa9cd + checksum: 523a0a075b6ddf4a5e2d34111796f327ed2d2f1828132aa23f0d4f70088902d9586cc12d056ffbb739fc2a78bd0edfa7fb91aeffed7ee49908fc43dcc433b45e languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.342.0" +"@aws-sdk/middleware-sdk-sts@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.347.0" dependencies: - "@aws-sdk/middleware-signing": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/middleware-signing": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 404e122a0d2d9ed6530a57fbd576f9085781bf57476cafd57ef048a49120cb7bcc24849d5337c5b7578f3bf1ba1825cb6282bdf13545e12dac26611b841f67a0 + checksum: 6fedfea4b8cb224cd709bdc41634e21e785de6c53f85633b3bb18a8f859173970b2442253844627b7babe5ad0ae87793939448385e042d30c16bb71d87f10cb7 languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-serde@npm:3.342.0" +"@aws-sdk/middleware-serde@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-serde@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 10bff04ba1e31b9a7da311bd509459ad6a45f78aca817c0c436f9b2cde1f5f439a1f089d29cb741141815b9a0bee8a680efa25d5a9e900a079a415acf3cd8602 + checksum: c7b903f7656e7eefcac4772a475b669d46bdc42cbcb21d471fcbf6bf125b0cc701fe634a4f80876aa4264eb3febb5a73a9745b1fd747a0fac5455214b55264dd languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-signing@npm:3.342.0" +"@aws-sdk/middleware-signing@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-signing@npm:3.347.0" dependencies: - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/signature-v4": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/util-middleware": 3.342.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/signature-v4": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/util-middleware": 3.347.0 tslib: ^2.5.0 - checksum: d07d718331d63732a4ad55bf580eb20375622f86fe05db3eecc874936e754c16a681951c00d206c30e9a4af84dd31805a72de55d0c67fe80b859c91d192342d5 + checksum: 757c9c333e2c8094f0b4878a3d1e68f0b3186da1cd01b67fbe973be5b7407adf714d3b5ad31f7eecc6ec7157ea7b9eac78df32e91cd4e40e4e47a35a1708c12b languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.342.0" +"@aws-sdk/middleware-ssec@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 4c85be245737ee4f36b609bb9ba6add5d0c53238694e1772a4a05abebe3f6db5b853230021d8ce592c824c1dc23b84c06d2dd70b32d1ebf9cb17dbc059f5b368 + checksum: 638daeb4569e40f2e3279289aa78909683c648f085b0de27bd58d7a461ef4723dab1794150eaad6ef787dad15f977a8871e89a0e5c4581a7ae01dda9e36a4abd languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/middleware-stack@npm:3.342.0" +"@aws-sdk/middleware-stack@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-stack@npm:3.347.0" dependencies: tslib: ^2.5.0 - checksum: 8cd077f7e60f9ceb57eba0f0766e5784ced7bb959dfeebb4491a948006052da1d1a99a98795146a80424b00f3f6874f85bdb94419a1e1d510227f739886f90a2 + checksum: e2321ed82fb71ea5a0cdc18e88be3c5ae58e36ddfd0786258f791bed2db72716fd36d00c33417046a52f1bc0f3f611178cf790b52fc9a3e7278027601c49bad2 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.345.0" +"@aws-sdk/middleware-user-agent@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/types": 3.342.0 - "@aws-sdk/util-endpoints": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/types": 3.347.0 + "@aws-sdk/util-endpoints": 3.347.0 tslib: ^2.5.0 - checksum: c2e057bbf31e6365d351dbfb007dbaebda8fc5fb5194e1314b32e474c103b09756eb5fdcbd15f5eb6a9e6e80a19a16136ad4111d63685430f93039ff6edab76a + checksum: 19fa06397676a75177b0f1dfcced420ad36b43cbd4e50035f2eb02a828e51cc62e0b68eb204bfd4ee3821c5c5617e909caf15e42dc4e212cbcef20d514102359 languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/node-config-provider@npm:3.342.0" +"@aws-sdk/node-config-provider@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/node-config-provider@npm:3.347.0" dependencies: - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/shared-ini-file-loader": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/shared-ini-file-loader": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: b52f42d898e42683493fbda9a50437529bbfbc46d0b12deddbdd0976f05a278a9303de2abe01573c86cf423d37b88881097c7c543c695ab5495e58be99119bfa + checksum: 40ac79ec3e124a29b13751f62abf5881da2d12a7b60f95a00e83c9c86988b47912965b1782347c8e78e9f6a1b04d536d20a7beb68e00b04075cf2b4921987b00 languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.344.0, @aws-sdk/node-http-handler@npm:^3.310.0": - version: 3.344.0 - resolution: "@aws-sdk/node-http-handler@npm:3.344.0" +"@aws-sdk/node-http-handler@npm:3.350.0, @aws-sdk/node-http-handler@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/node-http-handler@npm:3.350.0" dependencies: - "@aws-sdk/abort-controller": 3.342.0 - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/querystring-builder": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/abort-controller": 3.347.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/querystring-builder": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 268ad90f1adfd20a33b61542b1c7c03528dee4dd9eaa07e42120c5c6e2e165c8e9b05e2356410600d5ef62d1e316885d13de81b0c257eb5500a82903abe05a69 + checksum: 142299a3162b76ccd96d1e7e7dd4e0b5d0de6ff0f03af226042a0df0ca8e6a9752fa619bb75eff3508512b1e582b1bea257a985e9046444ec3a7a913def4479b languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/property-provider@npm:3.342.0" +"@aws-sdk/property-provider@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/property-provider@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 22a1d5f1883627e431e0523650877447ad8ebe57e39d1e798ee7870f7dcc0fe8013b958621b30373b5362326e3eafc00716eefe4f42b0d8f435968698d1694d6 + checksum: 66d21f7996c5839f7d8a887625c7b85573119901a69b6d1efe3ece204f6e2c7058fea7eeca4f1bf4357d9ebf34c18d6b3e67a5ebacc2275eb64adab889ecf01b languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/protocol-http@npm:3.342.0" +"@aws-sdk/protocol-http@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/protocol-http@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: f6910fa4880780d224cb5f78eb501cbc900a51b33be4727e734f2ea63e3bbdc7d581bf53e77ba3fa3a569055ba261750d0623e5c95b5ad510d11b4959166b00d + checksum: b783ec09ed684e747628fb4689df980e1d6e98ed65e25769c7102af8625b6e085498d7a6572dea3f47a1477ea7eb062e9f5508bd923c56a63a41916ad030a909 languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/querystring-builder@npm:3.342.0" +"@aws-sdk/querystring-builder@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/querystring-builder@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-uri-escape": 3.310.0 tslib: ^2.5.0 - checksum: 801e5b4230024fa08244b78b96a96df62f1bbe681b3e3eb4694d4fa21bf59e732547d63a1636cc14cc5feb5e8d854497acea15cd826cbe68ea89abc6933f84fa + checksum: a4f6f9c9a340107de37cd3e206d31c57f40f91de14aece87daac229746e57077a8440f126389d200f6f6f4af7507e5663a3cc7d67443e750b947d6645ba644ac languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/querystring-parser@npm:3.342.0" +"@aws-sdk/querystring-parser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/querystring-parser@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 248b5b855eed52957cf3d2113ce57205723ecf1f378d211c79eb6209e68d8c4994c537bc4ff40695496f69b5337359d8de63825978e7570aa2e9cc76222c9e95 + checksum: a27075fc174ca7d0487851107b590f651bf4396f872a2015af8d4967d11610000919eb99cebd679989219ef59127b70093d03fc07cf4ce3e5295d6848ed213dd languageName: node linkType: hard -"@aws-sdk/service-error-classification@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/service-error-classification@npm:3.342.0" - checksum: c7cf32ac7eb745db8e54ce1cd66618b10e321f814e406944b46692ea3b76778e43a90c9c9febfaed05049a426526e0820385d71d9868f227e23cb1dc5c719b48 +"@aws-sdk/service-error-classification@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/service-error-classification@npm:3.347.0" + checksum: 5404b520a41ddddf54f48f391b27c551232358ed059ba8f02c818b57d7cc5b96156e3a4466f08435fca181ba645e97ad487d771b30dd13024ca0c2e3fd06cfaa languageName: node linkType: hard -"@aws-sdk/shared-ini-file-loader@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.342.0" +"@aws-sdk/shared-ini-file-loader@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/shared-ini-file-loader@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: 252c1f2f75a7bc2c135e8a1da5d6cf27353a5fdc5d57b9440b0546cece3b27d498621d07a100e741ff2037df9423e8cd9225f65bb89537da9cb01bb4711a4cb9 + checksum: 5dd8e322733f31b284215e187b54c20640689c2c4b459854436f393b82e485bd8273bcaea527f77bc3ae9c7ff3956913a4b5a355e30d00dfa21f4b9b177c3a89 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.344.0": - version: 3.344.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.344.0" +"@aws-sdk/signature-v4-multi-region@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.347.0" dependencies: - "@aws-sdk/protocol-http": 3.342.0 - "@aws-sdk/signature-v4": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/protocol-http": 3.347.0 + "@aws-sdk/signature-v4": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 peerDependencies: "@aws-sdk/signature-v4-crt": ^3.118.0 peerDependenciesMeta: "@aws-sdk/signature-v4-crt": optional: true - checksum: d8adf704643bd50a99f6f812e989677152b6d8ae4f39ecae959b0cd9446fdb06f10911ea8fd30793743af4c3f642f3986b122c206ff016de2a009da8c3b466fd + checksum: e1dfca095f7b69f25cc7311476d49b7c3c0531710a8f34568624ee143fb88ba7d62c4542fd4bd450e1a4540b10ec008634ddda0f36595f00f96f67be2932551f languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.342.0, @aws-sdk/signature-v4@npm:^3.310.0": - version: 3.342.0 - resolution: "@aws-sdk/signature-v4@npm:3.342.0" +"@aws-sdk/signature-v4@npm:3.347.0, @aws-sdk/signature-v4@npm:^3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/signature-v4@npm:3.347.0" dependencies: - "@aws-sdk/eventstream-codec": 3.342.0 + "@aws-sdk/eventstream-codec": 3.347.0 "@aws-sdk/is-array-buffer": 3.310.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-hex-encoding": 3.310.0 - "@aws-sdk/util-middleware": 3.342.0 + "@aws-sdk/util-middleware": 3.347.0 "@aws-sdk/util-uri-escape": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: ab251dc6ad546beb1129abbd9dfdf8637da82cf54e14dd7cff9e026d62a428d511065a36604609963a028c2a04140d4c96746e3d3da50a441f0baf5d431a7fa8 + checksum: ec372f09661a876b2dcec3031c5b2c7ddd64cf39780afe66979e1c2c116c044e31e1c174ba99d5b94c7e62c0c27696f859fa592b01ff9f7f3400ec44ef91e0d3 languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/smithy-client@npm:3.342.0" +"@aws-sdk/smithy-client@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/smithy-client@npm:3.347.0" dependencies: - "@aws-sdk/middleware-stack": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/middleware-stack": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: af79f4ec9bce5cda76154839f5f2ce24268cc4ec8f496aa5b9a8ff632f88675dc7015363cd57b397691df4de417cc05d706cf7b0c6ae02c686d42e95f204133d + checksum: 90dcc3bd689de075bc718e6e5ea2169bf3a0705525dca62dfe8169ab48919000db1703ebd1decd12fc6439428a9240e252ef3c4ecd361ef0a7cfa5a26902fb24 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/token-providers@npm:3.345.0" +"@aws-sdk/token-providers@npm:3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/token-providers@npm:3.350.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.345.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/shared-ini-file-loader": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/client-sso-oidc": 3.350.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/shared-ini-file-loader": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: d9d7d446cdec152e60087e1bac5f123ccb8555b1f4802ed10a522f60eaa716785882fa650fe67ac24bcb153eba2c104a19784b2b4408541ba6e9cfe5e68a5d83 + checksum: 913e08fc27efd4343ad7b9d7753aac3d73340c6ff294d7a07bdfa07c944079863fba19bf0baae8c860cc4d4873a5aacd429e161e9c3fb2ef6c1f194603500855 languageName: node linkType: hard -"@aws-sdk/types@npm:3.342.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.310.0": - version: 3.342.0 - resolution: "@aws-sdk/types@npm:3.342.0" +"@aws-sdk/types@npm:3.347.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/types@npm:3.347.0" dependencies: tslib: ^2.5.0 - checksum: c9ec0873304548696deb604fcc4fcdacb726c9e03a65cdb4e9d8643a24ddf83ea32aa9d85b801406670526ca210131d5a8842d3674c73757c03ca5329ed2d13a + checksum: 799b053d3651f1754e2925b671fe890047d0ff1af69d22b6826d8e74edefcd558c7c7a911d48eaf5930032bcf291dbdbb6dd2d2f0c596bbe52100941aa349221 languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/url-parser@npm:3.342.0" +"@aws-sdk/url-parser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/url-parser@npm:3.347.0" dependencies: - "@aws-sdk/querystring-parser": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/querystring-parser": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: d5c1b23cc3f110ac2acc47c7777911d362bf674ba5226b82b8f8c73c25e45bc56ad5060169821af88890d8d9cc02963d0af0e7574f9a283fc6987f7f8672f7bf + checksum: d1dc99173f00cfce7709a259afc54c4e5792e757f4515bdf71dd8adc22dbb1d9b9e4be1b1056a80055e42272d3658f5ac511fb4d436826ba7d425a208f287e08 languageName: node linkType: hard @@ -1638,39 +1638,39 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.342.0" +"@aws-sdk/util-defaults-mode-browser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.347.0" dependencies: - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 bowser: ^2.11.0 tslib: ^2.5.0 - checksum: 96ff9723313dd331679e311f2e534914e4348b9729c19dce666c766e19a847eaea293d55bfbbda00c42eef127a5816aa6501cc4882be49c24470ab0285e3bff1 + checksum: a9f2fe203473d8cc04735371132c0155815eef1d005f577f263b8e5b7bde9b51923bf3fae41dc7a9024d79d401ed15afdd34b1f47631b0ff2704d6c9198b9a8c languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.342.0" +"@aws-sdk/util-defaults-mode-node@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.347.0" dependencies: - "@aws-sdk/config-resolver": 3.342.0 - "@aws-sdk/credential-provider-imds": 3.342.0 - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/property-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/config-resolver": 3.347.0 + "@aws-sdk/credential-provider-imds": 3.347.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/property-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: b255d8039e56b6ad4264bc2615a995804e3cf565ee36876f05491fbd795f5e0c3c4af3bd7e42c00d08cc68311694e60942a363fa2db6a4228447827d9f36455a + checksum: 22cba2f20b12810a915b36a24e116af3c0d33027792c65f862e04783908ac295486dd1989dcf9b4e4779bde88df6b8503170f0a305419924c669f6b7bd1d5e46 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-endpoints@npm:3.342.0" +"@aws-sdk/util-endpoints@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-endpoints@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: eb9443651d620ff6fd13b2e2cd7cf85f9e40672d385e12d63502bc903e5cd1e6887142d6ca4e2f9fd56cc07cbf1777bf0a356a0dc62143104bbe35352add7003 + checksum: 593edde1dc9a59b121fb5f5a41de0cfaf396f06d9676a8882b95bd9e1a70cf86d9d221f8a92eaf05101f1461675a10898367aa51c9805d96b802f1a9cb367048 languageName: node linkType: hard @@ -1692,48 +1692,48 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-middleware@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-middleware@npm:3.342.0" +"@aws-sdk/util-middleware@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-middleware@npm:3.347.0" dependencies: tslib: ^2.5.0 - checksum: b668e04eff6e54b3d2e1f410d1b18244fc1aecb9c6d231f95971c6798393c5a00e139cbd30da08f82226af9ea96addb3a8d96a2612e2e338975495d03c100426 + checksum: 96b9233a190c0575caac2b44f17a64078423221c300b48744ae8b5954856a0caaeb2c6ab3fa2ce280cb766f64532cb87dcf3051720cb2a2107e57910d57d083c languageName: node linkType: hard -"@aws-sdk/util-retry@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-retry@npm:3.342.0" +"@aws-sdk/util-retry@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-retry@npm:3.347.0" dependencies: - "@aws-sdk/service-error-classification": 3.342.0 + "@aws-sdk/service-error-classification": 3.347.0 tslib: ^2.5.0 - checksum: 89f730fcf8dce43e6d426fd2d00b48eca1d8935ecc2ee7f07cc93d18cff82bc50a29f6ff536b2f570ed604f4df3044e53e82d84a5cdf37f08ccc0e43e4c9ff87 + checksum: d8d016e00f2519e1282f696322f8b3be6f8266f51dda9f7666f25fdac4cd28e569b88a855499f766aaed47551d323decd2e385940912d6b3b861cc11549babb8 languageName: node linkType: hard -"@aws-sdk/util-stream-browser@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-stream-browser@npm:3.342.0" +"@aws-sdk/util-stream-browser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-stream-browser@npm:3.347.0" dependencies: - "@aws-sdk/fetch-http-handler": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/fetch-http-handler": 3.347.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-base64": 3.310.0 "@aws-sdk/util-hex-encoding": 3.310.0 "@aws-sdk/util-utf8": 3.310.0 tslib: ^2.5.0 - checksum: 5d6e6cda660001c82abcddc002a164db79ae69da92d6d7b94ad57a09a2147c32d21deb59973e4bad787a2faca831fd0e2f58f4f619e4e953a591ee7c02dafe44 + checksum: 3377b4778c3b15726126b6745b6ae7657ce21f97396e78ea51cd01ab3feb72885dc5823a03cced2cc0548ac35a443f350bdb59fa6abeb0d4425d2bdf6a8eddad languageName: node linkType: hard -"@aws-sdk/util-stream-node@npm:3.344.0, @aws-sdk/util-stream-node@npm:^3.310.0": - version: 3.344.0 - resolution: "@aws-sdk/util-stream-node@npm:3.344.0" +"@aws-sdk/util-stream-node@npm:3.350.0, @aws-sdk/util-stream-node@npm:^3.350.0": + version: 3.350.0 + resolution: "@aws-sdk/util-stream-node@npm:3.350.0" dependencies: - "@aws-sdk/node-http-handler": 3.344.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/node-http-handler": 3.350.0 + "@aws-sdk/types": 3.347.0 "@aws-sdk/util-buffer-from": 3.310.0 tslib: ^2.5.0 - checksum: 9cdfcf50742078d22c7ba52e09e6ce4d1b41610be5658a1154dcf04ca020583596d5a6525025d639a08e83531580e54ad9de3a0e4b03d3eb43aca6fc18a1d440 + checksum: ac437783b140d9cc6772dae422f616f87989604314f5fad35817f0cc7c22c29f02229c3c9b7c87a2c62509d49be0dd42bacf30b36e6e060d786ba36fc8aa3e27 languageName: node linkType: hard @@ -1746,30 +1746,30 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.345.0" +"@aws-sdk/util-user-agent-browser@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.347.0" dependencies: - "@aws-sdk/types": 3.342.0 + "@aws-sdk/types": 3.347.0 bowser: ^2.11.0 tslib: ^2.5.0 - checksum: fcab0d5789aea04ec6f5d2ecdb09ab976de7404e3ed9c0fc553caf098bb823c1c969b1215e15f65f8ad545722334b9e5b172670d817e412e053d96d7a0859cb7 + checksum: 64382e5b728152c004e127321ba88a43acf7a33d5a8ae16510e93bf21d0adbf1c53dd8ce96ad2c8276451ffdf895c990e4982f8f3cb96af0d2f16e0fa97c6646 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.345.0": - version: 3.345.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.345.0" +"@aws-sdk/util-user-agent-node@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.347.0" dependencies: - "@aws-sdk/node-config-provider": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/node-config-provider": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: d4b24bed46b40a92a54b48d5b67f55e3573d4dcaf1908c99fd26c72515a910f45259dd4811605a45733b78a7eba49b950766622a3407cc40bba31ba2817319d2 + checksum: a6363cb77313428dac5ecf8dff268696607e2670819c4d522f6c42f4568f80e6b771eead229e20a5f8a815a9e66c00028deaa3d6d121bac816d7fb5c17699026 languageName: node linkType: hard @@ -1792,14 +1792,14 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-waiter@npm:3.342.0": - version: 3.342.0 - resolution: "@aws-sdk/util-waiter@npm:3.342.0" +"@aws-sdk/util-waiter@npm:3.347.0": + version: 3.347.0 + resolution: "@aws-sdk/util-waiter@npm:3.347.0" dependencies: - "@aws-sdk/abort-controller": 3.342.0 - "@aws-sdk/types": 3.342.0 + "@aws-sdk/abort-controller": 3.347.0 + "@aws-sdk/types": 3.347.0 tslib: ^2.5.0 - checksum: b3f5f3747ffb8bd8323cf57043ec8ed8a2633257deb8113ff9da1cd882a61770ef1d7066e14cfd577c6e83d9de3f24188ab7eb140be951c76260cba05d5bbe70 + checksum: 44d7553e0b82a596233d707218b55d2e4f911b0983b0c5fd751c7390c3945ad1cfc9009bd9db8d8a5107b2c28386ff4d9a72e1688e91324c99165777e8515480 languageName: node linkType: hard @@ -3636,11 +3636,11 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/backend-common@workspace:packages/backend-common" dependencies: - "@aws-sdk/abort-controller": ^3.310.0 - "@aws-sdk/client-s3": ^3.310.0 - "@aws-sdk/credential-providers": ^3.310.0 - "@aws-sdk/types": ^3.310.0 - "@aws-sdk/util-stream-node": ^3.310.0 + "@aws-sdk/abort-controller": ^3.347.0 + "@aws-sdk/client-s3": ^3.350.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/types": ^3.347.0 + "@aws-sdk/util-stream-node": ^3.350.0 "@backstage/backend-app-api": "workspace:^" "@backstage/backend-dev-utils": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" @@ -4481,10 +4481,10 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/integration-aws-node@workspace:packages/integration-aws-node" dependencies: - "@aws-sdk/client-sts": ^3.310.0 - "@aws-sdk/credential-provider-node": ^3.310.0 - "@aws-sdk/credential-providers": ^3.310.0 - "@aws-sdk/types": ^3.310.0 + "@aws-sdk/client-sts": ^3.350.0 + "@aws-sdk/credential-provider-node": ^3.350.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/types": ^3.347.0 "@aws-sdk/util-arn-parser": ^3.310.0 "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -5336,13 +5336,13 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-aws@workspace:plugins/catalog-backend-module-aws" dependencies: - "@aws-sdk/client-eks": ^3.310.0 - "@aws-sdk/client-organizations": ^3.310.0 - "@aws-sdk/client-s3": ^3.310.0 - "@aws-sdk/credential-providers": ^3.310.0 - "@aws-sdk/middleware-endpoint": ^3.310.0 - "@aws-sdk/types": ^3.310.0 - "@aws-sdk/util-stream-node": ^3.310.0 + "@aws-sdk/client-eks": ^3.350.0 + "@aws-sdk/client-organizations": ^3.350.0 + "@aws-sdk/client-s3": ^3.350.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/middleware-endpoint": ^3.347.0 + "@aws-sdk/types": ^3.347.0 + "@aws-sdk/util-stream-node": ^3.350.0 "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" @@ -6621,8 +6621,8 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-events-backend-module-aws-sqs@workspace:plugins/events-backend-module-aws-sqs" dependencies: - "@aws-sdk/client-sqs": ^3.310.0 - "@aws-sdk/types": ^3.310.0 + "@aws-sdk/client-sqs": ^3.350.0 + "@aws-sdk/types": ^3.347.0 "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" @@ -7600,8 +7600,8 @@ __metadata: resolution: "@backstage/plugin-kubernetes-backend@workspace:plugins/kubernetes-backend" dependencies: "@aws-crypto/sha256-js": ^3.0.0 - "@aws-sdk/credential-providers": ^3.310.0 - "@aws-sdk/signature-v4": ^3.310.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/signature-v4": ^3.347.0 "@azure/identity": ^2.0.4 "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" @@ -9556,11 +9556,11 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-techdocs-node@workspace:plugins/techdocs-node" dependencies: - "@aws-sdk/client-s3": ^3.310.0 - "@aws-sdk/credential-providers": ^3.310.0 - "@aws-sdk/lib-storage": ^3.310.0 - "@aws-sdk/node-http-handler": ^3.310.0 - "@aws-sdk/types": ^3.310.0 + "@aws-sdk/client-s3": ^3.350.0 + "@aws-sdk/credential-providers": ^3.350.0 + "@aws-sdk/lib-storage": ^3.350.0 + "@aws-sdk/node-http-handler": ^3.350.0 + "@aws-sdk/types": ^3.347.0 "@azure/identity": ^2.1.0 "@azure/storage-blob": ^12.5.0 "@backstage/backend-common": "workspace:^" @@ -25067,14 +25067,14 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:4.1.2": - version: 4.1.2 - resolution: "fast-xml-parser@npm:4.1.2" +"fast-xml-parser@npm:4.2.4": + version: 4.2.4 + resolution: "fast-xml-parser@npm:4.2.4" dependencies: strnum: ^1.0.5 bin: fxparser: src/cli/cli.js - checksum: 6a7d1b17057f8470e70603eddfa75f990625735d068d57ece861d0154ad8d27fda63c2831d07e1ecd7e68e993738b2448925cb9277d8c0ed68009623bbcd63c6 + checksum: d3b4d0c0152c09f98def792769fca6bb3fa1d597f9745d9564451c239089bd86bdf573c9263b4944860028cb7edb81752d64399c1aff8b87c9225ecef96905f7 languageName: node linkType: hard