From f32252cdf631378a398d4afbd0d785c53535fe3a Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Wed, 26 Apr 2023 19:55:05 +0100 Subject: [PATCH 001/440] feat(catalog-backend): Add observability for catalog processing Signed-off-by: Mike Bryant Signed-off-by: Mike Bryant --- .changeset/slimy-kids-jam.md | 5 + .../DefaultCatalogProcessingEngine.ts | 320 +++++++++--------- .../DefaultCatalogProcessingOrchestrator.ts | 90 +++-- .../catalog-backend/src/util/opentelemetry.ts | 32 ++ 4 files changed, 266 insertions(+), 181 deletions(-) create mode 100644 .changeset/slimy-kids-jam.md create mode 100644 plugins/catalog-backend/src/util/opentelemetry.ts diff --git a/.changeset/slimy-kids-jam.md b/.changeset/slimy-kids-jam.md new file mode 100644 index 0000000000..ea2897bed1 --- /dev/null +++ b/.changeset/slimy-kids-jam.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Added OpenTelemetry spans for catalog processing diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index 8e2f8b2f6f..e9f87c36c7 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -23,7 +23,7 @@ import { assertError, serializeError, stringifyError } from '@backstage/errors'; import { Hash } from 'crypto'; import stableStringify from 'fast-json-stable-stringify'; import { Logger } from 'winston'; -import { metrics } from '@opentelemetry/api'; +import { metrics, SpanStatusCode, trace } from '@opentelemetry/api'; import { ProcessingDatabase, RefreshStateItem } from '../database/types'; import { createCounterMetric, createSummaryMetric } from '../util/metrics'; import { @@ -35,9 +35,12 @@ import { Stitcher } from '../stitching/Stitcher'; import { startTaskPipeline } from './TaskPipeline'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; +import { addEntityAttributes, TRACER_ID } from '../util/opentelemetry'; const CACHE_TTL = 5; +const tracer = trace.getTracer(TRACER_ID); + export type ProgressTracker = ReturnType; export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { @@ -131,177 +134,186 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { } }, processTask: async item => { - const track = this.tracker.processStart(item, this.logger); + await tracer.startActiveSpan('ProcessingRun', async span => { + const track = this.tracker.processStart(item, this.logger); + addEntityAttributes(span, item.entityRef); - try { - const { - id, - state, - unprocessedEntity, - entityRef, - locationKey, - resultHash: previousResultHash, - } = item; - const result = await this.orchestrator.process({ - entity: unprocessedEntity, - state, - }); + try { + const { + id, + state, + unprocessedEntity, + entityRef, + locationKey, + resultHash: previousResultHash, + } = item; + const result = await this.orchestrator.process({ + entity: unprocessedEntity, + state, + }); - track.markProcessorsCompleted(result); + track.markProcessorsCompleted(result); - if (result.ok) { - const { ttl: _, ...stateWithoutTtl } = state ?? {}; - if ( - stableStringify(stateWithoutTtl) !== stableStringify(result.state) - ) { + if (result.ok) { + const { ttl: _, ...stateWithoutTtl } = state ?? {}; + if ( + stableStringify(stateWithoutTtl) !== stableStringify(result.state) + ) { + await this.processingDatabase.transaction(async tx => { + await this.processingDatabase.updateEntityCache(tx, { + id, + state: { + ttl: CACHE_TTL, + ...result.state, + }, + }); + }); + } + } else { + const maybeTtl = state?.ttl; + const ttl = Number.isInteger(maybeTtl) ? (maybeTtl as number) : 0; await this.processingDatabase.transaction(async tx => { await this.processingDatabase.updateEntityCache(tx, { id, - state: { - ttl: CACHE_TTL, - ...result.state, - }, + state: ttl > 0 ? { ...state, ttl: ttl - 1 } : {}, }); }); } - } else { - const maybeTtl = state?.ttl; - const ttl = Number.isInteger(maybeTtl) ? (maybeTtl as number) : 0; - await this.processingDatabase.transaction(async tx => { - await this.processingDatabase.updateEntityCache(tx, { - id, - state: ttl > 0 ? { ...state, ttl: ttl - 1 } : {}, + + const location = + unprocessedEntity?.metadata?.annotations?.[ANNOTATION_LOCATION]; + for (const error of result.errors) { + this.logger.warn(error.message, { + entity: entityRef, + location, }); - }); - } + } + const errorsString = JSON.stringify( + result.errors.map(e => serializeError(e)), + ); - const location = - unprocessedEntity?.metadata?.annotations?.[ANNOTATION_LOCATION]; - for (const error of result.errors) { - this.logger.warn(error.message, { - entity: entityRef, - location, - }); - } - const errorsString = JSON.stringify( - result.errors.map(e => serializeError(e)), - ); + let hashBuilder = this.createHash().update(errorsString); - let hashBuilder = this.createHash().update(errorsString); - - if (result.ok) { - const { entityRefs: parents } = - await this.processingDatabase.transaction(tx => - this.processingDatabase.listParents(tx, { - entityRef, - }), - ); - - hashBuilder = hashBuilder - .update(stableStringify({ ...result.completedEntity })) - .update(stableStringify([...result.deferredEntities])) - .update(stableStringify([...result.relations])) - .update(stableStringify([...result.refreshKeys])) - .update(stableStringify([...parents])); - } - - const resultHash = hashBuilder.digest('hex'); - if (resultHash === previousResultHash) { - // If nothing changed in our produced outputs, we cannot have any - // significant effect on our surroundings; therefore, we just abort - // without any updates / stitching. - track.markSuccessfulWithNoChanges(); - return; - } - - // If the result was marked as not OK, it signals that some part of the - // processing pipeline threw an exception. This can happen both as part of - // non-catastrophic things such as due to validation errors, as well as if - // something fatal happens inside the processing for other reasons. In any - // case, this means we can't trust that anything in the output is okay. So - // just store the errors and trigger a stich so that they become visible to - // the outside. - if (!result.ok) { - // notify the error listener if the entity can not be processed. - Promise.resolve(undefined) - .then(() => - this.onProcessingError?.({ - unprocessedEntity, - errors: result.errors, - }), - ) - .catch(error => { - this.logger.debug( - `Processing error listener threw an exception, ${stringifyError( - error, - )}`, + if (result.ok) { + const { entityRefs: parents } = + await this.processingDatabase.transaction(tx => + this.processingDatabase.listParents(tx, { + entityRef, + }), ); - }); + hashBuilder = hashBuilder + .update(stableStringify({ ...result.completedEntity })) + .update(stableStringify([...result.deferredEntities])) + .update(stableStringify([...result.relations])) + .update(stableStringify([...result.refreshKeys])) + .update(stableStringify([...parents])); + } + + const resultHash = hashBuilder.digest('hex'); + if (resultHash === previousResultHash) { + // If nothing changed in our produced outputs, we cannot have any + // significant effect on our surroundings; therefore, we just abort + // without any updates / stitching. + track.markSuccessfulWithNoChanges(); + span.end(); + return; + } + + // If the result was marked as not OK, it signals that some part of the + // processing pipeline threw an exception. This can happen both as part of + // non-catastrophic things such as due to validation errors, as well as if + // something fatal happens inside the processing for other reasons. In any + // case, this means we can't trust that anything in the output is okay. So + // just store the errors and trigger a stich so that they become visible to + // the outside. + if (!result.ok) { + // notify the error listener if the entity can not be processed. + Promise.resolve(undefined) + .then(() => + this.onProcessingError?.({ + unprocessedEntity, + errors: result.errors, + }), + ) + .catch(error => { + this.logger.debug( + `Processing error listener threw an exception, ${stringifyError( + error, + )}`, + ); + }); + + await this.processingDatabase.transaction(async tx => { + await this.processingDatabase.updateProcessedEntityErrors(tx, { + id, + errors: errorsString, + resultHash, + }); + }); + await this.stitcher.stitch( + new Set([stringifyEntityRef(unprocessedEntity)]), + ); + track.markSuccessfulWithErrors(); + span.setStatus({ code: SpanStatusCode.ERROR }); + span.end(); + return; + } + + result.completedEntity.metadata.uid = id; + let oldRelationSources: Map; await this.processingDatabase.transaction(async tx => { - await this.processingDatabase.updateProcessedEntityErrors(tx, { - id, - errors: errorsString, - resultHash, - }); + const { previous } = + await this.processingDatabase.updateProcessedEntity(tx, { + id, + processedEntity: result.completedEntity, + resultHash, + errors: errorsString, + relations: result.relations, + deferredEntities: result.deferredEntities, + locationKey, + refreshKeys: result.refreshKeys, + }); + oldRelationSources = new Map( + previous.relations.map(r => [ + `${r.source_entity_ref}:${r.type}`, + r.source_entity_ref, + ]), + ); }); - await this.stitcher.stitch( - new Set([stringifyEntityRef(unprocessedEntity)]), + + const newRelationSources = new Map( + result.relations.map(relation => { + const sourceEntityRef = stringifyEntityRef(relation.source); + return [`${sourceEntityRef}:${relation.type}`, sourceEntityRef]; + }), ); - track.markSuccessfulWithErrors(); - return; + + const setOfThingsToStitch = new Set([ + stringifyEntityRef(result.completedEntity), + ]); + newRelationSources.forEach((sourceEntityRef, uniqueKey) => { + if (!oldRelationSources.has(uniqueKey)) { + setOfThingsToStitch.add(sourceEntityRef); + } + }); + oldRelationSources!.forEach((sourceEntityRef, uniqueKey) => { + if (!newRelationSources.has(uniqueKey)) { + setOfThingsToStitch.add(sourceEntityRef); + } + }); + + await this.stitcher.stitch(setOfThingsToStitch); + + track.markSuccessfulWithChanges(setOfThingsToStitch.size); + } catch (error) { + assertError(error); + track.markFailed(error); + span.recordException(error); + span.setStatus({ code: SpanStatusCode.ERROR }); } - - result.completedEntity.metadata.uid = id; - let oldRelationSources: Map; - await this.processingDatabase.transaction(async tx => { - const { previous } = - await this.processingDatabase.updateProcessedEntity(tx, { - id, - processedEntity: result.completedEntity, - resultHash, - errors: errorsString, - relations: result.relations, - deferredEntities: result.deferredEntities, - locationKey, - refreshKeys: result.refreshKeys, - }); - oldRelationSources = new Map( - previous.relations.map(r => [ - `${r.source_entity_ref}:${r.type}`, - r.source_entity_ref, - ]), - ); - }); - - const newRelationSources = new Map( - result.relations.map(relation => { - const sourceEntityRef = stringifyEntityRef(relation.source); - return [`${sourceEntityRef}:${relation.type}`, sourceEntityRef]; - }), - ); - - const setOfThingsToStitch = new Set([ - stringifyEntityRef(result.completedEntity), - ]); - newRelationSources.forEach((sourceEntityRef, uniqueKey) => { - if (!oldRelationSources.has(uniqueKey)) { - setOfThingsToStitch.add(sourceEntityRef); - } - }); - oldRelationSources!.forEach((sourceEntityRef, uniqueKey) => { - if (!newRelationSources.has(uniqueKey)) { - setOfThingsToStitch.add(sourceEntityRef); - } - }); - - await this.stitcher.stitch(setOfThingsToStitch); - - track.markSuccessfulWithChanges(setOfThingsToStitch.size); - } catch (error) { - assertError(error); - track.markFailed(error); - } + span.end(); + }); }, }); } diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index d177a7d4a8..2b4102677e 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { Span, SpanStatusCode, trace } from '@opentelemetry/api'; import { Entity, EntityPolicy, @@ -55,6 +56,9 @@ import { } from './util'; import { CatalogRulesEnforcer } from '../ingestion/CatalogRules'; import { ProcessorCacheManager } from './ProcessorCacheManager'; +import { addEntityAttributes, TRACER_ID } from '../util/opentelemetry'; + +const tracer = trace.getTracer(TRACER_ID); type Context = { entityRef: string; @@ -64,6 +68,18 @@ type Context = { cache: ProcessorCacheManager; }; +function addProcessorAttributes( + span: Span, + stage: string, + processor: CatalogProcessor, +) { + span.setAttribute('backstage.catalog.processor.stage', stage); + span.setAttribute( + 'backstage.catalog.processor.name', + processor.getProcessorName(), + ); +} + /** @public */ export class DefaultCatalogProcessingOrchestrator implements CatalogProcessingOrchestrator @@ -183,20 +199,30 @@ export class DefaultCatalogProcessingOrchestrator for (const processor of this.options.processors) { if (processor.preProcessEntity) { - try { - res = await processor.preProcessEntity( - res, - context.location, - context.collector.forProcessor(processor), - context.originLocation, - context.cache.forProcessor(processor), - ); - } catch (e) { - throw new InputError( - `Processor ${processor.constructor.name} threw an error while preprocessing`, - e, - ); - } + let innerRes = res; + res = await tracer.startActiveSpan('ProcessingStep', async span => { + addEntityAttributes(span, context.entityRef); + addProcessorAttributes(span, 'preProcessEntity', processor); + try { + innerRes = await processor.preProcessEntity!( + innerRes, + context.location, + context.collector.forProcessor(processor), + context.originLocation, + context.cache.forProcessor(processor), + ); + } catch (e) { + span.recordException(e); + span.setStatus({ code: SpanStatusCode.ERROR }); + span.end(); + throw new InputError( + `Processor ${processor.constructor.name} threw an error while preprocessing`, + e, + ); + } + span.end(); + return innerRes; + }); } } @@ -361,19 +387,29 @@ export class DefaultCatalogProcessingOrchestrator for (const processor of this.options.processors) { if (processor.postProcessEntity) { - try { - res = await processor.postProcessEntity( - res, - context.location, - context.collector.forProcessor(processor), - context.cache.forProcessor(processor), - ); - } catch (e) { - throw new InputError( - `Processor ${processor.constructor.name} threw an error while postprocessing`, - e, - ); - } + let innerRes = res; + res = await tracer.startActiveSpan('ProcessingStep', async span => { + addEntityAttributes(span, context.entityRef); + addProcessorAttributes(span, 'postProcessEntity', processor); + try { + innerRes = await processor.postProcessEntity!( + innerRes, + context.location, + context.collector.forProcessor(processor), + context.cache.forProcessor(processor), + ); + } catch (e) { + span.recordException(e); + span.setStatus({ code: SpanStatusCode.ERROR }); + span.end(); + throw new InputError( + `Processor ${processor.constructor.name} threw an error while postprocessing`, + e, + ); + } + span.end(); + return innerRes; + }); } } diff --git a/plugins/catalog-backend/src/util/opentelemetry.ts b/plugins/catalog-backend/src/util/opentelemetry.ts new file mode 100644 index 0000000000..16ec276a79 --- /dev/null +++ b/plugins/catalog-backend/src/util/opentelemetry.ts @@ -0,0 +1,32 @@ +/* + * 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 { Span, SpanStatusCode } from '@opentelemetry/api'; +import { parseEntityRef } from '@backstage/catalog-model'; + +export const TRACER_ID = 'backstage-plugin-catalog-backend'; + +export function addEntityAttributes(span: Span, entityRef: string) { + try { + const fields = parseEntityRef(entityRef); + span.setAttribute('backstage.entity.kind', fields.kind); + span.setAttribute('backstage.entity.namespace', fields.namespace); + span.setAttribute('backstage.entity.name', fields.name); + } catch (err) { + span.recordException(err); + span.setStatus({ code: SpanStatusCode.ERROR }); + } +} From c1d8f44180bf5a30eaff492d8b1f8ecf97d31241 Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 21:01:35 +0100 Subject: [PATCH 002/440] refactor: Pull out withActiveSpan to ensure we always end the span regardless of exception Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingEngine.ts | 19 ++++---- .../DefaultCatalogProcessingOrchestrator.ts | 18 +++---- .../catalog-backend/src/util/opentelemetry.ts | 47 ++++++++++++++++++- 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index e9f87c36c7..2ae104666f 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -23,7 +23,7 @@ import { assertError, serializeError, stringifyError } from '@backstage/errors'; import { Hash } from 'crypto'; import stableStringify from 'fast-json-stable-stringify'; import { Logger } from 'winston'; -import { metrics, SpanStatusCode, trace } from '@opentelemetry/api'; +import { metrics, trace } from '@opentelemetry/api'; import { ProcessingDatabase, RefreshStateItem } from '../database/types'; import { createCounterMetric, createSummaryMetric } from '../util/metrics'; import { @@ -35,7 +35,11 @@ import { Stitcher } from '../stitching/Stitcher'; import { startTaskPipeline } from './TaskPipeline'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; -import { addEntityAttributes, TRACER_ID } from '../util/opentelemetry'; +import { + addEntityAttributes, + TRACER_ID, + withActiveSpan, +} from '../util/opentelemetry'; const CACHE_TTL = 5; @@ -134,7 +138,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { } }, processTask: async item => { - await tracer.startActiveSpan('ProcessingRun', async span => { + await withActiveSpan(tracer, 'ProcessingRun', async span => { const track = this.tracker.processStart(item, this.logger); addEntityAttributes(span, item.entityRef); @@ -157,7 +161,8 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { if (result.ok) { const { ttl: _, ...stateWithoutTtl } = state ?? {}; if ( - stableStringify(stateWithoutTtl) !== stableStringify(result.state) + stableStringify(stateWithoutTtl) !== + stableStringify(result.state) ) { await this.processingDatabase.transaction(async tx => { await this.processingDatabase.updateEntityCache(tx, { @@ -216,7 +221,6 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { // significant effect on our surroundings; therefore, we just abort // without any updates / stitching. track.markSuccessfulWithNoChanges(); - span.end(); return; } @@ -255,8 +259,6 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { new Set([stringifyEntityRef(unprocessedEntity)]), ); track.markSuccessfulWithErrors(); - span.setStatus({ code: SpanStatusCode.ERROR }); - span.end(); return; } @@ -309,10 +311,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { } catch (error) { assertError(error); track.markFailed(error); - span.recordException(error); - span.setStatus({ code: SpanStatusCode.ERROR }); } - span.end(); }); }, }); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 2b4102677e..8091c6f120 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -56,7 +56,11 @@ import { } from './util'; import { CatalogRulesEnforcer } from '../ingestion/CatalogRules'; import { ProcessorCacheManager } from './ProcessorCacheManager'; -import { addEntityAttributes, TRACER_ID } from '../util/opentelemetry'; +import { + addEntityAttributes, + TRACER_ID, + withActiveSpan, +} from '../util/opentelemetry'; const tracer = trace.getTracer(TRACER_ID); @@ -200,7 +204,7 @@ export class DefaultCatalogProcessingOrchestrator for (const processor of this.options.processors) { if (processor.preProcessEntity) { let innerRes = res; - res = await tracer.startActiveSpan('ProcessingStep', async span => { + res = await withActiveSpan(tracer, 'ProcessingStep', async span => { addEntityAttributes(span, context.entityRef); addProcessorAttributes(span, 'preProcessEntity', processor); try { @@ -212,15 +216,11 @@ export class DefaultCatalogProcessingOrchestrator context.cache.forProcessor(processor), ); } catch (e) { - span.recordException(e); - span.setStatus({ code: SpanStatusCode.ERROR }); - span.end(); throw new InputError( `Processor ${processor.constructor.name} threw an error while preprocessing`, e, ); } - span.end(); return innerRes; }); } @@ -388,7 +388,7 @@ export class DefaultCatalogProcessingOrchestrator for (const processor of this.options.processors) { if (processor.postProcessEntity) { let innerRes = res; - res = await tracer.startActiveSpan('ProcessingStep', async span => { + res = await withActiveSpan(tracer, 'ProcessingStep', async span => { addEntityAttributes(span, context.entityRef); addProcessorAttributes(span, 'postProcessEntity', processor); try { @@ -399,15 +399,11 @@ export class DefaultCatalogProcessingOrchestrator context.cache.forProcessor(processor), ); } catch (e) { - span.recordException(e); - span.setStatus({ code: SpanStatusCode.ERROR }); - span.end(); throw new InputError( `Processor ${processor.constructor.name} threw an error while postprocessing`, e, ); } - span.end(); return innerRes; }); } diff --git a/plugins/catalog-backend/src/util/opentelemetry.ts b/plugins/catalog-backend/src/util/opentelemetry.ts index 16ec276a79..391869deb8 100644 --- a/plugins/catalog-backend/src/util/opentelemetry.ts +++ b/plugins/catalog-backend/src/util/opentelemetry.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Span, SpanStatusCode } from '@opentelemetry/api'; +import { Span, SpanOptions, SpanStatusCode, Tracer } from '@opentelemetry/api'; import { parseEntityRef } from '@backstage/catalog-model'; export const TRACER_ID = 'backstage-plugin-catalog-backend'; @@ -30,3 +30,48 @@ export function addEntityAttributes(span: Span, entityRef: string) { span.setStatus({ code: SpanStatusCode.ERROR }); } } + +// Adapted from https://github.com/open-telemetry/opentelemetry-js/blob/359fbcc40a859057a02b14e84599eac399b8dba7/api/src/trace/SugaredTracer.ts +// While waiting for something like https://github.com/open-telemetry/opentelemetry-js/pull/3317 to land upstream + +const onException = (e: Error, span: Span) => { + span.recordException(e); + span.setStatus({ + code: SpanStatusCode.ERROR, + }); +}; + +function handleFn ReturnType>( + span: Span, + fn: F, +): ReturnType { + try { + const ret = fn(span) as Promise>; + // if fn is an async function attach a recordException and spanEnd callback to the promise + if (typeof ret.then === 'function' && typeof ret.catch === 'function') { + return ret + .catch((e: Error) => { + onException(e, span); + throw e; + }) + .finally(() => span.end()) as ReturnType; + } + span.end(); + return ret as ReturnType; + } catch (e) { + onException(e, span); + span.end(); + throw e; + } +} + +export function withActiveSpan ReturnType>( + tracer: Tracer, + name: string, + fn: F, + spanOptions: SpanOptions = {}, +): ReturnType { + return tracer.startActiveSpan(name, spanOptions, (span: Span) => { + return handleFn(span, fn); + }); +} From db2cac67450cd75c95ce1ed761b2c6f0993f7bde Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 21:06:51 +0100 Subject: [PATCH 003/440] feat: Add ProcessingStage span Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingOrchestrator.ts | 112 ++++++++++-------- 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 8091c6f120..8b4f4127f3 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -199,34 +199,41 @@ export class DefaultCatalogProcessingOrchestrator entity: Entity, context: Context, ): Promise { - let res = entity; + return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { + addEntityAttributes(stageSpan, context.entityRef); + stageSpan.setAttribute( + 'backstage.catalog.processor.stage', + 'preProcessEntity', + ); + let res = entity; - for (const processor of this.options.processors) { - if (processor.preProcessEntity) { - let innerRes = res; - res = await withActiveSpan(tracer, 'ProcessingStep', async span => { - addEntityAttributes(span, context.entityRef); - addProcessorAttributes(span, 'preProcessEntity', processor); - try { - innerRes = await processor.preProcessEntity!( - innerRes, - context.location, - context.collector.forProcessor(processor), - context.originLocation, - context.cache.forProcessor(processor), - ); - } catch (e) { - throw new InputError( - `Processor ${processor.constructor.name} threw an error while preprocessing`, - e, - ); - } - return innerRes; - }); + for (const processor of this.options.processors) { + if (processor.preProcessEntity) { + let innerRes = res; + res = await withActiveSpan(tracer, 'ProcessingStep', async span => { + addEntityAttributes(span, context.entityRef); + addProcessorAttributes(span, 'preProcessEntity', processor); + try { + innerRes = await processor.preProcessEntity!( + innerRes, + context.location, + context.collector.forProcessor(processor), + context.originLocation, + context.cache.forProcessor(processor), + ); + } catch (e) { + throw new InputError( + `Processor ${processor.constructor.name} threw an error while preprocessing`, + e, + ); + } + return innerRes; + }); + } } - } - return res; + return res; + }); } /** @@ -383,32 +390,39 @@ export class DefaultCatalogProcessingOrchestrator entity: Entity, context: Context, ): Promise { - let res = entity; + return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { + addEntityAttributes(stageSpan, context.entityRef); + stageSpan.setAttribute( + 'backstage.catalog.processor.stage', + 'postProcessEntity', + ); + let res = entity; - for (const processor of this.options.processors) { - if (processor.postProcessEntity) { - let innerRes = res; - res = await withActiveSpan(tracer, 'ProcessingStep', async span => { - addEntityAttributes(span, context.entityRef); - addProcessorAttributes(span, 'postProcessEntity', processor); - try { - innerRes = await processor.postProcessEntity!( - innerRes, - context.location, - context.collector.forProcessor(processor), - context.cache.forProcessor(processor), - ); - } catch (e) { - throw new InputError( - `Processor ${processor.constructor.name} threw an error while postprocessing`, - e, - ); - } - return innerRes; - }); + for (const processor of this.options.processors) { + if (processor.postProcessEntity) { + let innerRes = res; + res = await withActiveSpan(tracer, 'ProcessingStep', async span => { + addEntityAttributes(span, context.entityRef); + addProcessorAttributes(span, 'postProcessEntity', processor); + try { + innerRes = await processor.postProcessEntity!( + innerRes, + context.location, + context.collector.forProcessor(processor), + context.cache.forProcessor(processor), + ); + } catch (e) { + throw new InputError( + `Processor ${processor.constructor.name} threw an error while postprocessing`, + e, + ); + } + return innerRes; + }); + } } - } - return res; + return res; + }); } } From dae8956754cad162bf20f49c50a62b65be87e4ac Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 21:15:41 +0100 Subject: [PATCH 004/440] feat: Add tracing to validate stage Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingOrchestrator.ts | 85 +++++++++++-------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 8b4f4127f3..aabe703806 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -269,50 +269,65 @@ export class DefaultCatalogProcessingOrchestrator entity: Entity, context: Context, ): Promise { - // Double check that none of the previous steps tried to change something - // related to the entity ref, which would break downstream - if (stringifyEntityRef(entity) !== context.entityRef) { - throw new ConflictError( - 'Fatal: The entity kind, namespace, or name changed during processing', + return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { + addEntityAttributes(stageSpan, context.entityRef); + stageSpan.setAttribute( + 'backstage.catalog.processor.stage', + 'validateEntity', ); - } + // Double check that none of the previous steps tried to change something + // related to the entity ref, which would break downstream + if (stringifyEntityRef(entity) !== context.entityRef) { + throw new ConflictError( + 'Fatal: The entity kind, namespace, or name changed during processing', + ); + } - // Validate that the end result is a valid Entity at all - try { - validateEntity(entity); - } catch (e) { - throw new ConflictError( - `Entity envelope for ${context.entityRef} failed validation after preprocessing`, - e, - ); - } + // Validate that the end result is a valid Entity at all + try { + validateEntity(entity); + } catch (e) { + throw new ConflictError( + `Entity envelope for ${context.entityRef} failed validation after preprocessing`, + e, + ); + } - let valid = false; + let valid = false; - for (const processor of this.options.processors) { - if (processor.validateEntityKind) { - try { - const thisValid = await processor.validateEntityKind(entity); - if (thisValid) { - valid = true; - if (this.options.legacySingleProcessorValidation) { - break; + for (const processor of this.options.processors) { + if (processor.validateEntityKind) { + try { + const thisValid = await withActiveSpan( + tracer, + 'ProcessingStep', + async span => { + addEntityAttributes(span, context.entityRef); + addProcessorAttributes(span, 'postProcessEntity', processor); + return await processor.validateEntityKind(entity); + }, + ); + if (thisValid) { + valid = true; + if (this.options.legacySingleProcessorValidation) { + break; + } } + } catch (e) { + throw new InputError( + `Processor ${processor.constructor.name} threw an error while validating the entity ${context.entityRef}`, + e, + ); } - } catch (e) { - throw new InputError( - `Processor ${processor.constructor.name} threw an error while validating the entity ${context.entityRef}`, - e, - ); } } - } - if (!valid) { - throw new InputError( - `No processor recognized the entity ${context.entityRef} as valid, possibly caused by a foreign kind or apiVersion`, - ); - } + if (!valid) { + throw new InputError( + `No processor recognized the entity ${context.entityRef} as valid, possibly caused by a foreign kind or apiVersion`, + ); + } + }); } /** From 9550ae9ad4378b850f3c4c922244eace5b1c3d2c Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 21:19:11 +0100 Subject: [PATCH 005/440] feat: Add span for policy stage Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingOrchestrator.ts | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index aabe703806..6fa44db1a6 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -240,26 +240,33 @@ export class DefaultCatalogProcessingOrchestrator * Enforce entity policies making sure that entities conform to a general schema */ private async runPolicyStep(entity: Entity): Promise { - let policyEnforcedEntity: Entity | undefined; - - try { - policyEnforcedEntity = await this.options.policy.enforce(entity); - } catch (e) { - throw new InputError( - `Policy check failed for ${stringifyEntityRef(entity)}`, - e, + return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { + addEntityAttributes(stageSpan, stringifyEntityRef(entity)); + stageSpan.setAttribute( + 'backstage.catalog.processor.stage', + 'enforcePolicyEntity', ); - } + let policyEnforcedEntity: Entity | undefined; - if (!policyEnforcedEntity) { - throw new Error( - `Policy unexpectedly returned no data for ${stringifyEntityRef( - entity, - )}`, - ); - } + try { + policyEnforcedEntity = await this.options.policy.enforce(entity); + } catch (e) { + throw new InputError( + `Policy check failed for ${stringifyEntityRef(entity)}`, + e, + ); + } - return policyEnforcedEntity; + if (!policyEnforcedEntity) { + throw new Error( + `Policy unexpectedly returned no data for ${stringifyEntityRef( + entity, + )}`, + ); + } + + return policyEnforcedEntity; + }); } /** From bb5ab706d7e6d8413bf74d7243e5de70a5331e47 Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 21:24:50 +0100 Subject: [PATCH 006/440] feat: Add spans for read steps Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingOrchestrator.ts | 122 ++++++++++-------- 1 file changed, 69 insertions(+), 53 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 6fa44db1a6..91a1c2f9a6 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -344,65 +344,81 @@ export class DefaultCatalogProcessingOrchestrator entity: LocationEntity, context: Context, ): Promise { - const { type = context.location.type, presence = 'required' } = entity.spec; - const targets = new Array(); - if (entity.spec.target) { - targets.push(entity.spec.target); - } - if (entity.spec.targets) { - targets.push(...entity.spec.targets); - } - - for (const maybeRelativeTarget of targets) { - if (type === 'file' && maybeRelativeTarget.endsWith(path.sep)) { - context.collector.generic()( - processingResult.inputError( - context.location, - `LocationEntityProcessor cannot handle ${type} type location with target ${context.location.target} that ends with a path separator`, - ), - ); - continue; - } - const target = toAbsoluteUrl( - this.options.integrations, - context.location, - type, - maybeRelativeTarget, + return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { + addEntityAttributes(stageSpan, context.entityRef); + stageSpan.setAttribute( + 'backstage.catalog.processor.stage', + 'readLocationEntity', ); + const { type = context.location.type, presence = 'required' } = + entity.spec; + const targets = new Array(); + if (entity.spec.target) { + targets.push(entity.spec.target); + } + if (entity.spec.targets) { + targets.push(...entity.spec.targets); + } - let didRead = false; - for (const processor of this.options.processors) { - if (processor.readLocation) { - try { - const read = await processor.readLocation( - { - type, - target, - presence, - }, - presence === 'optional', - context.collector.forProcessor(processor), - this.options.parser, - context.cache.forProcessor(processor, target), - ); - if (read) { - didRead = true; - break; + for (const maybeRelativeTarget of targets) { + if (type === 'file' && maybeRelativeTarget.endsWith(path.sep)) { + context.collector.generic()( + processingResult.inputError( + context.location, + `LocationEntityProcessor cannot handle ${type} type location with target ${context.location.target} that ends with a path separator`, + ), + ); + continue; + } + const target = toAbsoluteUrl( + this.options.integrations, + context.location, + type, + maybeRelativeTarget, + ); + + let didRead = false; + for (const processor of this.options.processors) { + if (processor.readLocation) { + try { + const read = await withActiveSpan( + tracer, + 'ProcessingStep', + async span => { + addEntityAttributes(span, context.entityRef); + addProcessorAttributes(span, 'readLocationEntity', processor); + return await processor.readLocation( + { + type, + target, + presence, + }, + presence === 'optional', + context.collector.forProcessor(processor), + this.options.parser, + context.cache.forProcessor(processor, target), + ); + }, + ); + if (read) { + didRead = true; + break; + } + } catch (e) { + throw new InputError( + `Processor ${processor.constructor.name} threw an error while reading ${type}:${target}`, + e, + ); } - } catch (e) { - throw new InputError( - `Processor ${processor.constructor.name} threw an error while reading ${type}:${target}`, - e, - ); } } + if (!didRead) { + throw new InputError( + `No processor was able to handle reading of ${type}:${target}`, + ); + } } - if (!didRead) { - throw new InputError( - `No processor was able to handle reading of ${type}:${target}`, - ); - } - } + }); } /** From 5060c6ed7d04b9875a4c50b37a5b33d467e45a69 Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 22:52:00 +0100 Subject: [PATCH 007/440] fix: Fix tsc errors Signed-off-by: Mike Bryant --- .../src/processing/DefaultCatalogProcessingOrchestrator.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 91a1c2f9a6..dfca5d2058 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Span, SpanStatusCode, trace } from '@opentelemetry/api'; +import { Span, trace } from '@opentelemetry/api'; import { Entity, EntityPolicy, @@ -311,7 +311,7 @@ export class DefaultCatalogProcessingOrchestrator async span => { addEntityAttributes(span, context.entityRef); addProcessorAttributes(span, 'postProcessEntity', processor); - return await processor.validateEntityKind(entity); + return await processor.validateEntityKind!(entity); }, ); if (thisValid) { @@ -387,7 +387,7 @@ export class DefaultCatalogProcessingOrchestrator async span => { addEntityAttributes(span, context.entityRef); addProcessorAttributes(span, 'readLocationEntity', processor); - return await processor.readLocation( + return await processor.readLocation!( { type, target, From ee48005f1871de089ec9eedb85faf0caf3290b5f Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Thu, 18 May 2023 23:15:24 +0100 Subject: [PATCH 008/440] fix: Supply objects that satisfy the type constraints in tests Signed-off-by: Mike Bryant --- .../processing/DefaultCatalogProcessingOrchestrator.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts index ceb6992d7a..fc6855f6df 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts @@ -194,10 +194,12 @@ describe('DefaultCatalogProcessingOrchestrator', () => { it('runs all processor validations when asked to', async () => { const validate = jest.fn(async () => true); - const processor1: Partial = { + const processor1: CatalogProcessor = { + getProcessorName: () => 'processor1', validateEntityKind: validate, }; - const processor2: Partial = { + const processor2: CatalogProcessor = { + getProcessorName: () => 'processor2', validateEntityKind: validate, }; From b5de6d107f026d9ab7bae72d7c6ce665f92570fc Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 2 Jun 2023 10:15:35 -0400 Subject: [PATCH 009/440] chore: Replace deprecated imports Signed-off-by: Adam Harvey --- docs/features/search/how-to-guides.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index 7de37cb624..382221d781 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -51,7 +51,7 @@ The TechDocs plugin has supported integrations to Search, meaning that it provides a default collator factory ready to be used. The purpose of this guide is to walk you through how to register the -[DefaultTechDocsCollatorFactory](https://github.com/backstage/backstage/blob/de294ce5c410c9eb56da6870a1fab795268f60e3/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.ts) +[DefaultTechDocsCollatorFactory](https://github.com/backstage/backstage/blob/1adc2c7/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts) in your App, so that you can get TechDocs documents indexed. If you have been through the @@ -61,10 +61,10 @@ so, you can go ahead and follow this guide - if not, start by going through the getting started guide. 1. Import the `DefaultTechDocsCollatorFactory` from - `@backstage/plugin-techdocs-backend`. + `@backstage/plugin-search-backend-module-techdocs`. ```typescript - import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend'; + import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs'; ``` 2. If there isn't an existing schedule you'd like to run the collator on, be From a0303ee5ef95977dca3c8dbbe98b287af82c1ddb Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Wed, 7 Jun 2023 03:46:41 +0200 Subject: [PATCH 010/440] scaffolder: enable each property on task step (#8890) Signed-off-by: Alex Eftimie --- .../tasks/NunjucksWorkflowRunner.test.ts | 33 +++++++++ .../tasks/NunjucksWorkflowRunner.ts | 70 ++++++++++++++----- plugins/scaffolder-common/src/TaskSpec.ts | 6 +- plugins/scaffolder-node/src/actions/types.ts | 5 ++ 4 files changed, 94 insertions(+), 20 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 5d4f7b73cc..8fbbd45b94 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -573,6 +573,39 @@ describe('DefaultWorkflowRunner', () => { }); }); + describe('each', () => { + it('should run a step repeatedly', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + each: '${{parameters.colors}}', + action: 'jest-mock-action', + input: { color: '${{each}}' }, + }, + ], + output: {}, + parameters: { + colors: ['blue', 'green', 'red'], + }, + }); + + await runner.execute(task); + + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ input: { color: 'blue' } }), + ); + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ input: { color: 'green' } }), + ); + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ input: { color: 'red' } }), + ); + }); + }); + describe('secrets', () => { it('should pass through the secrets to the context', async () => { const task = createMockTaskWithSpec( diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index da690bcb82..e3233483ef 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -76,6 +76,7 @@ type TemplateContext = { entity?: UserEntity; ref?: string; }; + each?: JsonValue; }; const isValidTaskSpec = (taskSpec: TaskSpec): taskSpec is TaskSpecV1beta3 => { @@ -311,25 +312,56 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { const tmpDirs = new Array(); const stepOutput: { [outputName: string]: JsonValue } = {}; - await action.handler({ - input, - secrets: task.secrets ?? {}, - logger: taskLogger, - logStream: streamLogger, - workspacePath, - createTemporaryDirectory: async () => { - const tmpDir = await fs.mkdtemp(`${workspacePath}_step-${step.id}-`); - tmpDirs.push(tmpDir); - return tmpDir; - }, - output(name: string, value: JsonValue) { - stepOutput[name] = value; - }, - templateInfo: task.spec.templateInfo, - user: task.spec.user, - isDryRun: task.isDryRun, - signal: task.cancelSignal, - }); + const iterations = new Array(); + if (step.each) { + const each = await this.render(step.each, context, renderTemplate); + iterations.push(...each); + } else { + iterations.push({}); + } + + let actionInput = input; + for (const iteration of iterations) { + if (step.each) { + taskLogger.info(`Running step each: ${iteration}`); + context.each = iteration; + // re-render input with the modified context that includes each + actionInput = + (step.input && + this.render( + step.input, + { ...context, secrets: task.secrets ?? {} }, + renderTemplate, + )) ?? + {}; + } + await action.handler({ + input: actionInput, + secrets: task.secrets ?? {}, + logger: taskLogger, + logStream: streamLogger, + workspacePath, + createTemporaryDirectory: async () => { + const tmpDir = await fs.mkdtemp( + `${workspacePath}_step-${step.id}-`, + ); + tmpDirs.push(tmpDir); + return tmpDir; + }, + output(name: string, value: JsonValue) { + if (step.each) { + stepOutput[name] = stepOutput[name] || []; + stepOutput[name].push(value); + } else { + stepOutput[name] = value; + } + }, + templateInfo: task.spec.templateInfo, + user: task.spec.user, + isDryRun: task.isDryRun, + signal: task.cancelSignal, + }); + } // Remove all temporary directories that were created when executing the action for (const tmpDir of tmpDirs) { diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index 7c06fe2b99..6b144b4f78 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -15,7 +15,7 @@ */ import type { EntityMeta, UserEntity } from '@backstage/catalog-model'; -import type { JsonObject, JsonValue } from '@backstage/types'; +import type { JsonArray, JsonObject, JsonValue } from '@backstage/types'; /** * Information about a template that is stored on a task specification. @@ -70,6 +70,10 @@ export interface TaskStep { * When this is false, or if the templated value string evaluates to something that is falsy the step will be skipped. */ if?: string | boolean; + /** + * Run step repeatedly + */ + each?: string | JsonArray; } /** diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index e35f55aa67..7e8c2b4f5f 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -71,6 +71,11 @@ export type ActionContext< * Implement the signal to make your custom step abortable https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal */ signal?: AbortSignal; + + /** + * Optional value of each invocation + */ + each?: JsonObject; }; /** @public */ From e514aac3eac0e3b730d8bef4077f84fb1fcd6303 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Sun, 11 Jun 2023 23:54:41 +0200 Subject: [PATCH 011/440] Add .changeset Signed-off-by: Alex Eftimie --- .changeset/tasty-lamps-shop.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/tasty-lamps-shop.md diff --git a/.changeset/tasty-lamps-shop.md b/.changeset/tasty-lamps-shop.md new file mode 100644 index 0000000000..5036932816 --- /dev/null +++ b/.changeset/tasty-lamps-shop.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +'@backstage/plugin-scaffolder-common': minor +'@backstage/plugin-scaffolder-node': minor +--- + +Introduce `each` property on action steps, allowing them to be ran repeatedly. From 0f58402454bd6a089f0a06741a3afea4cd9c0aed Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Mon, 12 Jun 2023 00:08:07 +0200 Subject: [PATCH 012/440] Update docs. Fix tsc Signed-off-by: Alex Eftimie --- .../software-templates/writing-templates.md | 22 +++++++++++++++++++ .../tasks/NunjucksWorkflowRunner.ts | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index 67bcb6c179..81418faf21 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -495,6 +495,7 @@ template. These follow the same standard format: - id: fetch-base # A unique id for the step name: Fetch Base # A title displayed in the frontend if: ${{ parameters.name }} # Optional condition, skip the step if not truthy + each: ${{ parameters.iterable }} # Optional iterable, run the same step multiple times action: fetch:template # An action to call input: # Input that is passed as arguments to the action handler url: ./template @@ -506,6 +507,27 @@ By default we ship some [built in actions](./builtin-actions.md) that you can take a look at, or you can [create your own custom actions](./writing-custom-actions.md). +When `each` is provided, the current iteration value is available in the `${{ each }}` input. + +Examples: + +```yaml +each: ['apples', 'oranges'] +input: + values: + fruit: ${{ each}} +``` + +```yaml +each: [{ name: 'apple', count: 3 }, { name: 'orange', count: 1 }] +input: + values: + fruit: ${{ each.name }} + count: ${{ each.count }} +``` + +When `each` is used, the outputs of a repeated step are returned as an array of outputs from each iteration. + ## Outputs Each individual step can output some variables that can be used in the diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index e3233483ef..a6c486c58d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -25,7 +25,7 @@ import * as winston from 'winston'; import fs from 'fs-extra'; import path from 'path'; import nunjucks from 'nunjucks'; -import { JsonObject, JsonValue } from '@backstage/types'; +import { JsonArray, JsonObject, JsonValue } from '@backstage/types'; import { InputError, NotAllowedError } from '@backstage/errors'; import { PassThrough } from 'stream'; import { generateExampleOutput, isTruthy } from './helper'; @@ -351,7 +351,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { output(name: string, value: JsonValue) { if (step.each) { stepOutput[name] = stepOutput[name] || []; - stepOutput[name].push(value); + (stepOutput[name] as JsonArray).push(value); } else { stepOutput[name] = value; } From 6a754699b43e1387289fbce751224b8405b2fb61 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Mon, 12 Jun 2023 00:21:40 +0200 Subject: [PATCH 013/440] Update api-report Signed-off-by: Alex Eftimie --- plugins/scaffolder-common/api-report.md | 2 ++ plugins/scaffolder-node/api-report.md | 1 + 2 files changed, 3 insertions(+) diff --git a/plugins/scaffolder-common/api-report.md b/plugins/scaffolder-common/api-report.md index 7c40780b57..6113c72659 100644 --- a/plugins/scaffolder-common/api-report.md +++ b/plugins/scaffolder-common/api-report.md @@ -5,6 +5,7 @@ ```ts import { Entity } from '@backstage/catalog-model'; import type { EntityMeta } from '@backstage/catalog-model'; +import type { JsonArray } from '@backstage/types'; import { JsonObject } from '@backstage/types'; import type { JsonValue } from '@backstage/types'; import { KindValidator } from '@backstage/catalog-model'; @@ -36,6 +37,7 @@ export interface TaskSpecV1beta3 { // @public export interface TaskStep { action: string; + each?: string | JsonArray; id: string; if?: string | boolean; input?: JsonObject; diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 46aba960d8..962daca2ad 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -36,6 +36,7 @@ export type ActionContext< ref?: string; }; signal?: AbortSignal; + each?: JsonObject; }; // @public From f40c8ac5347c0bd145eb1f7c0dc978d9c17f0148 Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Tue, 13 Jun 2023 23:33:50 +0100 Subject: [PATCH 014/440] style: Apply review comments Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingOrchestrator.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index dfca5d2058..98f9cd32a5 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -201,10 +201,7 @@ export class DefaultCatalogProcessingOrchestrator ): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { addEntityAttributes(stageSpan, context.entityRef); - stageSpan.setAttribute( - 'backstage.catalog.processor.stage', - 'preProcessEntity', - ); + stageSpan.setAttribute('backstage.catalog.processor.stage', 'preProcess'); let res = entity; for (const processor of this.options.processors) { @@ -244,7 +241,7 @@ export class DefaultCatalogProcessingOrchestrator addEntityAttributes(stageSpan, stringifyEntityRef(entity)); stageSpan.setAttribute( 'backstage.catalog.processor.stage', - 'enforcePolicyEntity', + 'enforcePolicy', ); let policyEnforcedEntity: Entity | undefined; @@ -278,10 +275,7 @@ export class DefaultCatalogProcessingOrchestrator ): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { addEntityAttributes(stageSpan, context.entityRef); - stageSpan.setAttribute( - 'backstage.catalog.processor.stage', - 'validateEntity', - ); + stageSpan.setAttribute('backstage.catalog.processor.stage', 'validate'); // Double check that none of the previous steps tried to change something // related to the entity ref, which would break downstream if (stringifyEntityRef(entity) !== context.entityRef) { @@ -310,7 +304,7 @@ export class DefaultCatalogProcessingOrchestrator 'ProcessingStep', async span => { addEntityAttributes(span, context.entityRef); - addProcessorAttributes(span, 'postProcessEntity', processor); + addProcessorAttributes(span, 'validateEntityKind', processor); return await processor.validateEntityKind!(entity); }, ); @@ -348,7 +342,7 @@ export class DefaultCatalogProcessingOrchestrator addEntityAttributes(stageSpan, context.entityRef); stageSpan.setAttribute( 'backstage.catalog.processor.stage', - 'readLocationEntity', + 'readLocation', ); const { type = context.location.type, presence = 'required' } = entity.spec; @@ -386,7 +380,7 @@ export class DefaultCatalogProcessingOrchestrator 'ProcessingStep', async span => { addEntityAttributes(span, context.entityRef); - addProcessorAttributes(span, 'readLocationEntity', processor); + addProcessorAttributes(span, 'readLocation', processor); return await processor.readLocation!( { type, From ab51b0c9aee7ee298b99f32aedba573f251e49ee Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Wed, 14 Jun 2023 00:09:02 +0100 Subject: [PATCH 015/440] style: Apply review comments Signed-off-by: Mike Bryant --- .changeset/slimy-kids-jam.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/slimy-kids-jam.md b/.changeset/slimy-kids-jam.md index ea2897bed1..c02daf325e 100644 --- a/.changeset/slimy-kids-jam.md +++ b/.changeset/slimy-kids-jam.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-catalog-backend': minor --- Added OpenTelemetry spans for catalog processing From d440f1dd0e7277af76ee4df0f60010b574e1cbb7 Mon Sep 17 00:00:00 2001 From: Brian Forbis Date: Sat, 17 Jun 2023 17:52:25 -0400 Subject: [PATCH 016/440] Add linguist tags processor Signed-off-by: Brian Forbis --- .changeset/large-badgers-switch.md | 5 + .changeset/strange-shrimps-mix.md | 5 + plugins/linguist-backend/README.md | 126 +++- plugins/linguist-backend/api-report.md | 41 + plugins/linguist-backend/config.d.ts | 46 ++ plugins/linguist-backend/package.json | 6 +- plugins/linguist-backend/src/index.ts | 1 + .../processor/LinguistTagsProcessor.test.ts | 343 +++++++++ .../src/processor/LinguistTagsProcessor.ts | 269 +++++++ .../LinguistTagsProcessor.test.ts.snap | 707 ++++++++++++++++++ .../linguist-backend/src/processor/index.ts | 20 + plugins/linguist-common/api-report.md | 5 +- plugins/linguist-common/src/types.ts | 5 +- yarn.lock | 2 + 14 files changed, 1577 insertions(+), 4 deletions(-) create mode 100644 .changeset/large-badgers-switch.md create mode 100644 .changeset/strange-shrimps-mix.md create mode 100644 plugins/linguist-backend/config.d.ts create mode 100644 plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts create mode 100644 plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts create mode 100644 plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap create mode 100644 plugins/linguist-backend/src/processor/index.ts diff --git a/.changeset/large-badgers-switch.md b/.changeset/large-badgers-switch.md new file mode 100644 index 0000000000..47c06a4afe --- /dev/null +++ b/.changeset/large-badgers-switch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-linguist-common': patch +--- + +Exported new LanguageType type alias diff --git a/.changeset/strange-shrimps-mix.md b/.changeset/strange-shrimps-mix.md new file mode 100644 index 0000000000..fbb08eeeb6 --- /dev/null +++ b/.changeset/strange-shrimps-mix.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-linguist-backend': minor +--- + +Adds a processor to the linguist backend which can automatically add language tags to entities diff --git a/plugins/linguist-backend/README.md b/plugins/linguist-backend/README.md index 6e2a20cf2d..7bca98191b 100644 --- a/plugins/linguist-backend/README.md +++ b/plugins/linguist-backend/README.md @@ -1,6 +1,6 @@ # Linguist Backend -Welcome to the Linguist backend plugin! This plugin provides data for the Linguist frontend features. +Welcome to the Linguist backend plugin! This plugin provides data for the Linguist frontend features. Additionally, it provides an optional entity processor which will automate adding language tags to your entities. ## Setup @@ -144,6 +144,130 @@ return createRouter( **Note:** This has the potential to cause a lot of processing, be very thoughtful about this before hand +## Linguist Tags Processor + +The `LinguistTagsProcessor` can be added into your catalog builder as a way to incorporate the language breakdown from linguist as `metadata.tags` on your entities. Doing so enables the ability to easily filter for entities in your catalog index based on the language of the source repository. + +### Processor Setup + +Setup the linguist tag processor in `packages/backend/src/plugins/catalog.ts`. + +```ts +import { LinguistTagsProcessor } from '@backstage/plugin-linguist-backend'; +// ... +export default async function createPlugin( + // ... + builder.addProcessor( + LinguistTagsProcessor.fromConfig(env.config, { + logger: env.logger, + discovery: env.discovery, + }) + ); +``` + +### Processor Options + +The processor accepts configurations either directly as options when constructing using `fromConfig()`, or can also be configured in `app-config.yaml` with the same fields. + +Example linguist processor configuration: + +```yaml +linguist: + tagsProcessor: + bytesThreshold: 1000 + languageTypes: ['programming', 'markup'] + languageMap: + Dockerfile: '' + TSX: 'react' + cacheTTL: + hours: 24 +``` + +#### `languageMap` + +The `languageMap` option allows you to build a custom map of linguist languages to how you want them to show up as tags. The keys should be exact matches to languages in the [linguist dataset](https://github.com/github-linguist/linguist/blob/master/lib/linguist/languages.yml) and the values should be how they render as backstage tags. These values will be used "as is" and will not be further transformed. + +Keep in mind that backstage has [character requirements for tags](https://backstage.io/docs/features/software-catalog/descriptor-format#tags-optional). If your map emits an invalid tag, it will cause an error during processing and your entity will not be processed. + +If you map a key to `''`, it will not be emitted as a tag. This can be useful if you want to ignore some of the linguist languages. + +```yaml +linguist: + tagsProcessor: + languageMap: + # You don't want dockerfile to show up as a tag + Dockerfile: '' + # Be more specific about what the file is + HCL: terraform + # A more casual tag for a formal name + Protocol Buffer: protobuf +``` + +#### `cacheTTL` + +The `cacheTTL` option allows you to determine for how long this processor will cache languages for an `entityRef` before refreshing from the linguist backend. As this processor will run continuously, this cache is supplied to limit the load done on the linguist DB and API. + +By default, this processor will cache languages for 30 minutes before refreshing from the linguist database. + +You can optionally disable the cache entirely by passing in a `cacheTTL` duration of 0 minutes. + +```yaml +linguist: + tagsProcessor: + cacheTTL: { minutes: 0 } +``` + +#### `bytesThreshold` + +The `bytesThreshold` option allows you to control a number of bytes threshold which must be surpassed before a language tag will be emitted by this processor. As an example, some repositories may have short build scripts written in Bash, but you may only want the main language of the project emitted (an alternate way to control this is to use the `languageMap` to map `Shell` languages to `undefined`). + +```yaml +linguist: + tagsProcessor: + # Ignore languages with less than 5000 bytes in a repo. + bytesThreshold: 5000 +``` + +#### `languageTypes` + +The `languageTypes` option allows you to control what categories of linguist languages are automatically added as tags. By default, this will only include language tags of type `programming`, but you can pass in a custom array here to allow adding other language types. + +You can see the full breakdown of linguist supported languages [in their repo](https://github.com/github-linguist/linguist/blob/master/lib/linguist/languages.yml). + +For example, you may want to also include languages of type `data` + +```yaml +linguist: + tagsProcessor: + languageTypes: + - programming + - data +``` + +#### `shouldProcessEntity` + +The `shouldProcessEntity` is a function you can pass into the processor which determines which entities should have language tags fetched from linguist and added to the entity. By default, this will only run on entities of `kind: Component`, however this function let's you fully customize which entities should be processed. + +As an example, you may choose to extend this to support both `Component` and `Resource` kinds along with allowing an opt-in annotation on the entity which entity authors can use. + +As this option is a function, it cannot be configured in `app-config.yaml`. You must pass this as an option within typescript. + +```ts +LinguistLanguageTagsProcessor.fromConfig(env.config, { + logger: env.logger, + discovery: env.discovery, + shouldProcessEntity: (entity: Entity) => { + if ( + ['Component', 'Resource'].includes(entity.kind) && + entity.metadata.annotations?.['some-custom-annotation'] + ) { + return true; + } + return false; + }, +}); +``` + ## Links - [Frontend part of the plugin](https://github.com/backstage/backstage/tree/master/plugins/linguist) diff --git a/plugins/linguist-backend/api-report.md b/plugins/linguist-backend/api-report.md index cd2c9cb3f3..aac978e426 100644 --- a/plugins/linguist-backend/api-report.md +++ b/plugins/linguist-backend/api-report.md @@ -4,9 +4,15 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorCache } from '@backstage/plugin-catalog-node'; +import { Config } from '@backstage/config'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; +import { Entity } from '@backstage/catalog-model'; import express from 'express'; import { HumanDuration } from '@backstage/types'; import { Languages } from '@backstage/plugin-linguist-common'; +import { LanguageType } from '@backstage/plugin-linguist-common'; import { Logger } from 'winston'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; @@ -48,6 +54,38 @@ export interface LinguistPluginOptions { useSourceLocation?: boolean; } +// @public +export class LinguistTagsProcessor implements CatalogProcessor { + constructor(options: LinguistTagsProcessorOptions); + // (undocumented) + static fromConfig( + config: Config, + options: LinguistTagsProcessorOptions, + ): LinguistTagsProcessor; + // (undocumented) + getProcessorName(): string; + preProcessEntity( + entity: Entity, + _: any, + __: any, + ___: any, + cache: CatalogProcessorCache, + ): Promise; +} + +// @public +export interface LinguistTagsProcessorOptions { + bytesThreshold?: number; + cacheTTL?: HumanDuration; + // (undocumented) + discovery: DiscoveryService; + languageMap?: Record; + languageTypes?: LanguageType[]; + // (undocumented) + logger: Logger; + shouldProcessEntity?: ShouldProcessEntity; +} + // @public (undocumented) export interface PluginOptions { // (undocumented) @@ -81,4 +119,7 @@ export interface RouterOptions { // (undocumented) tokenManager: TokenManager; } + +// @public +export type ShouldProcessEntity = (entity: Entity) => boolean; ``` diff --git a/plugins/linguist-backend/config.d.ts b/plugins/linguist-backend/config.d.ts new file mode 100644 index 0000000000..5faf28fb1d --- /dev/null +++ b/plugins/linguist-backend/config.d.ts @@ -0,0 +1,46 @@ +/* + * 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 { HumanDuration } from '@backstage/types'; + +export interface Config { + /** Configuration options for the linguist plugin */ + linguist?: { + /** Options for the tags processor */ + tagsProcessor?: { + /** + * Determines how many bytes of a language should be in a repo + * for it to be added as an entity tag. Defaults to 0. + */ + bytesThreshold?: number; + /** + * The types of linguist languages that should be processed. Can be + * any of "programming", "data", "markup", "prose". Defaults to ["programming"]. + */ + languageTypes?: string[]; + /** + * A custom mapping of linguist languages to how they should be rendered as entity tags. + * If a language is mapped to '' it will not be included as a tag. + */ + languageMap?: Record; + /** + * How long to cache entity languages for in memory. Used to avoid constant db hits during + * processing. Defaults to 30 minutes. + */ + cacheTTL?: HumanDuration; + }; + }; +} diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 0239b241d3..436fe02606 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -30,6 +30,7 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-linguist-common": "workspace:^", "@backstage/types": "workspace:^", "@types/express": "*", @@ -48,11 +49,14 @@ "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/supertest": "^2.0.8", + "js-yaml": "^4.1.0", "msw": "^1.0.0", "supertest": "^6.2.4" }, "files": [ "dist", + "config.d.ts", "migrations/**/*.{js,d.ts}" - ] + ], + "configSchema": "config.d.ts" } diff --git a/plugins/linguist-backend/src/index.ts b/plugins/linguist-backend/src/index.ts index 6ac1c3770a..107877551e 100644 --- a/plugins/linguist-backend/src/index.ts +++ b/plugins/linguist-backend/src/index.ts @@ -20,6 +20,7 @@ * @packageDocumentation */ +export * from './processor'; export * from './service/router'; export type { LinguistBackendApi } from './api'; export { linguistPlugin } from './plugin'; diff --git a/plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts b/plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts new file mode 100644 index 0000000000..4954820792 --- /dev/null +++ b/plugins/linguist-backend/src/processor/LinguistTagsProcessor.test.ts @@ -0,0 +1,343 @@ +/* + * 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 { + LinguistTagsProcessor, + LinguistTagsProcessorOptions, + sanitizeTag, +} from './LinguistTagsProcessor'; +import { ConfigReader } from '@backstage/config'; +import { getVoidLogger } from '@backstage/backend-common'; +import { CatalogProcessorCache } from '@backstage/plugin-catalog-node'; +import { Entity, makeValidator } from '@backstage/catalog-model'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; +import fetch, { Response } from 'node-fetch'; +import * as path from 'path'; +import yaml from 'js-yaml'; +import * as fs from 'fs'; + +const { isValidTag } = makeValidator(); + +jest.mock('node-fetch', () => jest.fn()); +const mockedFetch: jest.MockedFunction = + fetch as jest.MockedFunction; + +const discovery: DiscoveryService = { + getBaseUrl: jest.fn().mockResolvedValue('http://example.com/api/linguist'), + getExternalBaseUrl: jest.fn(), +}; + +let state: Record = {}; +const mockCacheGet = jest + .fn() + .mockImplementation(async (key: string) => state[key]); +const mockCacheSet = jest.fn().mockImplementation((key: string, value: any) => { + state[key] = value; +}); +const cache: CatalogProcessorCache = { + get: mockCacheGet, + set: mockCacheSet, +}; + +describe('sanitizeTag', () => { + const linguistDataSet = yaml.load( + fs.readFileSync( + path.resolve(require.resolve('linguist-js'), '../../ext/languages.yml'), + 'utf-8', + ), + ) as Object; + const languages = Object.keys(linguistDataSet); + test('Should clean up all linguist languages', () => { + const invalid = languages + .map(sanitizeTag) + .filter(lang => !isValidTag(lang)); + expect(invalid).toStrictEqual([]); + // Keep a snapshot here so that as new languages are added to linguist, + // we can spot check them to make sure the transformer for them makes sense. + expect(languages.map(sanitizeTag)).toMatchSnapshot(); + }); +}); + +describe('LinguistTagsProcessor', () => { + afterEach(() => { + mockedFetch.mockReset(); + mockCacheGet.mockClear(); + mockCacheSet.mockClear(); + state = {}; + }); + + test('Should construct fromConfig', () => { + const config = new ConfigReader({ + linguist: {}, + }); + expect(() => { + return LinguistTagsProcessor.fromConfig(config, { + logger: getVoidLogger(), + discovery, + }); + }).not.toThrow(); + }); + + test('Should assign valid language tags', async () => { + const processor = buildProcessor({}); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual([ + 'c++', + 'asp-dot-net', + 'java', + 'common-lisp', + ]); + + entity.metadata.tags?.forEach(tag => { + expect(isValidTag(tag)).toBeTruthy(); + }); + }); + + test('Should not duplicate existing tags', async () => { + const processor = buildProcessor({}); + + mockFetchImplementation(); + const entity = baseEntity(); + entity.metadata.tags = ['existing', 'tags', 'java']; + + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual([ + 'existing', + 'tags', + 'java', + 'c++', + 'asp-dot-net', + 'common-lisp', + ]); + }); + + test('Should not process Resource entities by default', async () => { + const processor = buildProcessor({}); + + mockFetchImplementation(); + const entity = baseEntity(); + entity.kind = 'Resource'; + + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(0); + expect(entity.metadata.tags).toStrictEqual(undefined); + }); + + test('Can process Resource entities by overriding shouldProcessEntity', async () => { + const processor = buildProcessor({ + shouldProcessEntity: (entity: Entity) => { + return entity.kind === 'Resource'; + }, + }); + + mockFetchImplementation(); + const entity = baseEntity(); + entity.kind = 'Resource'; + + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual([ + 'c++', + 'asp-dot-net', + 'java', + 'common-lisp', + ]); + }); + + test('Can omit languages using languageMap', async () => { + const processor = buildProcessor({ + languageMap: { + Java: '', + 'ASP.net': '', + }, + }); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual(['c++', 'common-lisp']); + }); + + test('Can rewrite langs using languageMap', async () => { + const processor = buildProcessor({ + languageMap: { + Java: 'notjava', + }, + }); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual([ + 'c++', + 'asp-dot-net', + 'notjava', + 'common-lisp', + ]); + }); + + test('Can omit languages less than bytesThreshold', async () => { + const processor = buildProcessor({ + bytesThreshold: 5000, + }); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual(['java', 'common-lisp']); + }); + + test('Can include languages that arent programming', async () => { + const processor = buildProcessor({ + languageTypes: ['data'], + }); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(entity.metadata.tags).toStrictEqual(['yaml', 'json']); + }); + + test('Refetches from API when cache disabled', async () => { + const processor = buildProcessor({ + cacheTTL: { minutes: 0 }, + }); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(mockCacheGet).toHaveBeenCalledTimes(0); + expect(mockCacheSet).toHaveBeenCalledTimes(0); + mockedFetch.mockClear(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(mockCacheGet).toHaveBeenCalledTimes(0); + expect(mockCacheSet).toHaveBeenCalledTimes(0); + }); + + test('Caches across runs with cache enabled', async () => { + const processor = buildProcessor({ + cacheTTL: { minutes: 5 }, + }); + + mockFetchImplementation(); + const entity = baseEntity(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(1); + expect(mockCacheGet).toHaveBeenCalledTimes(1); + expect(mockCacheSet).toHaveBeenCalledTimes(1); + + mockedFetch.mockClear(); + mockCacheGet.mockClear(); + mockCacheSet.mockClear(); + await processor.preProcessEntity(entity, null, null, null, cache); + expect(mockedFetch).toHaveBeenCalledTimes(0); + expect(mockCacheGet).toHaveBeenCalledTimes(1); + expect(mockCacheSet).toHaveBeenCalledTimes(0); + }); +}); + +function mockFetchImplementation(): void { + mockedFetch.mockResolvedValue({ + json: jest.fn().mockResolvedValue({ + languageCount: 6, + totalBytes: 43823, + processedDate: '2023-06-20T21:37:48.337Z', + breakdown: [ + { + name: 'YAML', + percentage: 2.23, + bytes: 979, + type: 'data', + color: '#cb171e', + }, + { + name: 'JSON', + percentage: 1.31, + bytes: 574, + type: 'data', + color: '#292929', + }, + { + name: 'C++', + percentage: 5.25, + bytes: 2300, + type: 'programming', + color: '#f34b7d', + }, + { + name: 'ASP.net', + percentage: 6.97, + bytes: 3053, + type: 'programming', + color: '#178600', + }, + { + name: 'Java', + percentage: 12.79, + bytes: 5603, + type: 'programming', + color: '#b07219', + }, + { + name: 'Common Lisp', + percentage: 71.46, + bytes: 31314, + type: 'programming', + color: '#3fb68b', + }, + ], + }), + } as unknown as Response); +} + +function baseEntity(): Entity { + return { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'foo', + }, + }; +} + +function buildProcessor(options: Partial) { + const config = new ConfigReader({ + linguist: { + tagsProcessor: { + bytesThreshold: options.bytesThreshold, + languageTypes: options.languageTypes, + languageMap: options.languageMap, + cacheTTL: options.cacheTTL, + }, + }, + }); + return LinguistTagsProcessor.fromConfig(config, { + logger: getVoidLogger(), + discovery, + shouldProcessEntity: options.shouldProcessEntity, + }); +} diff --git a/plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts b/plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts new file mode 100644 index 0000000000..b27fe2c5e9 --- /dev/null +++ b/plugins/linguist-backend/src/processor/LinguistTagsProcessor.ts @@ -0,0 +1,269 @@ +/* + * 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 { Entity, stringifyEntityRef } from '@backstage/catalog-model'; +import { + CatalogProcessor, + CatalogProcessorCache, +} from '@backstage/plugin-catalog-node'; +import { DiscoveryService } from '@backstage/backend-plugin-api'; +import { Languages, LanguageType } from '@backstage/plugin-linguist-common'; +import fetch from 'node-fetch'; +import { Logger } from 'winston'; +import { HumanDuration, durationToMilliseconds } from '@backstage/types'; +import { Config } from '@backstage/config'; + +/** + * A function which given an entity, determines if it should be processed for linguist tags. + * @public + */ +export type ShouldProcessEntity = (entity: Entity) => boolean; + +interface CachedData { + [key: string]: number | string[]; + languages: string[]; + cachedTime: number; +} + +/** + * The constructor options for building the LinguistTagsProcessor + * @public + */ +export interface LinguistTagsProcessorOptions { + logger: Logger; + discovery: DiscoveryService; + /** + * Optional map that gives full control over which linguist languages should be included as tags and + * how they should be represented. The keys should be exact matches to languages in the linguist + * and the values should be how they render as backstage tags. Keep in mind that backstage has character + * requirements for tags. If you map a key to a falsey value, it will not be emitted as a tag. + */ + languageMap?: Record; + /** + * A function which determines which entities should be processed by the LinguistTagProcessor. + * + * The default is to process all entities of kind=Component + */ + shouldProcessEntity?: ShouldProcessEntity; + /** + * Determines how long to cache language breakdowns for entities in the processor. Considering + * how often this processor runs, caching can help move some read traffic off of the linguist DB. + * + * If this caching is using up too much memory, you can disable it by setting cacheTTL to 0. + */ + cacheTTL?: HumanDuration; + /** + * How many bytes must exist of a language in a repo before we consider it for adding a tag to + * the entity. This can be used if some repos have short utility scripts that may not be the primary + * language for the repo. + */ + bytesThreshold?: number; + /** + * Which linguist file types to process tags for. + */ + languageTypes?: LanguageType[]; +} + +/** + * This processor will fetch the language breakdown from the linguist API and + * add the languages to the entity as searchable tags. + * + * @public + * */ +export class LinguistTagsProcessor implements CatalogProcessor { + private logger: Logger; + private discovery: DiscoveryService; + private loggerMeta = { plugin: 'LinguistTagsProcessor' }; + private languageMap: Record = {}; + private shouldProcessEntity: ShouldProcessEntity = (entity: Entity) => { + return entity.kind === 'Component'; + }; + private cacheTTLMilliseconds: number; + private bytesThreshold = 0; + private languageTypes: LanguageType[] = ['programming']; + + getProcessorName(): string { + return 'LinguistTagsProcessor'; + } + + constructor(options: LinguistTagsProcessorOptions) { + this.logger = options.logger; + this.discovery = options.discovery; + if (options.shouldProcessEntity) { + this.shouldProcessEntity = options.shouldProcessEntity; + } + this.cacheTTLMilliseconds = durationToMilliseconds( + options.cacheTTL || { minutes: 30 }, + ); + if (options.bytesThreshold) { + this.bytesThreshold = options.bytesThreshold; + } + if (options.languageTypes) { + this.languageTypes = options.languageTypes; + } + if (options.languageMap) { + this.languageMap = options.languageMap; + } + } + + static fromConfig( + config: Config, + options: LinguistTagsProcessorOptions, + ): LinguistTagsProcessor { + const c = config.getOptionalConfig('linguist.tagsProcessor'); + if (c) { + options.bytesThreshold ??= c.getOptionalNumber('bytesThreshold'); + options.languageTypes ??= c.getOptionalStringArray( + 'languageTypes', + ) as LanguageType[]; + options.languageMap ??= c.getOptional('languageMap'); + options.cacheTTL ??= c.getOptional('cacheTTL'); + } + + return new LinguistTagsProcessor(options); + } + + /** + * Given an entity ref, fetches the language breakdown from the Linguist backend HTTP API. + * @param entityRef - stringified entity ref + * @returns The language breakdown + */ + private async getLanguagesFromLinguistAPI( + entityRef: string, + ): Promise { + this.logger.debug(`Fetching languages from linguist API`, { + ...this.loggerMeta, + entityRef, + }); + + const baseUrl = await this.discovery.getBaseUrl('linguist'); + const linguistApi = new URL(`${baseUrl}/entity-languages`); + linguistApi.searchParams.append('entityRef', entityRef); + const linguistData = await fetch(linguistApi).then( + res => res.json() as Promise, + ); + if (!linguistData || !linguistData.processedDate) { + return []; + } + + return linguistData.breakdown + .filter( + b => + this.languageTypes.includes(b.type) && b.bytes > this.bytesThreshold, + ) + .map(b => b.name); + } + + /** + * Cached wrapper around getLanguagesFromLinguistAPI + * @param cache - The CatalogProcessorCache + * @param entityRef - Stringified entity references + * + * @returns List of languages + */ + private async getCachedLanguages( + cache: CatalogProcessorCache, + entityRef: string, + ): Promise { + let cachedData = (await cache.get(entityRef)) as CachedData | undefined; + if (!cachedData || this.isExpired(cachedData)) { + const languages = await this.getLanguagesFromLinguistAPI(entityRef); + cachedData = { languages, cachedTime: Date.now() }; + await cache.set(entityRef, cachedData); + } + this.logger.debug(`Fetched cached languages ${cachedData.languages}`, { + ...this.loggerMeta, + entityRef, + }); + return cachedData.languages; + } + + /** + * Determines if cached data is expired based on TTL + * + * @param cachedData - The cached data for this entity + * @returns True if data is expired + */ + private isExpired(cachedData: CachedData): boolean { + const elapsed = Date.now() - (cachedData.cachedTime || 0); + return elapsed > this.cacheTTLMilliseconds; + } + + /** + * This pre-processor will fetch linguist data for a Component and convert the language breakdown + * into entity tags which will be appended to the entity. + * + * @public + */ + async preProcessEntity( + entity: Entity, + _: any, + __: any, + ___: any, + cache: CatalogProcessorCache, + ): Promise { + if (!this.shouldProcessEntity(entity)) { + return entity; + } + const entityRef = stringifyEntityRef(entity); + this.logger.debug(`Processing ${entityRef}`, { + ...this.loggerMeta, + entityRef, + }); + + const languages = + this.cacheTTLMilliseconds > 0 + ? await this.getCachedLanguages(cache, entityRef) + : await this.getLanguagesFromLinguistAPI(entityRef); + + const tags = (entity.metadata.tags ||= []); + const originalTagCount = tags.length; + + languages.forEach(lang => { + const cleanedUpLangTag = + lang in this.languageMap ? this.languageMap[lang] : sanitizeTag(lang); + if (cleanedUpLangTag && !tags.includes(cleanedUpLangTag)) { + tags.push(cleanedUpLangTag); + } + }); + + const addedCount = tags.length - originalTagCount; + + this.logger.debug(`Added ${addedCount} language tags from linguist`, { + ...this.loggerMeta, + entityRef, + }); + + return entity; + } +} + +/** + * Converts language tags from linguist to something acceptable by + * the tag requirements for backstage + * + * @param tag - A language tag from linguist + * @returns Cleaned up language tag + * @internal + */ +export function sanitizeTag(tag: string): string { + return tag + .toLowerCase() + .replace(/\.net/g, '-dot-net') + .replace(/[^a-z0-9:+#-]+/g, '-') + .replace(/-{2,}/g, '-') + .replace(/^-+|-+$/g, ''); +} diff --git a/plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap b/plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap new file mode 100644 index 0000000000..4eb428f61a --- /dev/null +++ b/plugins/linguist-backend/src/processor/__snapshots__/LinguistTagsProcessor.test.ts.snap @@ -0,0 +1,707 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`sanitizeTag Should clean up all linguist languages 1`] = ` +[ + "1c-enterprise", + "2-dimensional-array", + "4d", + "abap", + "abap-cds", + "abnf", + "ags-script", + "aidl", + "al", + "ampl", + "antlr", + "api-blueprint", + "apl", + "asl", + "asn-1", + "asp-dot-net", + "ats", + "actionscript", + "ada", + "adblock-filter-list", + "adobe-font-metrics", + "agda", + "alloy", + "alpine-abuild", + "altium-designer", + "angelscript", + "ant-build-system", + "antlers", + "apacheconf", + "apex", + "apollo-guidance-computer", + "applescript", + "arc", + "asciidoc", + "aspectj", + "assembly", + "astro", + "asymptote", + "augeas", + "autohotkey", + "autoit", + "avro-idl", + "awk", + "basic", + "ballerina", + "batchfile", + "beef", + "befunge", + "berry", + "bibtex", + "bicep", + "bikeshed", + "bison", + "bitbake", + "blade", + "blitzbasic", + "blitzmax", + "bluespec", + "boo", + "boogie", + "brainfuck", + "brighterscript", + "brightscript", + "browserslist", + "c", + "c#", + "c++", + "c-objdump", + "c2hs-haskell", + "cap-cds", + "cil", + "clips", + "cmake", + "cobol", + "codeowners", + "collada", + "cson", + "css", + "csv", + "cue", + "cweb", + "cabal-config", + "cadence", + "cairo", + "cameligo", + "cap-n-proto", + "cartocss", + "ceylon", + "chapel", + "charity", + "checksums", + "chuck", + "circom", + "cirru", + "clarion", + "clarity", + "classic-asp", + "clean", + "click", + "clojure", + "closure-templates", + "cloud-firestore-security-rules", + "conll-u", + "codeql", + "coffeescript", + "coldfusion", + "coldfusion-cfc", + "common-lisp", + "common-workflow-language", + "component-pascal", + "cool", + "coq", + "cpp-objdump", + "creole", + "crystal", + "csound", + "csound-document", + "csound-score", + "cuda", + "cue-sheet", + "curry", + "cycript", + "cypher", + "cython", + "d", + "d-objdump", + "d2", + "digital-command-language", + "dm", + "dns-zone", + "dtrace", + "dafny", + "darcs-patch", + "dart", + "dataweave", + "debian-package-control-file", + "denizenscript", + "dhall", + "diff", + "directx-3d-file", + "dockerfile", + "dogescript", + "dotenv", + "dylan", + "e", + "e-mail", + "ebnf", + "ecl", + "eclipse", + "ejs", + "eq", + "eagle", + "earthly", + "easybuild", + "ecere-projects", + "ecmarkup", + "editorconfig", + "edje-data-collection", + "eiffel", + "elixir", + "elm", + "elvish", + "elvish-transcript", + "emacs-lisp", + "emberscript", + "erlang", + "euphoria", + "f#", + "f", + "figlet-font", + "flux", + "factor", + "fancy", + "fantom", + "faust", + "fennel", + "filebench-wml", + "filterscript", + "fluent", + "formatted", + "forth", + "fortran", + "fortran-free-form", + "freebasic", + "freemarker", + "frege", + "futhark", + "g-code", + "gaml", + "gams", + "gap", + "gcc-machine-description", + "gdb", + "gdscript", + "gedcom", + "glsl", + "gn", + "gsc", + "game-maker-language", + "gemfile-lock", + "gemini", + "genero", + "genero-forms", + "genie", + "genshi", + "gentoo-ebuild", + "gentoo-eclass", + "gerber-image", + "gettext-catalog", + "gherkin", + "git-attributes", + "git-config", + "git-revision-list", + "gleam", + "glyph", + "glyph-bitmap-distribution-format", + "gnuplot", + "go", + "go-checksums", + "go-module", + "go-workspace", + "godot-resource", + "golo", + "gosu", + "grace", + "gradle", + "grammatical-framework", + "graph-modeling-language", + "graphql", + "graphviz-dot", + "groovy", + "groovy-server-pages", + "haproxy", + "hcl", + "hlsl", + "hocon", + "html", + "html+ecr", + "html+eex", + "html+erb", + "html+php", + "html+razor", + "http", + "hxml", + "hack", + "haml", + "handlebars", + "harbour", + "haskell", + "haxe", + "hiveql", + "holyc", + "hosts-file", + "hy", + "hyphy", + "idl", + "igor-pro", + "ini", + "irc-log", + "idris", + "ignore-list", + "imagej-macro", + "imba", + "inform-7", + "ink", + "inno-setup", + "io", + "ioke", + "isabelle", + "isabelle-root", + "j", + "jar-manifest", + "jcl", + "jflex", + "json", + "json-with-comments", + "json5", + "jsonld", + "jsoniq", + "janet", + "jasmin", + "java", + "java-properties", + "java-server-pages", + "javascript", + "javascript+erb", + "jest-snapshot", + "jetbrains-mps", + "jinja", + "jison", + "jison-lex", + "jolie", + "jsonnet", + "julia", + "jupyter-notebook", + "just", + "krl", + "kaitai-struct", + "kakounescript", + "kerboscript", + "kicad-layout", + "kicad-legacy-layout", + "kicad-schematic", + "kickstart", + "kit", + "kotlin", + "kusto", + "lfe", + "llvm", + "lolcode", + "lsl", + "ltspice-symbol", + "labview", + "lark", + "lasso", + "latte", + "lean", + "less", + "lex", + "ligolang", + "lilypond", + "limbo", + "linker-script", + "linux-kernel-module", + "liquid", + "literate-agda", + "literate-coffeescript", + "literate-haskell", + "livescript", + "logos", + "logtalk", + "lookml", + "loomscript", + "lua", + "m", + "m4", + "m4sugar", + "matlab", + "maxscript", + "mdx", + "mlir", + "mql4", + "mql5", + "mtml", + "muf", + "macaulay2", + "makefile", + "mako", + "markdown", + "marko", + "mask", + "mathematica", + "maven-pom", + "max", + "mercury", + "mermaid", + "meson", + "metal", + "microsoft-developer-studio-project", + "microsoft-visual-studio-solution", + "minid", + "miniyaml", + "mint", + "mirah", + "modelica", + "modula-2", + "modula-3", + "module-management-system", + "monkey", + "monkey-c", + "moocode", + "moonscript", + "motoko", + "motorola-68k-assembly", + "move", + "muse", + "mustache", + "myghty", + "nasl", + "ncl", + "neon", + "nl", + "npm-config", + "nsis", + "nwscript", + "nasal", + "nearley", + "nemerle", + "netlinx", + "netlinx+erb", + "netlogo", + "newlisp", + "nextflow", + "nginx", + "nim", + "ninja", + "nit", + "nix", + "nu", + "numpy", + "nunjucks", + "nushell", + "oasv2-json", + "oasv2-yaml", + "oasv3-json", + "oasv3-yaml", + "ocaml", + "objdump", + "object-data-instance-notation", + "objectscript", + "objective-c", + "objective-c++", + "objective-j", + "odin", + "omgrofl", + "opa", + "opal", + "open-policy-agent", + "openapi-specification-v2", + "openapi-specification-v3", + "opencl", + "openedge-abl", + "openqasm", + "openrc-runscript", + "openscad", + "openstep-property-list", + "opentype-feature-file", + "option-list", + "org", + "ox", + "oxygene", + "oz", + "p4", + "pddl", + "peg-js", + "php", + "plsql", + "plpgsql", + "pov-ray-sdl", + "pact", + "pan", + "papyrus", + "parrot", + "parrot-assembly", + "parrot-internal-representation", + "pascal", + "pawn", + "pep8", + "perl", + "pic", + "pickle", + "picolisp", + "piglatin", + "pike", + "plantuml", + "pod", + "pod-6", + "pogoscript", + "polar", + "pony", + "portugol", + "postcss", + "postscript", + "powerbuilder", + "powershell", + "prisma", + "processing", + "procfile", + "proguard", + "prolog", + "promela", + "propeller-spin", + "protocol-buffer", + "protocol-buffer-text-format", + "public-key", + "pug", + "puppet", + "pure-data", + "purebasic", + "purescript", + "pyret", + "python", + "python-console", + "python-traceback", + "q#", + "qml", + "qmake", + "qt-script", + "quake", + "r", + "raml", + "rbs", + "rdoc", + "realbasic", + "rexx", + "rmarkdown", + "rpc", + "rpgle", + "rpm-spec", + "runoff", + "racket", + "ragel", + "raku", + "rascal", + "raw-token-data", + "rescript", + "readline-config", + "reason", + "reasonligo", + "rebol", + "record-jar", + "red", + "redcode", + "redirect-rules", + "regular-expression", + "ren-py", + "renderscript", + "rich-text-format", + "ring", + "riot", + "robotframework", + "roff", + "roff-manpage", + "rouge", + "routeros-script", + "ruby", + "rust", + "sas", + "scss", + "selinux-policy", + "smt", + "sparql", + "sqf", + "sql", + "sqlpl", + "srecode-template", + "ssh-config", + "star", + "stl", + "ston", + "svg", + "swig", + "sage", + "saltstack", + "sass", + "scala", + "scaml", + "scenic", + "scheme", + "scilab", + "self", + "shaderlab", + "shell", + "shellcheck-config", + "shellsession", + "shen", + "sieve", + "simple-file-verification", + "singularity", + "slash", + "slice", + "slim", + "smpl", + "smali", + "smalltalk", + "smarty", + "smithy", + "snakemake", + "solidity", + "soong", + "sourcepawn", + "spline-font-database", + "squirrel", + "stan", + "standard-ml", + "starlark", + "stata", + "stringtemplate", + "stylus", + "subrip-text", + "sugarss", + "supercollider", + "svelte", + "sway", + "swift", + "systemverilog", + "ti-program", + "tl-verilog", + "tla", + "toml", + "tsql", + "tsv", + "tsx", + "txl", + "talon", + "tcl", + "tcsh", + "tex", + "tea", + "terra", + "texinfo", + "text", + "textmate-properties", + "textile", + "thrift", + "turing", + "turtle", + "twig", + "type-language", + "typescript", + "unified-parallel-c", + "unity3d-asset", + "unix-assembly", + "uno", + "unrealscript", + "urweb", + "v", + "vba", + "vbscript", + "vcl", + "vhdl", + "vala", + "valve-data-format", + "velocity-template-language", + "verilog", + "vim-help-file", + "vim-script", + "vim-snippet", + "visual-basic-dot-net", + "visual-basic-6-0", + "volt", + "vue", + "vyper", + "wdl", + "wgsl", + "wavefront-material", + "wavefront-object", + "web-ontology-language", + "webassembly", + "webassembly-interface-type", + "webidl", + "webvtt", + "wget-config", + "whiley", + "wikitext", + "win32-message-file", + "windows-registry-entries", + "witcher-script", + "wollok", + "world-of-warcraft-addon-data", + "wren", + "x-bitmap", + "x-font-directory-index", + "x-pixmap", + "x10", + "xc", + "xcompose", + "xml", + "xml-property-list", + "xpages", + "xproc", + "xquery", + "xs", + "xslt", + "xojo", + "xonsh", + "xtend", + "yaml", + "yang", + "yara", + "yasnippet", + "yacc", + "yul", + "zap", + "zil", + "zeek", + "zenscript", + "zephir", + "zig", + "zimpl", + "curl-config", + "desktop", + "dircolors", + "ec", + "edn", + "fish", + "hoon", + "jq", + "kvlang", + "mirc-script", + "mcfunction", + "mupad", + "nanorc", + "nesc", + "ooc", + "q", + "restructuredtext", + "robots-txt", + "sed", + "wisp", + "xbase", +] +`; diff --git a/plugins/linguist-backend/src/processor/index.ts b/plugins/linguist-backend/src/processor/index.ts new file mode 100644 index 0000000000..b56618b203 --- /dev/null +++ b/plugins/linguist-backend/src/processor/index.ts @@ -0,0 +1,20 @@ +/* + * 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. + */ +export type { + LinguistTagsProcessorOptions, + ShouldProcessEntity, +} from './LinguistTagsProcessor'; +export { LinguistTagsProcessor } from './LinguistTagsProcessor'; diff --git a/plugins/linguist-common/api-report.md b/plugins/linguist-common/api-report.md index 954bef7904..9ab81fd41d 100644 --- a/plugins/linguist-common/api-report.md +++ b/plugins/linguist-common/api-report.md @@ -23,7 +23,7 @@ export type Language = { name: string; percentage: number; bytes: number; - type: string; + type: LanguageType; color?: `#${string}`; }; @@ -35,6 +35,9 @@ export type Languages = { breakdown: Language[]; }; +// @public (undocumented) +export type LanguageType = 'programming' | 'data' | 'markup' | 'prose'; + // @public (undocumented) export const LINGUIST_ANNOTATION = 'backstage.io/linguist'; diff --git a/plugins/linguist-common/src/types.ts b/plugins/linguist-common/src/types.ts index 28a25ed059..515ca45f9c 100644 --- a/plugins/linguist-common/src/types.ts +++ b/plugins/linguist-common/src/types.ts @@ -28,12 +28,15 @@ export type Languages = { breakdown: Language[]; }; +/** @public */ +export type LanguageType = 'programming' | 'data' | 'markup' | 'prose'; + /** @public */ export type Language = { name: string; percentage: number; bytes: number; - type: string; + type: LanguageType; color?: `#${string}`; }; diff --git a/yarn.lock b/yarn.lock index bb795ca564..c8ecd80abc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7734,6 +7734,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-linguist-common": "workspace:^" "@backstage/types": "workspace:^" "@types/express": "*" @@ -7741,6 +7742,7 @@ __metadata: express: ^4.18.1 express-promise-router: ^4.1.0 fs-extra: ^10.0.0 + js-yaml: ^4.1.0 knex: ^2.0.0 linguist-js: ^2.5.3 luxon: ^2.0.2 From 73a5205447dccd188558549145dc180562e2c52d Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Wed, 5 Jul 2023 18:47:52 +0100 Subject: [PATCH 017/440] fix: Use real entity instead of ref for attributes Signed-off-by: Mike Bryant --- .../DefaultCatalogProcessingEngine.ts | 2 +- .../DefaultCatalogProcessingOrchestrator.ts | 18 ++++++------ .../catalog-backend/src/util/opentelemetry.ts | 29 ++++++++++++------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index 2ae104666f..bed1fe6f50 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -140,7 +140,7 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { processTask: async item => { await withActiveSpan(tracer, 'ProcessingRun', async span => { const track = this.tracker.processStart(item, this.logger); - addEntityAttributes(span, item.entityRef); + addEntityAttributes(span, item.unprocessedEntity); try { const { diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index 98f9cd32a5..c5eaacbc68 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -200,7 +200,7 @@ export class DefaultCatalogProcessingOrchestrator context: Context, ): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { - addEntityAttributes(stageSpan, context.entityRef); + addEntityAttributes(stageSpan, entity); stageSpan.setAttribute('backstage.catalog.processor.stage', 'preProcess'); let res = entity; @@ -208,7 +208,7 @@ export class DefaultCatalogProcessingOrchestrator if (processor.preProcessEntity) { let innerRes = res; res = await withActiveSpan(tracer, 'ProcessingStep', async span => { - addEntityAttributes(span, context.entityRef); + addEntityAttributes(span, entity); addProcessorAttributes(span, 'preProcessEntity', processor); try { innerRes = await processor.preProcessEntity!( @@ -238,7 +238,7 @@ export class DefaultCatalogProcessingOrchestrator */ private async runPolicyStep(entity: Entity): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { - addEntityAttributes(stageSpan, stringifyEntityRef(entity)); + addEntityAttributes(stageSpan, entity); stageSpan.setAttribute( 'backstage.catalog.processor.stage', 'enforcePolicy', @@ -274,7 +274,7 @@ export class DefaultCatalogProcessingOrchestrator context: Context, ): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { - addEntityAttributes(stageSpan, context.entityRef); + addEntityAttributes(stageSpan, entity); stageSpan.setAttribute('backstage.catalog.processor.stage', 'validate'); // Double check that none of the previous steps tried to change something // related to the entity ref, which would break downstream @@ -303,7 +303,7 @@ export class DefaultCatalogProcessingOrchestrator tracer, 'ProcessingStep', async span => { - addEntityAttributes(span, context.entityRef); + addEntityAttributes(span, entity); addProcessorAttributes(span, 'validateEntityKind', processor); return await processor.validateEntityKind!(entity); }, @@ -339,7 +339,7 @@ export class DefaultCatalogProcessingOrchestrator context: Context, ): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { - addEntityAttributes(stageSpan, context.entityRef); + addEntityAttributes(stageSpan, entity); stageSpan.setAttribute( 'backstage.catalog.processor.stage', 'readLocation', @@ -379,7 +379,7 @@ export class DefaultCatalogProcessingOrchestrator tracer, 'ProcessingStep', async span => { - addEntityAttributes(span, context.entityRef); + addEntityAttributes(span, entity); addProcessorAttributes(span, 'readLocation', processor); return await processor.readLocation!( { @@ -423,7 +423,7 @@ export class DefaultCatalogProcessingOrchestrator context: Context, ): Promise { return await withActiveSpan(tracer, 'ProcessingStage', async stageSpan => { - addEntityAttributes(stageSpan, context.entityRef); + addEntityAttributes(stageSpan, entity); stageSpan.setAttribute( 'backstage.catalog.processor.stage', 'postProcessEntity', @@ -434,7 +434,7 @@ export class DefaultCatalogProcessingOrchestrator if (processor.postProcessEntity) { let innerRes = res; res = await withActiveSpan(tracer, 'ProcessingStep', async span => { - addEntityAttributes(span, context.entityRef); + addEntityAttributes(span, entity); addProcessorAttributes(span, 'postProcessEntity', processor); try { innerRes = await processor.postProcessEntity!( diff --git a/plugins/catalog-backend/src/util/opentelemetry.ts b/plugins/catalog-backend/src/util/opentelemetry.ts index 391869deb8..c2df008452 100644 --- a/plugins/catalog-backend/src/util/opentelemetry.ts +++ b/plugins/catalog-backend/src/util/opentelemetry.ts @@ -15,22 +15,31 @@ */ import { Span, SpanOptions, SpanStatusCode, Tracer } from '@opentelemetry/api'; -import { parseEntityRef } from '@backstage/catalog-model'; +import { Entity } from '@backstage/catalog-model'; export const TRACER_ID = 'backstage-plugin-catalog-backend'; -export function addEntityAttributes(span: Span, entityRef: string) { - try { - const fields = parseEntityRef(entityRef); - span.setAttribute('backstage.entity.kind', fields.kind); - span.setAttribute('backstage.entity.namespace', fields.namespace); - span.setAttribute('backstage.entity.name', fields.name); - } catch (err) { - span.recordException(err); - span.setStatus({ code: SpanStatusCode.ERROR }); +function setAttributeIfDefined(span: Span, attribute: string, value?: string) { + if (value !== null && value !== undefined) { + span.setAttribute(attribute, value); } } +export function addEntityAttributes(span: Span, entity: Entity) { + setAttributeIfDefined(span, 'backstage.entity.apiVersion', entity.apiVersion); + setAttributeIfDefined(span, 'backstage.entity.kind', entity.kind); + setAttributeIfDefined( + span, + 'backstage.entity.metadata.namespace', + entity.metadata?.namespace, + ); + setAttributeIfDefined( + span, + 'backstage.entity.metadata.name', + entity.metadata?.name, + ); +} + // Adapted from https://github.com/open-telemetry/opentelemetry-js/blob/359fbcc40a859057a02b14e84599eac399b8dba7/api/src/trace/SugaredTracer.ts // While waiting for something like https://github.com/open-telemetry/opentelemetry-js/pull/3317 to land upstream From 72f8b2be2ff25eab1f88863e6982e41a69b59283 Mon Sep 17 00:00:00 2001 From: Paulo Eduardo Peixoto Date: Thu, 13 Jul 2023 14:16:04 -0300 Subject: [PATCH 018/440] docs(features/software-templates): update "writing-custom-field-extensions.md" after deprecated "createScaffolderFieldExtension" and "ScaffolderFieldExtensions" from "@backstage/plugin-scaffolder". Signed-off-by: Paulo Eduardo Peixoto --- .../software-templates/writing-custom-field-extensions.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/features/software-templates/writing-custom-field-extensions.md b/docs/features/software-templates/writing-custom-field-extensions.md index 20575a0b4a..f22cecd22c 100644 --- a/docs/features/software-templates/writing-custom-field-extensions.md +++ b/docs/features/software-templates/writing-custom-field-extensions.md @@ -89,10 +89,8 @@ export const validateKebabCaseValidation = ( then please use `scaffolderPlugin.provide` from there instead and export it part of your `plugin.ts` rather than re-using the `scaffolder.plugin`. */ -import { - scaffolderPlugin, - createScaffolderFieldExtension, -} from '@backstage/plugin-scaffolder'; +import { scaffolderPlugin } from '@backstage/plugin-scaffolder'; +import { createScaffolderFieldExtension } from '@backstage/plugin-scaffolder-react'; import { ValidateKebabCase, validateKebabCaseValidation, @@ -133,7 +131,7 @@ Should look something like this instead: ```tsx import { ValidateKebabCaseFieldExtension } from './scaffolder/ValidateKebabCase'; -import { ScaffolderFieldExtensions } from '@backstage/plugin-scaffolder'; +import { ScaffolderFieldExtensions } from '@backstage/plugin-scaffolder-react'; const routes = ( From 2b4f77a4e900879de66d19f46a1f538ad78d8842 Mon Sep 17 00:00:00 2001 From: Brian Phillips <28457+brianphillips@users.noreply.github.com> Date: Fri, 21 Jul 2023 10:20:49 -0500 Subject: [PATCH 019/440] Allow package prefixes to be customized for DevTools dependency listing Signed-off-by: Brian Phillips <28457+brianphillips@users.noreply.github.com> --- .changeset/kind-cougars-allow.md | 5 +++++ plugins/devtools-backend/config.d.ts | 5 +++++ .../devtools-backend/src/api/DevToolsBackendApi.ts | 7 ++++++- plugins/devtools/README.md | 14 +++++++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 .changeset/kind-cougars-allow.md diff --git a/.changeset/kind-cougars-allow.md b/.changeset/kind-cougars-allow.md new file mode 100644 index 0000000000..058bec5f2e --- /dev/null +++ b/.changeset/kind-cougars-allow.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools-backend': patch +--- + +Add DevTools configuration to enable dependency listing to be filtered with custom prefixes diff --git a/plugins/devtools-backend/config.d.ts b/plugins/devtools-backend/config.d.ts index 15e70afcf8..79d1d6159f 100644 --- a/plugins/devtools-backend/config.d.ts +++ b/plugins/devtools-backend/config.d.ts @@ -40,5 +40,10 @@ export interface Config { target: string; }>; }; + /** + * A list of package prefixes that DevTools will use for filtering all available dependencies + * (default is ["@backstage"]) + */ + packagePrefixes?: string[]; }; } diff --git a/plugins/devtools-backend/src/api/DevToolsBackendApi.ts b/plugins/devtools-backend/src/api/DevToolsBackendApi.ts index efd0407b31..eb5dc9f860 100644 --- a/plugins/devtools-backend/src/api/DevToolsBackendApi.ts +++ b/plugins/devtools-backend/src/api/DevToolsBackendApi.ts @@ -219,7 +219,12 @@ export class DevToolsBackendApi { const lockfilePath = paths.resolveTargetRoot('yarn.lock'); const lockfile = await Lockfile.load(lockfilePath); - const deps = [...lockfile.keys()].filter(n => n.startsWith('@backstage/')); + const prefixes = this.config.getOptionalStringArray( + 'devTools.packagePrefixes', + ) ?? ['@backstage/']; + const deps = [...lockfile.keys()].filter(n => + prefixes.some(prefix => n.startsWith(prefix)), + ); const infoDependencies: PackageDependency[] = []; for (const dep of deps) { diff --git a/plugins/devtools/README.md b/plugins/devtools/README.md index 09e76caaa4..e59f4df132 100644 --- a/plugins/devtools/README.md +++ b/plugins/devtools/README.md @@ -410,9 +410,21 @@ export const customDevToolsPage = ; The following sections outline the configuration for the DevTools plugin +### Package Dependencies + +By default, only packages with names starting with `@backstage/` will be listed on the main "Info" tab. If you would like additional packages to be listed, you can specify the package prefixes in your `app-config.yaml`. For example, to include backstage plugins provided by the core application as well as `@roadiehq` and `@spotify`: + +```yaml +devTools: + packagePrefixes: + - @backstage/ + - @roadiehq/backstage- + - @spotify/backstage- +``` + ### External Dependencies Configuration -If you decide to use the External Dependencies tab then you'll need to setup the configuration for it in your `app-config.yaml`, if there is no config setup then the tab will be empty. Here's an example: +If you decide to use the External Dependencies tab then you'll need to setup the configuration for it in your `app-config.yaml`. If there is no endpoints configured, then the tab will be empty. Here's an example: ```yaml devTools: From b9379b45bb1b296377cb624b22eda32713c3a2df Mon Sep 17 00:00:00 2001 From: Mike Bryant Date: Fri, 21 Jul 2023 19:11:40 +0100 Subject: [PATCH 020/440] chore: Use PromiseLike instead of Promise Follow review comments, use PromiseLike with a type guard Signed-off-by: Mike Bryant --- .../catalog-backend/src/util/opentelemetry.ts | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/plugins/catalog-backend/src/util/opentelemetry.ts b/plugins/catalog-backend/src/util/opentelemetry.ts index c2df008452..3fb83d7909 100644 --- a/plugins/catalog-backend/src/util/opentelemetry.ts +++ b/plugins/catalog-backend/src/util/opentelemetry.ts @@ -50,23 +50,38 @@ const onException = (e: Error, span: Span) => { }); }; +function isPromiseLike(obj: PromiseLike | S): obj is PromiseLike { + return ( + !!obj && + (typeof obj === 'object' || typeof obj === 'function') && + 'then' in obj && + typeof obj.then === 'function' + ); +} + function handleFn ReturnType>( span: Span, fn: F, ): ReturnType { try { - const ret = fn(span) as Promise>; + const ret = fn(span); + // if fn is an async function attach a recordException and spanEnd callback to the promise - if (typeof ret.then === 'function' && typeof ret.catch === 'function') { - return ret - .catch((e: Error) => { + if (isPromiseLike(ret)) { + ret.then( + () => { + span.end(); + }, + e => { onException(e, span); - throw e; - }) - .finally(() => span.end()) as ReturnType; + span.end(); + }, + ); + } else { + span.end(); } - span.end(); - return ret as ReturnType; + + return ret; } catch (e) { onException(e, span); span.end(); From be3a138d2af480203567d42ff827f1d712e58d64 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Jul 2023 13:50:18 +0000 Subject: [PATCH 021/440] fix(deps): update dependency linguist-js to v2.6.1 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 05be39bde2..3f52b1a54b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22055,7 +22055,7 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:^3.1.3, cross-fetch@npm:^3.1.5, cross-fetch@npm:^3.1.6": +"cross-fetch@npm:^3.1.3, cross-fetch@npm:^3.1.5, cross-fetch@npm:^3.1.8 <4": version: 3.1.8 resolution: "cross-fetch@npm:3.1.8" dependencies: @@ -30579,13 +30579,13 @@ __metadata: linkType: hard "linguist-js@npm:^2.5.3": - version: 2.5.6 - resolution: "linguist-js@npm:2.5.6" + version: 2.6.1 + resolution: "linguist-js@npm:2.6.1" dependencies: binary-extensions: ^2.2.0 commander: ^9.5.0 <10 common-path-prefix: ^3.0.0 - cross-fetch: ^3.1.6 + cross-fetch: ^3.1.8 <4 ignore: ^5.2.4 isbinaryfile: ^4.0.10 <5 js-yaml: ^4.1.0 @@ -30593,7 +30593,7 @@ __metadata: bin: linguist: bin/index.js linguist-js: bin/index.js - checksum: bd1ae9514b4fa365611e571eb7c0cf5b087fc8ab77cdf7aeade2029a327ae3dd9005eb87e4b75770780e06e749c2d9b72f011d0a659705e1a2347b4fe7e28631 + checksum: 5eea5a0562e4a8958703833eef0377235fd34da1f12b7b8b8208934b877c9f36b7c140b25c66ab563ff229203cd8c224e84d840edbc4ee285ad051b8b8fdb5ae languageName: node linkType: hard From b3da8fb86302ad688399b05530723a8dc9b5c310 Mon Sep 17 00:00:00 2001 From: cloudoutloud <39462069+cloudoutloud@users.noreply.github.com> Date: Sun, 23 Jul 2023 18:55:22 +0100 Subject: [PATCH 022/440] Update ts examples in aws alb auth documentation Signed-off-by: cloudoutloud <39462069+cloudoutloud@users.noreply.github.com> --- .../docs/tutorials/aws-alb-aad-oidc-auth.md | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md index 1bdf9cc367..dca6f096c3 100644 --- a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md +++ b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md @@ -58,6 +58,7 @@ When using ALB authentication Backstage will only be loaded once the user has su import React from 'react'; import { UserIdentity } from '@backstage/core-components'; import { SignInPageProps } from '@backstage/core-app-api'; +import { useApi, configApiRef } from '@backstage/core-plugin-api'; const SampleSignInComponent: any = (props: SignInPageProps) => { const [error, setError] = React.useState(); @@ -135,12 +136,14 @@ export default async function createPlugin({ database, config, discovery, + tokenManager, }: PluginEnvironment): Promise { return await createRouter({ logger, config, database, discovery, + tokenManager, providerFactories: { awsalb: providers.awsAlb.create({ authHandler: async ({ fullProfile }) => { @@ -168,25 +171,29 @@ export default async function createPlugin({ }; }, signIn: { - resolver: async ({ profile: { email } }, ctx) => { - const [id] = email?.split('@') ?? ''; - // Fetch from an external system that returns entity claims like: - // ['user:default/breanna.davison', ...] - const userEntityRef = stringifyEntityRef({ + resolver: async ({ profile }, ctx) => { + if (!profile.email) { + throw new Error('Profile contained no email'); + } + + const [id] = profile.email.split('@'); + if (!id) { + throw new Error('Invalid email format'); + } + + const userRef = stringifyEntityRef({ kind: 'User', - namespace: DEFAULT_NAMESPACE, name: id, + namespace: DEFAULT_NAMESPACE, }); - // Resolve group membership from the Backstage catalog - const fullEnt = - await ctx.catalogIdentityClient.resolveCatalogMembership({ - entityRefs: [id].concat([userEntityRef]), - logger: ctx.logger, - }); - const token = await ctx.tokenIssuer.issueToken({ - claims: { sub: userEntityRef, ent: fullEnt }, + const { token } = await ctx.issueToken({ + claims: { + sub: userRef, + ent: [userRef], + }, }); + return { id, token }; }, }, From 98d3f2fa31680b782caddc7d328e71e178ccddab Mon Sep 17 00:00:00 2001 From: Scott Guymer Date: Mon, 24 Jul 2023 11:56:37 +0200 Subject: [PATCH 023/440] Add email to index for user entity Signed-off-by: Scott Guymer --- .../defaultCatalogCollatorEntityTransformer.test.ts | 3 ++- .../collators/defaultCatalogCollatorEntityTransformer.ts | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts index 8206a58599..4ae6c88c06 100644 --- a/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts +++ b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts @@ -42,6 +42,7 @@ const userEntity = { spec: { profile: { displayName: 'User 1', + email: 'test@test.com', }, }, }; @@ -94,7 +95,7 @@ describe('DefaultCatalogCollatorEntityTransformer', () => { expect(document).toMatchObject({ title: userEntity.metadata.name, - text: `${userEntity.metadata.description} : ${userEntity.spec.profile.displayName}`, + text: `${userEntity.metadata.description} : ${userEntity.spec.profile.displayName} : ${userEntity.spec.profile.email}}`, namespace: 'default', componentType: 'other', lifecycle: '', diff --git a/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.ts b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.ts index 2fc0c5d50d..db239b8669 100644 --- a/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.ts +++ b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.ts @@ -27,6 +27,12 @@ const getDocumentText = (entity: Entity): string => { } } + if (isUserEntity(entity)) { + if (entity.spec?.profile?.email) { + documentTexts.push(entity.spec.profile.email); + } + } + return documentTexts.join(' : '); }; From d4f19a16bd52861c835dbc28cd32bfdb8e34b415 Mon Sep 17 00:00:00 2001 From: Scott Guymer Date: Mon, 24 Jul 2023 12:02:36 +0200 Subject: [PATCH 024/440] added changeset Signed-off-by: Scott Guymer --- .changeset/twelve-pigs-cough.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/twelve-pigs-cough.md diff --git a/.changeset/twelve-pigs-cough.md b/.changeset/twelve-pigs-cough.md new file mode 100644 index 0000000000..e2eef61915 --- /dev/null +++ b/.changeset/twelve-pigs-cough.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend-module-catalog': patch +--- + +Add User Entity email to the search index so that users can be found by their email. From a5374fe323463fd5d2da459b3ac2b5104474861e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 13:18:32 +0000 Subject: [PATCH 025/440] chore(deps): update dependency msw to v1.2.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 916ce09ac7..b4342fa4d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32678,8 +32678,8 @@ __metadata: linkType: hard "msw@npm:^1.0.0, msw@npm:^1.0.1, msw@npm:^1.2.1": - version: 1.2.2 - resolution: "msw@npm:1.2.2" + version: 1.2.3 + resolution: "msw@npm:1.2.3" dependencies: "@mswjs/cookies": ^0.2.2 "@mswjs/interceptors": ^0.17.5 @@ -32707,7 +32707,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: e42cec8f5523663020bdecf6a7977a10aa86a4718d1920def3fbde0ff3734391873668cc6e3996d6790add3c74dac95a952f8560ce2543697280125eb55138e8 + checksum: 832a6fc3973726a97e03ce2690c3b6e1774b5156d064a478657a1b33f9933e4834af833cc8a859e1b717fa9b71f1271b3e66a1ec6eed7f76bfe79406e9ec3986 languageName: node linkType: hard From 032f748151bfa5a5ea7873922dec25b088d1f1eb Mon Sep 17 00:00:00 2001 From: cloudoutloud <39462069+cloudoutloud@users.noreply.github.com> Date: Mon, 24 Jul 2023 19:36:38 +0100 Subject: [PATCH 026/440] Update ts examples in aws alb auth documentation error Signed-off-by: cloudoutloud <39462069+cloudoutloud@users.noreply.github.com> --- contrib/docs/tutorials/aws-alb-aad-oidc-auth.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md index dca6f096c3..f28a62c018 100644 --- a/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md +++ b/contrib/docs/tutorials/aws-alb-aad-oidc-auth.md @@ -91,8 +91,8 @@ const SampleSignInComponent: any = (props: SignInPageProps) => { }, }), ); - } catch (err) { - setError(err.message); + } catch (err: any) { + setError(err.message as string); } } }, [config]); From 366a6b98fc567d11a254f9f03fea4c9d2fa84643 Mon Sep 17 00:00:00 2001 From: Brian Phillips <28457+brianphillips@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:44:26 -0500 Subject: [PATCH 027/440] code review feedback Signed-off-by: Brian Phillips <28457+brianphillips@users.noreply.github.com> --- .changeset/kind-cougars-allow.md | 11 ++++++++++- plugins/devtools-backend/config.d.ts | 11 ++++++++--- .../devtools-backend/src/api/DevToolsBackendApi.ts | 6 +++--- plugins/devtools/README.md | 12 ++++++------ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/.changeset/kind-cougars-allow.md b/.changeset/kind-cougars-allow.md index 058bec5f2e..d37c4c5cf2 100644 --- a/.changeset/kind-cougars-allow.md +++ b/.changeset/kind-cougars-allow.md @@ -2,4 +2,13 @@ '@backstage/plugin-devtools-backend': patch --- -Add DevTools configuration to enable dependency listing to be filtered with custom prefixes +Add DevTools configuration to enable dependency listing to be filtered with custom prefixes. For instance, in your `app-config.yaml`: + +```yaml +devTools: + info: + packagePrefixes: + - @backstage/ + - @roadiehq/backstage- + - @spotify/backstage- +``` diff --git a/plugins/devtools-backend/config.d.ts b/plugins/devtools-backend/config.d.ts index 79d1d6159f..9fc7cf1762 100644 --- a/plugins/devtools-backend/config.d.ts +++ b/plugins/devtools-backend/config.d.ts @@ -41,9 +41,14 @@ export interface Config { }>; }; /** - * A list of package prefixes that DevTools will use for filtering all available dependencies - * (default is ["@backstage"]) + * Info configuration */ - packagePrefixes?: string[]; + info?: { + /** + * A list of package prefixes that DevTools will use for filtering all available dependencies + * (default is ["@backstage"]) + */ + packagePrefixes?: string[]; + }; }; } diff --git a/plugins/devtools-backend/src/api/DevToolsBackendApi.ts b/plugins/devtools-backend/src/api/DevToolsBackendApi.ts index eb5dc9f860..c1b1a1fa9a 100644 --- a/plugins/devtools-backend/src/api/DevToolsBackendApi.ts +++ b/plugins/devtools-backend/src/api/DevToolsBackendApi.ts @@ -219,9 +219,9 @@ export class DevToolsBackendApi { const lockfilePath = paths.resolveTargetRoot('yarn.lock'); const lockfile = await Lockfile.load(lockfilePath); - const prefixes = this.config.getOptionalStringArray( - 'devTools.packagePrefixes', - ) ?? ['@backstage/']; + const prefixes = ['@backstage', '@internal'].concat( + this.config.getOptionalStringArray('devTools.info.packagePrefixes') ?? [], + ); const deps = [...lockfile.keys()].filter(n => prefixes.some(prefix => n.startsWith(prefix)), ); diff --git a/plugins/devtools/README.md b/plugins/devtools/README.md index e59f4df132..c3c3fd9240 100644 --- a/plugins/devtools/README.md +++ b/plugins/devtools/README.md @@ -408,18 +408,18 @@ export const customDevToolsPage = ; ## Configuration -The following sections outline the configuration for the DevTools plugin +The following sections outline the configuration for the DevTools plugin. ### Package Dependencies -By default, only packages with names starting with `@backstage/` will be listed on the main "Info" tab. If you would like additional packages to be listed, you can specify the package prefixes in your `app-config.yaml`. For example, to include backstage plugins provided by the core application as well as `@roadiehq` and `@spotify`: +By default, only packages with names starting with `@backstage` and `@internal` will be listed on the main "Info" tab. If you would like additional packages to be listed, you can specify the package prefixes (not regular expressions) in your `app-config.yaml`. For example, to not only provide version information about backstage plugins provided by the core application (`@backstage/*` modules) but also `@roadiehq` and `@spotify` plugins, you can specify this configuration: ```yaml devTools: - packagePrefixes: - - @backstage/ - - @roadiehq/backstage- - - @spotify/backstage- + info: + packagePrefixes: + - @roadiehq/backstage- + - @spotify/backstage- ``` ### External Dependencies Configuration From 0d347efc8f18f3acb566e4d4a83478d0151e8ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 25 Jul 2023 09:55:38 +0200 Subject: [PATCH 028/440] Use fetchContents direectly instead of a fetchPlainAction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/odd-avocados-buy.md | 5 +++++ .../confluence/confluenceToMarkdown.test.ts | 4 ++-- .../actions/confluence/confluenceToMarkdown.ts | 17 ++++++++--------- 3 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 .changeset/odd-avocados-buy.md diff --git a/.changeset/odd-avocados-buy.md b/.changeset/odd-avocados-buy.md new file mode 100644 index 0000000000..9e71c19fc0 --- /dev/null +++ b/.changeset/odd-avocados-buy.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +--- + +Use `fetchContents` directly instead of a `fetchPlainAction` diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts index b3e2925265..4e4f3091f1 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts @@ -157,7 +157,7 @@ describe('confluence:transform:markdown', () => { expect(logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(6); + expect(logger.info).toHaveBeenCalledTimes(5); expect(createWriteStream).toHaveBeenCalledTimes(1); expect(readFile).toHaveBeenCalledTimes(1); expect(writeFile).toHaveBeenCalledTimes(1); @@ -204,7 +204,7 @@ describe('confluence:transform:markdown', () => { expect(logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(6); + expect(logger.info).toHaveBeenCalledTimes(5); expect(createWriteStream).not.toHaveBeenCalled(); expect(readFile).toHaveBeenCalledTimes(1); diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts index 9b666fd99e..428f392555 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -16,7 +16,7 @@ import { Config } from '@backstage/config'; import { UrlReader } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; -import { createFetchPlainAction } from '@backstage/plugin-scaffolder-backend'; +import { fetchContents } from '@backstage/plugin-scaffolder-backend'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { InputError, ConflictError } from '@backstage/errors'; import { NodeHtmlMarkdown } from 'node-html-markdown'; @@ -41,7 +41,6 @@ export const createConfluenceToMarkdownAction = (options: { config: Config; }) => { const { config, reader, integrations } = options; - const fetchPlainAction = createFetchPlainAction({ reader, integrations }); type Obj = { [key: string]: string; }; @@ -82,18 +81,18 @@ export const createConfluenceToMarkdownAction = (options: { parsedRepoUrl.filepath.lastIndexOf('/') + 1, ); const dirPath = ctx.workspacePath; + const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`; let productArray: string[][] = []; ctx.logger.info(`Fetching the mkdocs.yml catalog from ${repoUrl}`); // This grabs the files from Github - const repoFileDir = `${dirPath}/${parsedRepoUrl.filepath}`; - await fetchPlainAction.handler({ - ...ctx, - input: { - url: `https://${parsedRepoUrl.resource}/${parsedRepoUrl.owner}/${parsedRepoUrl.name}`, - targetPath: dirPath, - }, + await fetchContents({ + reader, + integrations, + baseUrl: ctx.templateInfo?.baseUrl, + fetchUrl: `https://${parsedRepoUrl.resource}/${parsedRepoUrl.owner}/${parsedRepoUrl.name}`, + outputPath: ctx.workspacePath, }); for (const url of confluenceUrls) { From 5c0da7f277a3404bd03b0f79c952653479713004 Mon Sep 17 00:00:00 2001 From: Gio <6011354+gioufop@users.noreply.github.com> Date: Tue, 25 Jul 2023 08:44:23 -0300 Subject: [PATCH 029/440] git commit -s -m 'Add Zenklub to ADOPTERS.md' Signed-off-by: Gio <6011354+gioufop@users.noreply.github.com> --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 926c303313..cd340fd5f9 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -254,3 +254,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Celonis](https://celonis.com) | [@georgeyord](https://github.com/georgeyord), [@LauraMoraB](https://github.com/LauraMoraB), [@mariosant](https://github.com/mariosant), [@Rbillon59](https://github.com/Rbillon59) | Internal developer and product portal implementation. | | [Rabobank](https://www.rabobank.com) | [Willem Dekker](https://github.com/wdekker), [Sridhar Gnanasekaran](https://github.com/srid99), [Ruben Ernst](https://github.com/Ruben-E) | At Rabobank, our mission is to make life better for engineers. After exploring various options in the market, we've discovered that Backstage provides the perfect foundation for creating a platform that meets our engineers' needs and helps us achieve our goals. We want to make our engineers happy by offering standardized services, freeing them up to focus on delivering value. Our vision is to create a one-stop platform where engineers can find everything related to software and services. In practice, we're excited about using all the cool features in Backstage, and we're even planning to build our own plugins. | | [JB Hi-Fi](https://www.jbhifi.com.au) | [@bahman](https://github.com/bahman-jb/) | We use Backstage as a central place for all of our components/apis across multiple teams. It helps us to quickly identify the ownership of a component/api, find the related links and have a quick access to CI/CD pipelines. | +| [Zenklub](https://www.zenklub.com.br) | [@zenklub](https://github.com/zenklub), [@gioufop](https://github.com/gioufop) | Developer portal, services catalog and centralization of metrics from Grafana Stack and AWS. Furthermore, centralization of documentation and infra details like Tools, Network services and so on. | \ No newline at end of file From ee52a48b63d501874db0e7747752ee970e374be7 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Wed, 26 Jul 2023 08:15:33 +0530 Subject: [PATCH 030/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- .changeset/nervous-suits-give.md | 5 +++++ plugins/shortcuts/src/AddShortcut.tsx | 19 +++++++++++++------ plugins/shortcuts/src/EditShortcut.tsx | 19 +++++++++++++------ 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 .changeset/nervous-suits-give.md diff --git a/.changeset/nervous-suits-give.md b/.changeset/nervous-suits-give.md new file mode 100644 index 0000000000..e08d8d89a2 --- /dev/null +++ b/.changeset/nervous-suits-give.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-shortcuts': patch +--- + +Limit the use of the duplicate shortcut name when adding a shortcut diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index 15850ab389..70988c49eb 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -67,12 +67,19 @@ export const AddShortcut = ({ const shortcut: Omit = { url, title }; try { - await api.add(shortcut); - alertApi.post({ - message: `Added shortcut '${title}' to your sidebar`, - severity: 'success', - display: 'transient', - }); + if (api.get().some(shortcutTitle => shortcutTitle.title === title)) { + alertApi.post({ + message: `Shortcut title already exist`, + severity: 'error', + }); + } else { + await api.add(shortcut); + alertApi.post({ + message: `Added shortcut '${title}' to your sidebar`, + severity: 'success', + display: 'transient', + }); + } } catch (error) { alertApi.post({ message: `Could not add shortcut: ${error.message}`, diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index 9f2ffe10be..ecc14d93d9 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -70,12 +70,19 @@ export const EditShortcut = ({ }; try { - await api.update(newShortcut); - alertApi.post({ - message: `Updated shortcut '${title}'`, - severity: 'success', - display: 'transient', - }); + if (api.get().some(shortcutTitle => shortcutTitle.title === title)) { + alertApi.post({ + message: `Shortcut title already exist`, + severity: 'error', + }); + } else { + await api.update(newShortcut); + alertApi.post({ + message: `Updated shortcut '${title}'`, + severity: 'success', + display: 'transient', + }); + } } catch (error) { alertApi.post({ message: `Could not update shortcut: ${error.message}`, From 5d99ca9350573b07eca710a9e6f461e258abb818 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Wed, 26 Jul 2023 09:48:50 +0530 Subject: [PATCH 031/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/EditShortcut.tsx | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index ecc14d93d9..9f2ffe10be 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -70,19 +70,12 @@ export const EditShortcut = ({ }; try { - if (api.get().some(shortcutTitle => shortcutTitle.title === title)) { - alertApi.post({ - message: `Shortcut title already exist`, - severity: 'error', - }); - } else { - await api.update(newShortcut); - alertApi.post({ - message: `Updated shortcut '${title}'`, - severity: 'success', - display: 'transient', - }); - } + await api.update(newShortcut); + alertApi.post({ + message: `Updated shortcut '${title}'`, + severity: 'success', + display: 'transient', + }); } catch (error) { alertApi.post({ message: `Could not update shortcut: ${error.message}`, From d37b9c5aeeb9bc9925a63832a92d638aea5a04e5 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Wed, 26 Jul 2023 10:17:53 +0530 Subject: [PATCH 032/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.tsx | 7 +++++-- plugins/shortcuts/src/EditShortcut.tsx | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index 70988c49eb..32a5aaa947 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -63,11 +63,14 @@ export const AddShortcut = ({ const analytics = useAnalytics(); const handleSave: SubmitHandler = async ({ url, title }) => { - analytics.captureEvent('click', `Clicked 'Save' in AddShortcut`); + if (!api.get().some(shortcutTitle => shortcutTitle.title === title)) { + analytics.captureEvent('click', `Clicked 'Save' in AddShortcut`); + } const shortcut: Omit = { url, title }; + const shortcutData = api.get(); try { - if (api.get().some(shortcutTitle => shortcutTitle.title === title)) { + if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) { alertApi.post({ message: `Shortcut title already exist`, severity: 'error', diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index 9f2ffe10be..df0476f5db 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -62,7 +62,9 @@ export const EditShortcut = ({ const analytics = useAnalytics(); const handleSave: SubmitHandler = async ({ url, title }) => { - analytics.captureEvent('click', `Clicked 'Save' in Edit Shortcut`); + if (!api.get().some(shortcutTitle => shortcutTitle.title === title)) { + analytics.captureEvent('click', `Clicked 'Save' in Edit Shortcut`); + } const newShortcut: Shortcut = { ...shortcut, url, @@ -70,12 +72,19 @@ export const EditShortcut = ({ }; try { - await api.update(newShortcut); - alertApi.post({ - message: `Updated shortcut '${title}'`, - severity: 'success', - display: 'transient', - }); + if (api.get().some(shortcutTitle => shortcutTitle.title === title)) { + alertApi.post({ + message: `Shortcut title already exist`, + severity: 'error', + }); + } else { + await api.update(newShortcut); + alertApi.post({ + message: `Updated shortcut '${title}'`, + severity: 'success', + display: 'transient', + }); + } } catch (error) { alertApi.post({ message: `Could not update shortcut: ${error.message}`, From ceee1c3ca25377bfac35d137795dc85455bf9fa1 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Wed, 26 Jul 2023 11:28:41 +0530 Subject: [PATCH 033/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.tsx | 7 ++----- plugins/shortcuts/src/EditShortcut.tsx | 8 +++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index 32a5aaa947..e518a89934 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -61,20 +61,17 @@ export const AddShortcut = ({ const [formValues, setFormValues] = useState(); const open = Boolean(anchorEl); const analytics = useAnalytics(); + const shortcutData = api.get(); const handleSave: SubmitHandler = async ({ url, title }) => { if (!api.get().some(shortcutTitle => shortcutTitle.title === title)) { analytics.captureEvent('click', `Clicked 'Save' in AddShortcut`); } const shortcut: Omit = { url, title }; - const shortcutData = api.get(); try { if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) { - alertApi.post({ - message: `Shortcut title already exist`, - severity: 'error', - }); + throw new Error(`Shortcut Title '${title}' already Exist`); } else { await api.add(shortcut); alertApi.post({ diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index df0476f5db..5f1125e37a 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -60,6 +60,7 @@ export const EditShortcut = ({ const alertApi = useApi(alertApiRef); const open = Boolean(anchorEl); const analytics = useAnalytics(); + const shortcutData = api.get(); const handleSave: SubmitHandler = async ({ url, title }) => { if (!api.get().some(shortcutTitle => shortcutTitle.title === title)) { @@ -72,11 +73,8 @@ export const EditShortcut = ({ }; try { - if (api.get().some(shortcutTitle => shortcutTitle.title === title)) { - alertApi.post({ - message: `Shortcut title already exist`, - severity: 'error', - }); + if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) { + throw new Error(`Shortcut Title '${title}' already Exist`); } else { await api.update(newShortcut); alertApi.post({ From 5f296c6a50eb0114e55a86871d400ab737d4ab83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Mota?= Date: Wed, 26 Jul 2023 10:09:50 +0200 Subject: [PATCH 034/440] Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Mota --- plugins/devtools/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/devtools/README.md b/plugins/devtools/README.md index 09e76caaa4..3fbe8df4ac 100644 --- a/plugins/devtools/README.md +++ b/plugins/devtools/README.md @@ -210,7 +210,7 @@ To use the permission framework to secure the DevTools sidebar option you'll wan ``` 2. Then open the `packages/app/src/components/Root/Root.tsx` file -3. The add these imports after all the existing import statements: +3. Then add these imports after all the existing import statements: ```ts import { devToolsAdministerPermission } from '@backstage/plugin-devtools-common'; From 85803bf5a8acb00ea63d52928a62584d34acee0d Mon Sep 17 00:00:00 2001 From: "Flores, Juan" Date: Wed, 26 Jul 2023 13:30:38 +0100 Subject: [PATCH 035/440] Fixes Bug #18728 Signed-off-by: Flores, Juan --- .../software-templates/writing-custom-step-layouts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/software-templates/writing-custom-step-layouts.md b/docs/features/software-templates/writing-custom-step-layouts.md index 69d61b93dc..b965f60f6b 100644 --- a/docs/features/software-templates/writing-custom-step-layouts.md +++ b/docs/features/software-templates/writing-custom-step-layouts.md @@ -4,7 +4,7 @@ title: Writing custom step layouts description: How to override the default step form layout --- -Every form in each step rendered in the frontend uses the default form layout from [react-json-schema-form](https://react-jsonschema-form.readthedocs.io/). It is possible to override this behaviour by supplying a `ui:ObjectFieldTemplate` property for a particular step: +Every form in each step rendered in the frontend uses the default form layout from [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/docs/). It is possible to override this behaviour by supplying a `ui:ObjectFieldTemplate` property for a particular step: ```yaml parameters: @@ -12,7 +12,7 @@ parameters: ui:ObjectFieldTemplate: TwoColumn ``` -This is the same [field](https://react-jsonschema-form.readthedocs.io/en/latest/advanced-customization/custom-templates/#objectfieldtemplate) used by [react-json-schema-form](https://react-jsonschema-form.readthedocs.io/) but we need to add a couple of steps to ensure that the string value of `TwoColumn` above is resolved to a react component. +This is the same [field](https://rjsf-team.github.io/react-jsonschema-form/docs/advanced-customization/custom-templates#objectfieldtemplate) used by [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/docs/) but we need to add a couple of steps to ensure that the string value of `TwoColumn` above is resolved to a react component. ## Registering a React component as a custom step layout From 8a0490fb669ef8e9a43a965d0af0600006f76ab7 Mon Sep 17 00:00:00 2001 From: Mengnan Gong Date: Thu, 27 Jul 2023 14:21:31 +0800 Subject: [PATCH 036/440] Fix the query filter in the MyGroupsPicker The current implementation has filter `type=Group` which won't get any result from the catalog. I believe that the purpose of this component is to query `Group` kind entities: https://backstage.io/docs/features/software-catalog/descriptor-format#kind-group. Also fixed the tests to properly `await` the user events to avoid warnings like this: ``` console.error Warning: You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. at printWarning (../../../node_modules/react-dom/cjs/react-dom-test-utils.development.js:67:30) at error (../../../node_modules/react-dom/cjs/react-dom-test-utils.development.js:43:5) at onDone (../../../node_modules/react-dom/cjs/react-dom-test-utils.development.js:1034:9) at ../../../node_modules/react-dom/cjs/react-dom-test-utils.development.js:1073:13 ``` Signed-off-by: Mengnan Gong --- .changeset/cold-numbers-sleep.md | 5 +++++ .../fields/MyGroupsPicker/MyGroupsPicker.test.tsx | 12 ++++++------ .../fields/MyGroupsPicker/MyGroupsPicker.tsx | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 .changeset/cold-numbers-sleep.md diff --git a/.changeset/cold-numbers-sleep.md b/.changeset/cold-numbers-sleep.md new file mode 100644 index 0000000000..ac53307b07 --- /dev/null +++ b/.changeset/cold-numbers-sleep.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Fix the get entities query in the `MyGroupsPicker` to query the `kind=Group` entities. diff --git a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx index 0bdfe5f153..099d6fa6ed 100644 --- a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.test.tsx @@ -129,7 +129,7 @@ describe('', () => { expect(catalogApi.getEntities).toHaveBeenCalledWith({ filter: { - type: 'Group', + kind: 'Group', 'relations.hasMember': ['user:default/bob'], }, }); @@ -201,8 +201,8 @@ describe('', () => { // Simulate user input const inputField = getByRole('combobox'); - userEvent.click(inputField); - userEvent.type(inputField, 'group'); + await userEvent.click(inputField); + await userEvent.type(inputField, 'group'); // Wait for the dropdown elements to appear await waitFor(() => { @@ -257,8 +257,8 @@ describe('', () => { ); const inputField = getByRole('combobox'); - userEvent.click(inputField); - userEvent.type(inputField, 'group'); + await userEvent.click(inputField); + await userEvent.type(inputField, 'group'); await waitFor(() => { expect( @@ -267,7 +267,7 @@ describe('', () => { }); const option = getByRole('option', { name: 'My First Group' }); - userEvent.click(option); + await userEvent.click(option); await waitFor(() => { expect(onChange).toHaveBeenCalledTimes(1); diff --git a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx index 28bc2b93fa..fefdd4230c 100644 --- a/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx +++ b/plugins/scaffolder/src/components/fields/MyGroupsPicker/MyGroupsPicker.tsx @@ -62,7 +62,7 @@ export const MyGroupsPicker = (props: MyGroupsPickerProps) => { const { items } = await catalogApi.getEntities({ filter: { - type: 'Group', + kind: 'Group', ['relations.hasMember']: [userEntityRef], }, }); From b0d9047894644a97d171dd7331c43d0c4c69e872 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Thu, 27 Jul 2023 12:02:13 +0530 Subject: [PATCH 037/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.tsx | 4 +--- plugins/shortcuts/src/EditShortcut.tsx | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index e518a89934..d1a17f267f 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -64,9 +64,7 @@ export const AddShortcut = ({ const shortcutData = api.get(); const handleSave: SubmitHandler = async ({ url, title }) => { - if (!api.get().some(shortcutTitle => shortcutTitle.title === title)) { - analytics.captureEvent('click', `Clicked 'Save' in AddShortcut`); - } + analytics.captureEvent('click', `Clicked 'Save' in AddShortcut`); const shortcut: Omit = { url, title }; try { diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index 5f1125e37a..288b35d9f0 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -63,9 +63,7 @@ export const EditShortcut = ({ const shortcutData = api.get(); const handleSave: SubmitHandler = async ({ url, title }) => { - if (!api.get().some(shortcutTitle => shortcutTitle.title === title)) { - analytics.captureEvent('click', `Clicked 'Save' in Edit Shortcut`); - } + analytics.captureEvent('click', `Clicked 'Save' in Edit Shortcut`); const newShortcut: Shortcut = { ...shortcut, url, From 2ec7d0cdf8c7a8eb14b1528ad3708170679fd6ac Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Thu, 27 Jul 2023 15:38:43 +0530 Subject: [PATCH 038/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.tsx | 17 ++++++----------- plugins/shortcuts/src/EditShortcut.tsx | 17 ++++++----------- plugins/shortcuts/src/ShortcutForm.tsx | 11 +++++++++++ 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.tsx b/plugins/shortcuts/src/AddShortcut.tsx index d1a17f267f..15850ab389 100644 --- a/plugins/shortcuts/src/AddShortcut.tsx +++ b/plugins/shortcuts/src/AddShortcut.tsx @@ -61,23 +61,18 @@ export const AddShortcut = ({ const [formValues, setFormValues] = useState(); const open = Boolean(anchorEl); const analytics = useAnalytics(); - const shortcutData = api.get(); const handleSave: SubmitHandler = async ({ url, title }) => { analytics.captureEvent('click', `Clicked 'Save' in AddShortcut`); const shortcut: Omit = { url, title }; try { - if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) { - throw new Error(`Shortcut Title '${title}' already Exist`); - } else { - await api.add(shortcut); - alertApi.post({ - message: `Added shortcut '${title}' to your sidebar`, - severity: 'success', - display: 'transient', - }); - } + await api.add(shortcut); + alertApi.post({ + message: `Added shortcut '${title}' to your sidebar`, + severity: 'success', + display: 'transient', + }); } catch (error) { alertApi.post({ message: `Could not add shortcut: ${error.message}`, diff --git a/plugins/shortcuts/src/EditShortcut.tsx b/plugins/shortcuts/src/EditShortcut.tsx index 288b35d9f0..9f2ffe10be 100644 --- a/plugins/shortcuts/src/EditShortcut.tsx +++ b/plugins/shortcuts/src/EditShortcut.tsx @@ -60,7 +60,6 @@ export const EditShortcut = ({ const alertApi = useApi(alertApiRef); const open = Boolean(anchorEl); const analytics = useAnalytics(); - const shortcutData = api.get(); const handleSave: SubmitHandler = async ({ url, title }) => { analytics.captureEvent('click', `Clicked 'Save' in Edit Shortcut`); @@ -71,16 +70,12 @@ export const EditShortcut = ({ }; try { - if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) { - throw new Error(`Shortcut Title '${title}' already Exist`); - } else { - await api.update(newShortcut); - alertApi.post({ - message: `Updated shortcut '${title}'`, - severity: 'success', - display: 'transient', - }); - } + await api.update(newShortcut); + alertApi.post({ + message: `Updated shortcut '${title}'`, + severity: 'success', + display: 'transient', + }); } catch (error) { alertApi.post({ message: `Could not update shortcut: ${error.message}`, diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 99aa0d29b7..2b5aae52d9 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -24,6 +24,7 @@ import { TextField, } from '@material-ui/core'; import { FormValues } from './types'; +import { ShortcutApi } from './api'; const useStyles = makeStyles(theme => ({ field: { @@ -39,6 +40,7 @@ const useStyles = makeStyles(theme => ({ type Props = { formValues?: FormValues; onSave: SubmitHandler; + api: ShortcutApi; onClose: () => void; allowExternalLinks?: boolean; }; @@ -46,10 +48,12 @@ type Props = { export const ShortcutForm = ({ formValues, onSave, + api, onClose, allowExternalLinks, }: Props) => { const classes = useStyles(); + const shortcutData = api.get(); const { handleSubmit, reset, @@ -63,6 +67,12 @@ export const ShortcutForm = ({ }, }); + const titleIsUnique = async (title: string) => { + if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) + return 'This title name is already exist'; + return true; + }; + useEffect(() => { reset(formValues); }, [reset, formValues]); @@ -112,6 +122,7 @@ export const ShortcutForm = ({ control={control} rules={{ required: true, + validate: titleIsUnique, minLength: { value: 2, message: 'Must be at least 2 characters', From 788afefcf332ea2817c8f2859599894a58d6de5f Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Thu, 27 Jul 2023 15:54:27 +0530 Subject: [PATCH 039/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 2b5aae52d9..891739f299 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -24,7 +24,8 @@ import { TextField, } from '@material-ui/core'; import { FormValues } from './types'; -import { ShortcutApi } from './api'; +import { shortcutsApiRef } from './api'; +import { useApi } from '@backstage/core-plugin-api'; const useStyles = makeStyles(theme => ({ field: { @@ -40,7 +41,7 @@ const useStyles = makeStyles(theme => ({ type Props = { formValues?: FormValues; onSave: SubmitHandler; - api: ShortcutApi; + // api: ShortcutApi; onClose: () => void; allowExternalLinks?: boolean; }; @@ -48,12 +49,13 @@ type Props = { export const ShortcutForm = ({ formValues, onSave, - api, + // api, onClose, allowExternalLinks, }: Props) => { const classes = useStyles(); - const shortcutData = api.get(); + const shortcutApi = useApi(shortcutsApiRef); + const shortcutData = shortcutApi.get(); const { handleSubmit, reset, From 3ed5a3fdb996f84156d0ed65c6cb3d1236219094 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Thu, 27 Jul 2023 15:56:06 +0530 Subject: [PATCH 040/440] Limit the use of the same shortcut name when adding a shortcut Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 891739f299..f8a53620ee 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -41,7 +41,6 @@ const useStyles = makeStyles(theme => ({ type Props = { formValues?: FormValues; onSave: SubmitHandler; - // api: ShortcutApi; onClose: () => void; allowExternalLinks?: boolean; }; @@ -49,7 +48,6 @@ type Props = { export const ShortcutForm = ({ formValues, onSave, - // api, onClose, allowExternalLinks, }: Props) => { From e8fa09e881ef60d68daead5cd75c14d207066600 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Thu, 27 Jul 2023 16:08:16 +0530 Subject: [PATCH 041/440] Limit the use of the same shortcut name when adding a shortcut- added test cases Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.test.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 3a52356b5d..0e878c1fa4 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -40,6 +40,9 @@ describe('ShortcutForm', () => { expect( screen.getByText('Must be at least 2 characters'), ).toBeInTheDocument(); + expect( + screen.getByText('This title name is already exist'), + ).toBeInTheDocument(); }); }); From 2fe1f5973ff7592b45d05b632cbe9af8c1387c0d Mon Sep 17 00:00:00 2001 From: alessandro Date: Thu, 27 Jul 2023 15:10:03 +0200 Subject: [PATCH 042/440] feat(catalog-backend-module-gitlab): Filter Gitlab archived projects through APIs Signed-off-by: alessandro --- .changeset/serious-papayas-shout.md | 5 +++++ .../src/GitLabDiscoveryProcessor.ts | 5 +---- plugins/catalog-backend-module-gitlab/src/lib/client.ts | 1 + .../src/providers/GitlabDiscoveryEntityProvider.ts | 5 +---- 4 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 .changeset/serious-papayas-shout.md diff --git a/.changeset/serious-papayas-shout.md b/.changeset/serious-papayas-shout.md new file mode 100644 index 0000000000..f426dd02c7 --- /dev/null +++ b/.changeset/serious-papayas-shout.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Filter Gitlab archived projects through APIs diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts index c9bd4d9187..02b1b1cb51 100644 --- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts @@ -109,6 +109,7 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { const lastActivity = (await this.cache.get(this.getCacheKey())) as string; const opts = { + archived: false, group, page: 1, // We check for the existence of lastActivity and only set it if it's present to ensure @@ -125,10 +126,6 @@ export class GitLabDiscoveryProcessor implements CatalogProcessor { for await (const project of projects) { res.scanned++; - if (project.archived) { - continue; - } - if (branch === '*' && project.default_branch === undefined) { continue; } diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index f0e169d8df..41b99e1c5b 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -30,6 +30,7 @@ export type CommonListOptions = { }; interface ListProjectOptions extends CommonListOptions { + archived?: boolean; group?: string; } diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index 08d2fe48a7..ce7a304746 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -155,6 +155,7 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { const projects = paginated( options => client.listProjects(options), { + archived: false, group: this.config.group, page: 1, per_page: 50, @@ -173,10 +174,6 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider { res.scanned++; - if (project.archived) { - continue; - } - if ( this.config.skipForkedRepos && project.hasOwnProperty('forked_from_project') From 0bbe37dd6cf3af57b8ac3caa41695560fb2efe66 Mon Sep 17 00:00:00 2001 From: Abhijeet Gaurav Date: Thu, 27 Jul 2023 16:21:13 +0000 Subject: [PATCH 043/440] fixed:Broken links in documentation Signed-off-by: Abhijeet Gaurav --- docs/backend-system/architecture/01-index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/backend-system/architecture/01-index.md b/docs/backend-system/architecture/01-index.md index aff730b0d1..256d43bc4c 100644 --- a/docs/backend-system/architecture/01-index.md +++ b/docs/backend-system/architecture/01-index.md @@ -59,7 +59,7 @@ Just like plugins, modules also have access to services and can depend on their A detailed explanation of the package architecture can be found in the [Backstage Architecture -Overview](../../overview/architecture-overview.md#package-architecture). The +Overview](../../overview/architecture-overview/#package-architecture). The most important packages to consider for this system are the following: - `plugin--backend` houses the implementation of the backend plugins From 290eff6692aa3a72beb306566fe2052fbc6a73eb Mon Sep 17 00:00:00 2001 From: Matthew Clarke Date: Thu, 27 Jul 2023 15:09:23 -0400 Subject: [PATCH 044/440] feat: GKE Resource provider (#18759) * feat: GKE Resource provider Signed-off-by: Matthew Clarke * feat: configurable parents Signed-off-by: Matthew Clarke * chore: changeset Signed-off-by: Matthew Clarke * test: happy path test Signed-off-by: Matthew Clarke * chore: typos Signed-off-by: Matthew Clarke * docs: api-reports Signed-off-by: Matthew Clarke * docs: readme Signed-off-by: Matthew Clarke --------- Signed-off-by: Matthew Clarke --- .changeset/tough-dolphins-care.md | 5 + .../catalog-backend-module-gcp/.eslintrc.js | 1 + plugins/catalog-backend-module-gcp/README.md | 41 +++ .../alpha-api-report.md | 7 + .../catalog-backend-module-gcp/api-report.md | 48 ++++ .../catalog-backend-module-gcp/config.d.ts | 45 ++++ .../catalog-backend-module-gcp/package.json | 66 +++++ .../catalog-backend-module-gcp/src/alpha.ts | 23 ++ .../catalog-backend-module-gcp/src/index.ts | 24 ++ .../catalogModuleGcpGkeEntityProvider.ts | 52 ++++ .../src/module/index.ts | 17 ++ .../src/providers/GkeEntityProvider.test.ts | 251 ++++++++++++++++++ .../src/providers/GkeEntityProvider.ts | 223 ++++++++++++++++ .../src/providers/index.ts | 17 ++ .../src/setupTests.ts | 17 ++ yarn.lock | 25 +- 16 files changed, 858 insertions(+), 4 deletions(-) create mode 100644 .changeset/tough-dolphins-care.md create mode 100644 plugins/catalog-backend-module-gcp/.eslintrc.js create mode 100644 plugins/catalog-backend-module-gcp/README.md create mode 100644 plugins/catalog-backend-module-gcp/alpha-api-report.md create mode 100644 plugins/catalog-backend-module-gcp/api-report.md create mode 100644 plugins/catalog-backend-module-gcp/config.d.ts create mode 100644 plugins/catalog-backend-module-gcp/package.json create mode 100644 plugins/catalog-backend-module-gcp/src/alpha.ts create mode 100644 plugins/catalog-backend-module-gcp/src/index.ts create mode 100644 plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts create mode 100644 plugins/catalog-backend-module-gcp/src/module/index.ts create mode 100644 plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.test.ts create mode 100644 plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.ts create mode 100644 plugins/catalog-backend-module-gcp/src/providers/index.ts create mode 100644 plugins/catalog-backend-module-gcp/src/setupTests.ts diff --git a/.changeset/tough-dolphins-care.md b/.changeset/tough-dolphins-care.md new file mode 100644 index 0000000000..7d9739ec10 --- /dev/null +++ b/.changeset/tough-dolphins-care.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gcp': minor +--- + +Added GCP catalog plugin with GKE provider diff --git a/plugins/catalog-backend-module-gcp/.eslintrc.js b/plugins/catalog-backend-module-gcp/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/catalog-backend-module-gcp/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-backend-module-gcp/README.md b/plugins/catalog-backend-module-gcp/README.md new file mode 100644 index 0000000000..d1ef926310 --- /dev/null +++ b/plugins/catalog-backend-module-gcp/README.md @@ -0,0 +1,41 @@ +# Catalog Backend Module for GCP + +This is an extension module to the plugin-catalog-backend plugin, containing catalog processors and providers to ingest GCP resources as `Resource` kind entities. + +## installation + +Register the plugin in `catalog.ts`` + +```typescript +import { GkeEntityProvider } from '@backstage/plugin-catalog-backend-module-gcp'; + +... + +builder.addEntityProvider( + GkeEntityProvider.fromConfig({ + logger: env.logger, + scheduler: env.scheduler, + config: env.config + }) +); +``` + +Update `app-config.yaml` as follows: + +```yaml +catalog: + providers: + gcp: + gke: + parents: + # consult https://cloud.google.com/kubernetes-engine/docs/ for valid values + # list all clusters in the project + - 'projects/some-project/locations/-' + # list all clusters in the region, in the project + - 'projects/some-other-project/locations/some-region' + schedule: # optional; same options as in TaskScheduleDefinition + # supports cron, ISO duration, "human duration" as used in code + frequency: { minutes: 30 } + # supports ISO duration, "human duration" as used in code + timeout: { minutes: 3 } +``` diff --git a/plugins/catalog-backend-module-gcp/alpha-api-report.md b/plugins/catalog-backend-module-gcp/alpha-api-report.md new file mode 100644 index 0000000000..6e6f0427e9 --- /dev/null +++ b/plugins/catalog-backend-module-gcp/alpha-api-report.md @@ -0,0 +1,7 @@ +## API Report File for "@backstage/plugin-catalog-backend-module-gcp" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +``` diff --git a/plugins/catalog-backend-module-gcp/api-report.md b/plugins/catalog-backend-module-gcp/api-report.md new file mode 100644 index 0000000000..6f963ed51d --- /dev/null +++ b/plugins/catalog-backend-module-gcp/api-report.md @@ -0,0 +1,48 @@ +## API Report File for "@backstage/plugin-catalog-backend-module-gcp" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; +import { Config } from '@backstage/config'; +import * as container from '@google-cloud/container'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; +import { Logger } from 'winston'; +import { SchedulerService } from '@backstage/backend-plugin-api'; + +// @public +export const catalogModuleGcpGkeEntityProvider: () => BackendFeature; + +// @public +export class GkeEntityProvider implements EntityProvider { + // (undocumented) + connect(connection: EntityProviderConnection): Promise; + // (undocumented) + static fromConfig({ + logger, + scheduler, + config, + }: { + logger: Logger; + scheduler: SchedulerService; + config: Config; + }): GkeEntityProvider; + // (undocumented) + static fromConfigWithClient({ + logger, + scheduler, + config, + clusterManagerClient, + }: { + logger: Logger; + scheduler: SchedulerService; + config: Config; + clusterManagerClient: container.v1.ClusterManagerClient; + }): GkeEntityProvider; + // (undocumented) + getProviderName(): string; + // (undocumented) + refresh(): Promise; +} +``` diff --git a/plugins/catalog-backend-module-gcp/config.d.ts b/plugins/catalog-backend-module-gcp/config.d.ts new file mode 100644 index 0000000000..d6884d32ce --- /dev/null +++ b/plugins/catalog-backend-module-gcp/config.d.ts @@ -0,0 +1,45 @@ +/* + * 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 { TaskScheduleDefinitionConfig } from '@backstage/backend-tasks'; + +export interface Config { + catalog?: { + /** + * List of provider-specific options and attributes + */ + providers?: { + /** + * GCPCatalogModuleConfig configuration + */ + gcp?: { + /** + * Config for GKE clusters + */ + gke?: { + /** + * Locations to list clusters from + */ + parents: string[]; + /** + * (Optional) TaskScheduleDefinition for the refresh. + */ + schedule: TaskScheduleDefinitionConfig; + }; + }; + }; + }; +} diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json new file mode 100644 index 0000000000..12285d26eb --- /dev/null +++ b/plugins/catalog-backend-module-gcp/package.json @@ -0,0 +1,66 @@ +{ + "name": "@backstage/plugin-catalog-backend-module-gcp", + "description": "A Backstage catalog backend module that helps integrate towards GCP", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, + "backstage": { + "role": "backend-plugin-module" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/catalog-backend-module-gcp" + }, + "keywords": [ + "backstage" + ], + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "clean": "backstage-cli package clean" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", + "@backstage/backend-tasks": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", + "@backstage/plugin-kubernetes-common": "workspace:^", + "@google-cloud/container": "^4.15.0", + "winston": "^3.2.1" + }, + "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", + "@backstage/cli": "workspace:^" + }, + "files": [ + "config.d.ts", + "dist" + ], + "configSchema": "config.d.ts" +} diff --git a/plugins/catalog-backend-module-gcp/src/alpha.ts b/plugins/catalog-backend-module-gcp/src/alpha.ts new file mode 100644 index 0000000000..9eec69e76f --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/alpha.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +/** + * A Backstage catalog backend module that helps integrate towards GCP + * + * @packageDocumentation + */ + +export {}; diff --git a/plugins/catalog-backend-module-gcp/src/index.ts b/plugins/catalog-backend-module-gcp/src/index.ts new file mode 100644 index 0000000000..fb3984a04d --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/index.ts @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * A Backstage catalog backend module that helps integrate towards GCP + * + * @packageDocumentation + */ + +export * from './providers'; +export * from './module'; diff --git a/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts b/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts new file mode 100644 index 0000000000..c13c6cbe0e --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts @@ -0,0 +1,52 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { GkeEntityProvider } from '../providers/GkeEntityProvider'; + +/** + * Registers the GcpGkeEntityProvider with the catalog processing extension point. + * + * @public + */ +export const catalogModuleGcpGkeEntityProvider = createBackendModule({ + pluginId: 'catalog', + moduleId: 'gcpGkeEntityProvider', + register(env) { + env.registerInit({ + deps: { + config: coreServices.config, + catalog: catalogProcessingExtensionPoint, + logger: coreServices.logger, + scheduler: coreServices.scheduler, + }, + async init({ config, catalog, logger, scheduler }) { + catalog.addEntityProvider( + GkeEntityProvider.fromConfig({ + logger: loggerToWinstonLogger(logger), + scheduler, + config, + }), + ); + }, + }); + }, +}); diff --git a/plugins/catalog-backend-module-gcp/src/module/index.ts b/plugins/catalog-backend-module-gcp/src/module/index.ts new file mode 100644 index 0000000000..c7cd310c97 --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export { catalogModuleGcpGkeEntityProvider } from './catalogModuleGcpGkeEntityProvider'; diff --git a/plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.test.ts b/plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.test.ts new file mode 100644 index 0000000000..20e91a85bf --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.test.ts @@ -0,0 +1,251 @@ +/* + * 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 { GkeEntityProvider } from './GkeEntityProvider'; +import { TaskRunner } from '@backstage/backend-tasks'; +import { + ANNOTATION_KUBERNETES_API_SERVER, + ANNOTATION_KUBERNETES_API_SERVER_CA, + ANNOTATION_KUBERNETES_AUTH_PROVIDER, +} from '@backstage/plugin-kubernetes-common'; +import * as container from '@google-cloud/container'; +import { ConfigReader } from '@backstage/config'; + +describe('GkeEntityProvider', () => { + const clusterManagerClientMock = { + listClusters: jest.fn(), + }; + const connectionMock = { + applyMutation: jest.fn(), + refresh: jest.fn(), + }; + const taskRunner = { + createScheduleFn: jest.fn(), + run: jest.fn(), + } as TaskRunner; + const schedulerMock = { + createScheduledTaskRunner: jest.fn(), + } as any; + const logger = { + info: jest.fn(), + error: jest.fn(), + }; + let gkeEntityProvider: GkeEntityProvider; + + beforeEach(async () => { + jest.resetAllMocks(); + schedulerMock.createScheduledTaskRunner.mockReturnValue(taskRunner); + gkeEntityProvider = GkeEntityProvider.fromConfigWithClient({ + logger: logger as any, + config: new ConfigReader({ + catalog: { + providers: { + gcp: { + gke: { + parents: ['parent1', 'parent2'], + schedule: { + frequency: { + minutes: 3, + }, + timeout: { + minutes: 3, + }, + }, + }, + }, + }, + }, + }), + scheduler: schedulerMock, + clusterManagerClient: clusterManagerClientMock as any, + }); + await gkeEntityProvider.connect(connectionMock); + }); + + it('should return clusters as Resources', async () => { + clusterManagerClientMock.listClusters.mockImplementation(req => { + if (req.parent === 'parent1') { + return [ + { + clusters: [ + { + name: 'some-cluster', + endpoint: 'http://127.0.0.1:1234', + location: 'some-location', + selfLink: 'http://127.0.0.1/some-link', + masterAuth: { + clusterCaCertificate: 'abcdefg', + }, + }, + ], + }, + ]; + } else if (req.parent === 'parent2') { + return [ + { + clusters: [ + { + name: 'some-other-cluster', + endpoint: 'http://127.0.0.1:5678', + location: 'some-other-location', + selfLink: 'http://127.0.0.1/some-other-link', + masterAuth: { + // no CA cert is ok + }, + }, + ], + }, + ]; + } + + throw new Error(`unexpected parent ${req.parent}`); + }); + await gkeEntityProvider.refresh(); + expect(connectionMock.applyMutation).toHaveBeenCalledWith({ + type: 'full', + entities: [ + { + locationKey: 'gcp-gke:some-location', + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Resource', + metadata: { + annotations: { + [ANNOTATION_KUBERNETES_API_SERVER]: 'http://127.0.0.1:1234', + [ANNOTATION_KUBERNETES_API_SERVER_CA]: 'abcdefg', + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'google', + 'backstage.io/managed-by-location': 'gcp-gke:some-location', + 'backstage.io/managed-by-origin-location': + 'gcp-gke:some-location', + }, + name: 'some-cluster', + namespace: 'default', + }, + spec: { + type: 'kubernetes-cluster', + owner: 'unknown', + }, + }, + }, + { + locationKey: 'gcp-gke:some-other-location', + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Resource', + metadata: { + annotations: { + [ANNOTATION_KUBERNETES_API_SERVER]: 'http://127.0.0.1:5678', + [ANNOTATION_KUBERNETES_API_SERVER_CA]: '', + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'google', + 'backstage.io/managed-by-location': + 'gcp-gke:some-other-location', + 'backstage.io/managed-by-origin-location': + 'gcp-gke:some-other-location', + }, + name: 'some-other-cluster', + namespace: 'default', + }, + spec: { + type: 'kubernetes-cluster', + owner: 'unknown', + }, + }, + }, + ], + }); + }); + + const ignoredPartialClustersTests: [ + string, + container.protos.google.container.v1.ICluster, + ][] = [ + [ + 'no-cluster-name', + { + endpoint: 'http://127.0.0.1:1234', + location: 'some-location', + selfLink: 'http://127.0.0.1/some-link', + masterAuth: { + clusterCaCertificate: 'abcdefg', + }, + }, + ], + [ + 'no-self-link', + { + // no selfLink + name: 'some-name', + endpoint: 'http://127.0.0.1:1234', + location: 'some-location', + masterAuth: { + clusterCaCertificate: 'abcdefg', + }, + }, + ], + [ + 'no-endpoint', + { + name: 'some-name', + location: 'some-location', + selfLink: 'http://127.0.0.1/some-link', + masterAuth: { + clusterCaCertificate: 'abcdefg', + }, + }, + ], + [ + 'no-location', + { + name: 'some-name', + endpoint: 'http://127.0.0.1:1234', + selfLink: 'http://127.0.0.1/some-link', + masterAuth: { + clusterCaCertificate: 'abcdefg', + }, + }, + ], + ]; + + it.each(ignoredPartialClustersTests)( + 'ignore cluster - %s', + async (_name, ignoredCluster) => { + clusterManagerClientMock.listClusters.mockImplementation(req => { + if (req.parent === 'parent1') { + return [ignoredCluster]; + } + return [ + { + clusters: [], + }, + ]; + }); + await gkeEntityProvider.refresh(); + expect(connectionMock.applyMutation).toHaveBeenCalledWith({ + type: 'full', + entities: [], + }); + }, + ); + + it('should log GKE API errors', async () => { + clusterManagerClientMock.listClusters.mockRejectedValue( + new Error('some-error'), + ); + await gkeEntityProvider.refresh(); + expect(connectionMock.applyMutation).toHaveBeenCalledTimes(0); + expect(logger.error).toHaveBeenCalledTimes(1); + }); +}); diff --git a/plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.ts b/plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.ts new file mode 100644 index 0000000000..0130955737 --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/providers/GkeEntityProvider.ts @@ -0,0 +1,223 @@ +/* + * 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 { + TaskRunner, + readTaskScheduleDefinitionFromConfig, +} from '@backstage/backend-tasks'; +import { + DeferredEntity, + EntityProvider, + EntityProviderConnection, +} from '@backstage/plugin-catalog-node'; + +import { Logger } from 'winston'; +import * as container from '@google-cloud/container'; +import { + ANNOTATION_KUBERNETES_API_SERVER, + ANNOTATION_KUBERNETES_API_SERVER_CA, + ANNOTATION_KUBERNETES_AUTH_PROVIDER, +} from '@backstage/plugin-kubernetes-common'; +import { Config } from '@backstage/config'; +import { SchedulerService } from '@backstage/backend-plugin-api'; + +/** + * Catalog provider to ingest GKE clusters + * + * @public + */ +export class GkeEntityProvider implements EntityProvider { + private readonly logger: Logger; + private readonly scheduleFn: () => Promise; + private readonly gkeParents: string[]; + private readonly clusterManagerClient: container.v1.ClusterManagerClient; + private connection?: EntityProviderConnection; + + private constructor( + logger: Logger, + taskRunner: TaskRunner, + gkeParents: string[], + clusterManagerClient: container.v1.ClusterManagerClient, + ) { + this.logger = logger; + this.scheduleFn = this.createScheduleFn(taskRunner); + this.gkeParents = gkeParents; + this.clusterManagerClient = clusterManagerClient; + } + + public static fromConfig({ + logger, + scheduler, + config, + }: { + logger: Logger; + scheduler: SchedulerService; + config: Config; + }) { + return GkeEntityProvider.fromConfigWithClient({ + logger, + scheduler: scheduler, + config, + clusterManagerClient: new container.v1.ClusterManagerClient(), + }); + } + + public static fromConfigWithClient({ + logger, + scheduler, + config, + clusterManagerClient, + }: { + logger: Logger; + scheduler: SchedulerService; + config: Config; + clusterManagerClient: container.v1.ClusterManagerClient; + }) { + const gkeProviderConfig = config.getConfig('catalog.providers.gcp.gke'); + const schedule = readTaskScheduleDefinitionFromConfig( + gkeProviderConfig.getConfig('schedule'), + ); + return new GkeEntityProvider( + logger, + scheduler.createScheduledTaskRunner(schedule), + gkeProviderConfig.getStringArray('parents'), + clusterManagerClient, + ); + } + + getProviderName(): string { + return `gcp-gke`; + } + + async connect(connection: EntityProviderConnection): Promise { + this.connection = connection; + await this.scheduleFn(); + } + + private filterOutUndefinedDeferredEntity( + e: DeferredEntity | undefined, + ): e is DeferredEntity { + return e !== undefined; + } + + private filterOutUndefinedCluster( + c: container.protos.google.container.v1.ICluster | null | undefined, + ): c is container.protos.google.container.v1.ICluster { + return c !== undefined && c !== null; + } + + private clusterToResource( + cluster: container.protos.google.container.v1.ICluster, + ): DeferredEntity | undefined { + const location = `${this.getProviderName()}:${cluster.location}`; + + if (!cluster.name || !cluster.selfLink || !location || !cluster.endpoint) { + this.logger.warn( + `ignoring partial cluster, one of name=${cluster.name}, endpoint=${cluster.endpoint}, selfLink=${cluster.selfLink} or location=${cluster.location} is missing`, + ); + return undefined; + } + + // TODO fix location type + return { + locationKey: location, + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Resource', + metadata: { + annotations: { + [ANNOTATION_KUBERNETES_API_SERVER]: cluster.endpoint, + [ANNOTATION_KUBERNETES_API_SERVER_CA]: + cluster.masterAuth?.clusterCaCertificate || '', + [ANNOTATION_KUBERNETES_AUTH_PROVIDER]: 'google', + 'backstage.io/managed-by-location': location, + 'backstage.io/managed-by-origin-location': location, + }, + name: cluster.name, + namespace: 'default', + }, + spec: { + type: 'kubernetes-cluster', + owner: 'unknown', + }, + }, + }; + } + + private createScheduleFn(taskRunner: TaskRunner): () => Promise { + return async () => { + const taskId = `${this.getProviderName()}:refresh`; + return taskRunner.run({ + id: taskId, + fn: async () => { + try { + await this.refresh(); + } catch (error) { + this.logger.error(error); + } + }, + }); + }; + } + + private async getClusters(): Promise< + container.protos.google.container.v1.ICluster[] + > { + const clusters = await Promise.all( + this.gkeParents.map(async parent => { + const request = { + parent: parent, + }; + const [response] = await this.clusterManagerClient.listClusters( + request, + ); + return response.clusters?.filter(this.filterOutUndefinedCluster) ?? []; + }), + ); + return clusters.flat(); + } + + async refresh() { + if (!this.connection) { + throw new Error('Not initialized'); + } + + this.logger.info('Discovering GKE clusters'); + + let clusters: container.protos.google.container.v1.ICluster[]; + + try { + clusters = await this.getClusters(); + } catch (e) { + this.logger.error('error fetching GKE clusters', e); + return; + } + const resources = + clusters + .map(c => this.clusterToResource(c)) + .filter(this.filterOutUndefinedDeferredEntity) ?? []; + + this.logger.info( + `Ingesting GKE clusters [${resources + .map(r => r.entity.metadata.name) + .join(', ')}]`, + ); + + await this.connection.applyMutation({ + type: 'full', + entities: resources, + }); + } +} diff --git a/plugins/catalog-backend-module-gcp/src/providers/index.ts b/plugins/catalog-backend-module-gcp/src/providers/index.ts new file mode 100644 index 0000000000..7846afc3ed --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/providers/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { GkeEntityProvider } from './GkeEntityProvider'; diff --git a/plugins/catalog-backend-module-gcp/src/setupTests.ts b/plugins/catalog-backend-module-gcp/src/setupTests.ts new file mode 100644 index 0000000000..aa70772592 --- /dev/null +++ b/plugins/catalog-backend-module-gcp/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export {}; diff --git a/yarn.lock b/yarn.lock index 3f9b0ee1bc..eec689ba6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5160,6 +5160,23 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-catalog-backend-module-gcp@workspace:plugins/catalog-backend-module-gcp": + version: 0.0.0-use.local + resolution: "@backstage/plugin-catalog-backend-module-gcp@workspace:plugins/catalog-backend-module-gcp" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-tasks": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" + "@backstage/plugin-kubernetes-common": "workspace:^" + "@google-cloud/container": ^4.15.0 + winston: ^3.2.1 + languageName: unknown + linkType: soft + "@backstage/plugin-catalog-backend-module-gerrit@workspace:plugins/catalog-backend-module-gerrit": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-backend-module-gerrit@workspace:plugins/catalog-backend-module-gerrit" @@ -10912,12 +10929,12 @@ __metadata: languageName: node linkType: hard -"@google-cloud/container@npm:^4.0.0": - version: 4.13.0 - resolution: "@google-cloud/container@npm:4.13.0" +"@google-cloud/container@npm:^4.0.0, @google-cloud/container@npm:^4.15.0": + version: 4.15.0 + resolution: "@google-cloud/container@npm:4.15.0" dependencies: google-gax: ^3.5.8 - checksum: 21e57e8c69e2df8cf6899541dc405f9a6c05d999289cf211c2bb8dc6e33bf7ef36ff255cfde75c6448dd335fb5b707e77f5df49bee561decbd5ed398c58db6f6 + checksum: e81f1b708ab44c55b8e998d34c442baed10a113828ef51b4a84b806a2b04a10a0dc40ee0aa202386ac6158b34b9d3f03467d7008da9e4f709fdb1f021e725b8c languageName: node linkType: hard From a24d9df8757c61f9dc09684cc6bc489e980d94db Mon Sep 17 00:00:00 2001 From: Connor Younglund Date: Thu, 27 Jul 2023 15:19:52 -0400 Subject: [PATCH 045/440] [sonarqube-backend plugin] added optional `externalUrl` config Signed-off-by: Connor Younglund --- .changeset/warm-peas-hang.md | 5 +++ plugins/sonarqube-backend/README.md | 28 ++++++++++++ plugins/sonarqube-backend/config.d.ts | 14 ++++++ .../src/service/router.test.ts | 21 ++++++++- .../sonarqube-backend/src/service/router.ts | 4 +- .../src/service/sonarqubeInfoProvider.test.ts | 43 +++++++++++++++++++ .../src/service/sonarqubeInfoProvider.ts | 22 ++++++++-- 7 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 .changeset/warm-peas-hang.md diff --git a/.changeset/warm-peas-hang.md b/.changeset/warm-peas-hang.md new file mode 100644 index 0000000000..685bdc2489 --- /dev/null +++ b/.changeset/warm-peas-hang.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sonarqube-backend': minor +--- + +Added optional `externalUrl` config for setting a different frontend URL diff --git a/plugins/sonarqube-backend/README.md b/plugins/sonarqube-backend/README.md index 4d16dce025..9061dc9d1d 100644 --- a/plugins/sonarqube-backend/README.md +++ b/plugins/sonarqube-backend/README.md @@ -138,6 +138,34 @@ sonarqube: apiKey: abcdef0123456789abcedf0123456789ab ``` +#### Example - Different frontend and backend URLs + +In some instances, you might want to use one URL for the backend and another for the frontend. +This can be achieved by using the optional `externalUrl` property in the config. + +##### Single instance config + +```yaml +sonarqube: + baseUrl: https://sonarqube-internal.example.com + externalUrl: https://sonarqube.example.com + apiKey: 123456789abcdef0123456789abcedf012 +``` + +##### Multiple instance config + +```yaml +sonarqube: + instances: + - name: default + baseUrl: https://default-sonarqube-internal.example.com + externalUrl: https://default-sonarqube.example.com + apiKey: 123456789abcdef0123456789abcedf012 + - name: specialProject + baseUrl: https://special-project-sonarqube.example.com + apiKey: abcdef0123456789abcedf0123456789ab +``` + ## Links - [Sonarqube Frontend](../sonarqube/README.md) diff --git a/plugins/sonarqube-backend/config.d.ts b/plugins/sonarqube-backend/config.d.ts index 7e93f61eb4..0e2ac1ca64 100644 --- a/plugins/sonarqube-backend/config.d.ts +++ b/plugins/sonarqube-backend/config.d.ts @@ -23,6 +23,13 @@ export interface Config { */ baseUrl?: string; + /** + * The external url of the sonarqube installation. + * Use this if you want to use a different url for the frontend than the backend. + * @visibility frontend + */ + externalUrl?: string; + /** * The api key to access the sonarqube instance under baseUrl. * @visibility secret @@ -46,6 +53,13 @@ export interface Config { */ baseUrl: string; + /** + * The external url of the sonarqube instance. + * Use this if you want to use a different url for the frontend than the backend. + * @visibility frontend + */ + externalUrl?: string; + /** * The api key to access the sonarqube instance. * @visibility secret diff --git a/plugins/sonarqube-backend/src/service/router.test.ts b/plugins/sonarqube-backend/src/service/router.test.ts index 7045cdf0d2..bede4c7f6f 100644 --- a/plugins/sonarqube-backend/src/service/router.test.ts +++ b/plugins/sonarqube-backend/src/service/router.test.ts @@ -24,7 +24,7 @@ import { SonarqubeFindings } from './sonarqubeInfoProvider'; describe('createRouter', () => { let app: express.Express; const getBaseUrlMock: jest.Mock< - { baseUrl: string }, + { baseUrl: string; externalUrl?: string }, [{ instanceName: string }] > = jest.fn(); const getFindingsMock: jest.Mock< @@ -55,6 +55,7 @@ describe('createRouter', () => { describe('GET /findings', () => { const DUMMY_COMPONENT_KEY = 'my:component'; const DUMMY_INSTANCE_KEY = 'myInstance'; + it('returns ok', async () => { const measures = { analysisDate: '2022-01-01T00:00:00Z', @@ -77,6 +78,7 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(response.body).toEqual(measures); }); + it('returns an error when component key is not defined', async () => { const response = await request(app) .get('/findings') @@ -112,9 +114,12 @@ describe('createRouter', () => { expect(response.body).toEqual(measures); }); }); + describe('GET /instanceUrl', () => { const DUMMY_INSTANCE_KEY = 'myInstance'; - const DUMMY_INSTANCE_URL = 'http://sonarqube.example.com'; + const DUMMY_INSTANCE_URL = 'http://sonarqube-internal.example.com'; + const DUMMY_INSTANCE_EXTERNAL_URL = 'http://sonarqube.example.com'; + it('returns ok', async () => { getBaseUrlMock.mockReturnValue({ baseUrl: DUMMY_INSTANCE_URL }); const response = await request(app) @@ -141,5 +146,17 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(response.body).toEqual({ instanceUrl: DUMMY_INSTANCE_URL }); }); + + it('returns the external url when provided', async () => { + getBaseUrlMock.mockReturnValue({ + baseUrl: DUMMY_INSTANCE_URL, + externalUrl: DUMMY_INSTANCE_EXTERNAL_URL, + }); + const response = await request(app).get('/instanceUrl').send(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + instanceUrl: DUMMY_INSTANCE_EXTERNAL_URL, + }); + }); }); }); diff --git a/plugins/sonarqube-backend/src/service/router.ts b/plugins/sonarqube-backend/src/service/router.ts index f244ae5ce3..9c63c5c3cd 100644 --- a/plugins/sonarqube-backend/src/service/router.ts +++ b/plugins/sonarqube-backend/src/service/router.ts @@ -81,11 +81,11 @@ export async function createRouter( ? `Retrieving sonarqube instance URL for key ${instanceKey}` : `Retrieving default sonarqube instance URL as instanceKey is not provided`, ); - const { baseUrl } = sonarqubeInfoProvider.getBaseUrl({ + const { baseUrl, externalUrl } = sonarqubeInfoProvider.getBaseUrl({ instanceName: instanceKey, }); response.json({ - instanceUrl: baseUrl, + instanceUrl: externalUrl || baseUrl, }); }); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts index 72ab2ecee2..151f767974 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts @@ -27,6 +27,7 @@ describe('SonarqubeConfig', () => { const SONARQUBE_DEFAULT_INSTANCE_NAME = 'default'; const DUMMY_SONAR_URL = 'https://sonarqube.example.com'; const DUMMY_SONAR_APIKEY = '123456789abcdef0123456789abcedf012'; + const DUMMY_SIMPLE_OBJECT_FOR_DEFAULT_SONARQUBE_CONFIG = { name: SONARQUBE_DEFAULT_INSTANCE_NAME, baseUrl: DUMMY_SONAR_URL, @@ -112,6 +113,7 @@ describe('SonarqubeConfig', () => { }, ]); }); + it('Throw an error if both a named default config and top level config', async () => { expect(() => SonarqubeConfig.fromConfig( @@ -299,6 +301,46 @@ describe('DefaultSonarqubeInfoProvider', () => { baseUrl: 'https://sonarqube-other.example.com', }); }); + + it('Provide external url for simple config', async () => { + const provider = configureProvider({ + sonarqube: { + baseUrl: 'https://sonarqube-internal.example.com', + externalUrl: 'https://sonarqube.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + }); + + expect(provider.getBaseUrl()).toEqual({ + baseUrl: 'https://sonarqube-internal.example.com', + externalUrl: 'https://sonarqube.example.com', + }); + }); + + it('Provide external url for named config', async () => { + const provider = configureProvider({ + sonarqube: { + instances: [ + { + name: 'default', + baseUrl: 'https://sonarqube.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + { + name: 'other', + baseUrl: 'https://sonarqube-other-internal.example.com', + externalUrl: 'https://sonarqube-other.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + ], + }, + }); + + expect(provider.getBaseUrl({ instanceName: 'other' })).toEqual({ + baseUrl: 'https://sonarqube-other-internal.example.com', + externalUrl: 'https://sonarqube-other.example.com', + }); + }); }); describe('getFindings', () => { @@ -385,6 +427,7 @@ describe('DefaultSonarqubeInfoProvider', () => { apiKey: DUMMY_API_KEY, }, }; + it('Provide findings when everything is ok', async () => { setupHandlers(); const provider = configureProvider(DUMMY_SIMPLE_CONFIG_FOR_PROVIDER); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts index 2b96e6764e..6277f6f57e 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts @@ -30,7 +30,10 @@ export interface SonarqubeInfoProvider { * @param instanceName - Name of the sonarqube instance to get the info from * @returns the url of the instance */ - getBaseUrl(options?: { instanceName?: string }): { baseUrl: string }; + getBaseUrl(options?: { instanceName?: string }): { + baseUrl: string; + externalUrl?: string; + }; /** * Query the sonarqube instance corresponding to the instanceName to get all @@ -96,6 +99,10 @@ export interface SonarqubeInstanceConfig { * Base url to access the instance */ baseUrl: string; + /** + * External url to access the instance from the frontend + */ + externalUrl?: string; /** * Access token to access the sonarqube instance as generated in user profile. */ @@ -132,6 +139,7 @@ export class SonarqubeConfig { sonarqubeConfig.getOptionalConfigArray('instances')?.map(c => ({ name: c.getString('name'), baseUrl: c.getString('baseUrl'), + externalUrl: c.getOptionalString('externalUrl'), apiKey: c.getString('apiKey'), })) || []; @@ -142,9 +150,10 @@ export class SonarqubeConfig { // Get these as optional strings and check to give a better error message const baseUrl = sonarqubeConfig.getOptionalString('baseUrl'); + const externalUrl = sonarqubeConfig.getOptionalString('externalUrl'); const apiKey = sonarqubeConfig.getOptionalString('apiKey'); - if (hasNamedDefault && (baseUrl || apiKey)) { + if (hasNamedDefault && (baseUrl || externalUrl || apiKey)) { throw new Error( `Found both a named sonarqube instance with name ${DEFAULT_SONARQUBE_NAME} and top level baseUrl or apiKey config. Use only one style of config.`, ); @@ -160,10 +169,11 @@ export class SonarqubeConfig { if (unnamedAllPresent) { const unnamedInstanceConfig = [ - { name: DEFAULT_SONARQUBE_NAME, baseUrl, apiKey }, + { name: DEFAULT_SONARQUBE_NAME, baseUrl, externalUrl, apiKey }, ] as { name: string; baseUrl: string; + externalUrl?: string; apiKey: string; }[]; @@ -303,11 +313,15 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { */ getBaseUrl(options: { instanceName?: string } = {}): { baseUrl: string; + externalUrl?: string; } { const instanceConfig = this.config.getInstanceConfig({ sonarqubeName: options.instanceName, }); - return { baseUrl: instanceConfig.baseUrl }; + return { + baseUrl: instanceConfig.baseUrl, + externalUrl: instanceConfig.externalUrl, + }; } /** From b1e9dcec6a21658140fdc364fa49ca42411b2d50 Mon Sep 17 00:00:00 2001 From: Connor Younglund Date: Thu, 27 Jul 2023 15:42:33 -0400 Subject: [PATCH 046/440] updated api-report.md Signed-off-by: Connor Younglund --- plugins/sonarqube-backend/api-report.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/sonarqube-backend/api-report.md b/plugins/sonarqube-backend/api-report.md index 0fbd463cf3..cf0314aad1 100644 --- a/plugins/sonarqube-backend/api-report.md +++ b/plugins/sonarqube-backend/api-report.md @@ -15,6 +15,7 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { static fromConfig(config: Config): DefaultSonarqubeInfoProvider; getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; + externalUrl?: string; }; getFindings(options: { componentKey: string; @@ -49,6 +50,7 @@ export interface SonarqubeFindings { export interface SonarqubeInfoProvider { getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; + externalUrl?: string; }; getFindings(options: { componentKey: string; @@ -60,6 +62,7 @@ export interface SonarqubeInfoProvider { export interface SonarqubeInstanceConfig { apiKey: string; baseUrl: string; + externalUrl?: string; name: string; } From e5f5054bb03ea869cfd2107377cb3624ed3cec75 Mon Sep 17 00:00:00 2001 From: Scott Guymer Date: Fri, 28 Jul 2023 09:43:52 +0200 Subject: [PATCH 047/440] Remove extra brace Signed-off-by: Scott Guymer --- .../collators/defaultCatalogCollatorEntityTransformer.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts index 4ae6c88c06..3fe6a9c3e5 100644 --- a/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts +++ b/plugins/search-backend-module-catalog/src/collators/defaultCatalogCollatorEntityTransformer.test.ts @@ -95,7 +95,7 @@ describe('DefaultCatalogCollatorEntityTransformer', () => { expect(document).toMatchObject({ title: userEntity.metadata.name, - text: `${userEntity.metadata.description} : ${userEntity.spec.profile.displayName} : ${userEntity.spec.profile.email}}`, + text: `${userEntity.metadata.description} : ${userEntity.spec.profile.displayName} : ${userEntity.spec.profile.email}`, namespace: 'default', componentType: 'other', lifecycle: '', From b2ccddefbdc6dd41e3d4999ff3bc0034ddadaa5e Mon Sep 17 00:00:00 2001 From: rui ma Date: Fri, 28 Jul 2023 17:05:48 +0800 Subject: [PATCH 048/440] fix: remove sonar card disable class Signed-off-by: rui ma --- .changeset/large-vans-cross.md | 5 +++++ .../src/components/SonarQubeCard/SonarQubeCard.tsx | 6 ------ 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 .changeset/large-vans-cross.md diff --git a/.changeset/large-vans-cross.md b/.changeset/large-vans-cross.md new file mode 100644 index 0000000000..f50b432742 --- /dev/null +++ b/.changeset/large-vans-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sonarqube': patch +--- + +Remove sonarQube card disable class diff --git a/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx b/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx index 7ad4717bd2..46a22b9284 100644 --- a/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx +++ b/plugins/sonarqube/src/components/SonarQubeCard/SonarQubeCard.tsx @@ -68,9 +68,6 @@ const useStyles = makeStyles(theme => ({ lastAnalyzed: { color: theme.palette.text.secondary, }, - disabled: { - backgroundColor: theme.palette.background.default, - }, })); /** @public */ @@ -163,9 +160,6 @@ export const SonarQubeCard = (props: { action: classes.action, }, }} - className={ - !loading && (!projectTitle || !value) ? classes.disabled : undefined - } > {loading && } From 0b1d775be05b4cb926c1bd66a963a4a4ba6c1db3 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Fri, 28 Jul 2023 11:05:15 +0100 Subject: [PATCH 049/440] Adds a number of examples for builtin functions This patch also proposes: - changing the pattern by which the examples are imported - adds tests for the examples Signed-off-by: Brian Fletcher --- .changeset/metal-buttons-search.md | 5 + .changeset/ten-lies-cheat.md | 5 + .../builtin/catalog/fetch.examples.test.ts | 78 ++++++ .../actions/builtin/catalog/fetch.examples.ts | 51 ++++ .../actions/builtin/catalog/fetch.ts | 35 +-- .../builtin/catalog/register.examples.test.ts | 108 ++++++++ .../builtin/catalog/register.examples.ts | 37 +++ .../actions/builtin/catalog/register.ts | 21 +- .../builtin/catalog/write.examples.test.ts | 72 ++++++ .../actions/builtin/catalog/write.examples.ts | 48 ++++ .../actions/builtin/catalog/write.ts | 31 +-- .../builtin/debug/log.examples.test.ts | 86 +++++++ .../actions/builtin/debug/log.examples.ts | 51 ++++ .../scaffolder/actions/builtin/debug/log.ts | 35 +-- .../builtin/debug/wait.examples.test.ts | 61 +++++ .../actions/builtin/debug/wait.examples.ts | 66 +++++ .../scaffolder/actions/builtin/debug/wait.ts | 35 +-- .../builtin/fetch/plain.examples.test.ts | 85 +++++++ .../actions/builtin/fetch/plain.examples.ts | 53 ++++ .../scaffolder/actions/builtin/fetch/plain.ts | 6 +- .../builtin/fetch/plainFile.examples.test.ts | 71 ++++++ .../builtin/fetch/plainFile.examples.ts | 37 +++ .../actions/builtin/fetch/plainFile.ts | 2 + .../builtin/fetch/template.examples.test.ts | 230 ++++++++++++++++++ .../builtin/fetch/template.examples.ts | 44 ++++ .../actions/builtin/fetch/template.ts | 2 + .../src/actions/createTemplateAction.ts | 8 +- plugins/scaffolder-node/src/actions/index.ts | 1 + 28 files changed, 1210 insertions(+), 154 deletions(-) create mode 100644 .changeset/metal-buttons-search.md create mode 100644 .changeset/ten-lies-cheat.md create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.ts diff --git a/.changeset/metal-buttons-search.md b/.changeset/metal-buttons-search.md new file mode 100644 index 0000000000..9578d8d2d4 --- /dev/null +++ b/.changeset/metal-buttons-search.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Adds examples to a few scaffolder actions. diff --git a/.changeset/ten-lies-cheat.md b/.changeset/ten-lies-cheat.md new file mode 100644 index 0000000000..1c965a574c --- /dev/null +++ b/.changeset/ten-lies-cheat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +Export `TemplateExample` from the `createTemplateAction` type. diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.test.ts new file mode 100644 index 0000000000..161ff9d1de --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.test.ts @@ -0,0 +1,78 @@ +/* + * 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 os from 'os'; +import { getVoidLogger } from '@backstage/backend-common'; +import { CatalogApi } from '@backstage/catalog-client'; +import { Entity } from '@backstage/catalog-model'; +import { createFetchCatalogEntityAction } from './fetch'; +import { examples } from './fetch.examples'; +import yaml from 'yaml'; + +describe('catalog:fetch examples', () => { + const getEntityByRef = jest.fn(); + const getEntitiesByRefs = jest.fn(); + + const catalogClient = { + getEntityByRef: getEntityByRef, + getEntitiesByRefs: getEntitiesByRefs, + }; + + const action = createFetchCatalogEntityAction({ + catalogClient: catalogClient as unknown as CatalogApi, + }); + + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + secrets: { backstageToken: 'secret' }, + }; + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('fetch single entity', () => { + it('should return entity from catalog', async () => { + getEntityByRef.mockReturnValueOnce({ + metadata: { + namespace: 'default', + name: 'name', + }, + kind: 'Component', + } as Entity); + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + + expect(getEntityByRef).toHaveBeenCalledWith('component:default/name', { + token: 'secret', + }); + expect(mockContext.output).toHaveBeenCalledWith('entity', { + metadata: { + namespace: 'default', + name: 'name', + }, + kind: 'Component', + }); + }); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts new file mode 100644 index 0000000000..5bd76dd539 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts @@ -0,0 +1,51 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Fetch entity by reference', + example: yaml.stringify({ + steps: [ + { + action: 'catalog:fetch', + id: 'fetch', + name: 'Fetch catalog entity', + input: { + entityRef: 'component:default/name', + }, + }, + ], + }), + }, + { + description: 'Fetch multiple entities by referencse', + example: yaml.stringify({ + steps: [ + { + action: 'catalog:fetch', + id: 'fetchMultiple', + name: 'Fetch catalog entities', + input: { + entityRefs: ['component:default/name'], + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts index 437da8ae73..75c4bc94ce 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts @@ -16,45 +16,12 @@ import { CatalogApi } from '@backstage/catalog-client'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; -import yaml from 'yaml'; import { z } from 'zod'; import { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model'; +import { examples } from './fetch.examples'; const id = 'catalog:fetch'; -const examples = [ - { - description: 'Fetch entity by reference', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'fetch', - name: 'Fetch catalog entity', - input: { - entityRef: 'component:default/name', - }, - }, - ], - }), - }, - { - description: 'Fetch multiple entities by referencse', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'fetchMultiple', - name: 'Fetch catalog entities', - input: { - entityRefs: ['component:default/name'], - }, - }, - ], - }), - }, -]; - /** * Returns entity or entities from the catalog by entity reference(s). * diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.test.ts new file mode 100644 index 0000000000..eb5aa88c0f --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.test.ts @@ -0,0 +1,108 @@ +/* + * 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 os from 'os'; +import { getVoidLogger } from '@backstage/backend-common'; +import { CatalogApi } from '@backstage/catalog-client'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { createCatalogRegisterAction } from './register'; +import { Entity } from '@backstage/catalog-model'; +import { examples } from './register.examples'; +import yaml from 'yaml'; + +describe('catalog:register', () => { + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [{ host: 'github.com', token: 'token' }], + }, + }), + ); + + const addLocation = jest.fn(); + const catalogClient = { + addLocation: addLocation, + }; + + const action = createCatalogRegisterAction({ + integrations, + catalogClient: catalogClient as unknown as CatalogApi, + }); + + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should register location in catalog', async () => { + addLocation + .mockResolvedValueOnce({ + entities: [], + }) + .mockResolvedValueOnce({ + entities: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + ], + }); + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + + expect(addLocation).toHaveBeenNthCalledWith( + 1, + { + type: 'url', + target: + 'http://github.com/backstage/backstage/blob/master/catalog-info.yaml', + }, + {}, + ); + expect(addLocation).toHaveBeenNthCalledWith( + 2, + { + dryRun: true, + type: 'url', + target: + 'http://github.com/backstage/backstage/blob/master/catalog-info.yaml', + }, + {}, + ); + + expect(mockContext.output).toHaveBeenCalledWith( + 'entityRef', + 'component:default/test', + ); + expect(mockContext.output).toHaveBeenCalledWith( + 'catalogInfoUrl', + 'http://github.com/backstage/backstage/blob/master/catalog-info.yaml', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.ts new file mode 100644 index 0000000000..198ff52085 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.examples.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Register with the catalog', + example: yaml.stringify({ + steps: [ + { + action: 'catalog:register', + id: 'register-with-catalog', + name: 'Register with the catalog', + input: { + catalogInfoUrl: + 'http://github.com/backstage/backstage/blob/master/catalog-info.yaml', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts index 3e35e16508..39372f484f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/register.ts @@ -19,29 +19,10 @@ import { ScmIntegrations } from '@backstage/integration'; import { CatalogApi } from '@backstage/catalog-client'; import { stringifyEntityRef, Entity } from '@backstage/catalog-model'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; -import yaml from 'yaml'; +import { examples } from './register.examples'; const id = 'catalog:register'; -const examples = [ - { - description: 'Register with the catalog', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'register-with-catalog', - name: 'Register with the catalog', - input: { - catalogInfoUrl: - 'http://github.com/backstage/backstage/blob/master/catalog-info.yaml', - }, - }, - ], - }), - }, -]; - /** * Registers entities from a catalog descriptor file in the workspace into the software catalog. * @public diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.test.ts new file mode 100644 index 0000000000..daa8f4f6b1 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.test.ts @@ -0,0 +1,72 @@ +/* + * 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 fs from 'fs-extra'; + +jest.mock('fs-extra'); + +const fsMock = fs as jest.Mocked; + +import { PassThrough } from 'stream'; +import os from 'os'; +import { getVoidLogger } from '@backstage/backend-common'; +import { createCatalogWriteAction } from './write'; +import { resolve as resolvePath } from 'path'; +import * as yaml from 'yaml'; +import { examples } from './write.examples'; + +describe('catalog:write', () => { + const action = createCatalogWriteAction(); + + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should write the catalog-info.yml in the workspace', async () => { + const entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'test', + annotations: {}, + }, + spec: { + type: 'service', + lifecycle: 'production', + owner: 'default/owner', + }, + }; + + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + + expect(fsMock.writeFile).toHaveBeenCalledTimes(1); + expect(fsMock.writeFile).toHaveBeenCalledWith( + resolvePath(mockContext.workspacePath, 'catalog-info.yaml'), + yaml.stringify(entity), + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.ts new file mode 100644 index 0000000000..b66cff23d7 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.examples.ts @@ -0,0 +1,48 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import * as yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Write a catalog yaml file', + example: yaml.stringify({ + steps: [ + { + action: 'catalog:write', + id: 'create-catalog-info-file', + name: 'Create catalog file', + input: { + entity: { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'test', + annotations: {}, + }, + spec: { + type: 'service', + lifecycle: 'production', + owner: 'default/owner', + }, + }, + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index 81fdc73e71..7663ad15c8 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -19,39 +19,10 @@ import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import * as yaml from 'yaml'; import { resolveSafeChildPath } from '@backstage/backend-common'; import { z } from 'zod'; +import { examples } from './write.examples'; const id = 'catalog:write'; -const examples = [ - { - description: 'Write a catalog yaml file', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'create-catalog-info-file', - name: 'Create catalog file', - input: { - entity: { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'test', - annotations: {}, - }, - spec: { - type: 'service', - lifecycle: 'production', - owner: 'default/owner', - }, - }, - }, - }, - ], - }), - }, -]; - /** * Writes a catalog descriptor file containing the provided entity to a path in the workspace. * @public diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.test.ts new file mode 100644 index 0000000000..a7f5a1804a --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.test.ts @@ -0,0 +1,86 @@ +/* + * 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 { getVoidLogger } from '@backstage/backend-common'; +import mockFs from 'mock-fs'; +import os from 'os'; +import { Writable } from 'stream'; +import { createDebugLogAction } from './log'; +import { join } from 'path'; +import yaml from 'yaml'; +import { examples } from './log.examples'; + +describe('debug:log examples', () => { + const logStream = { + write: jest.fn(), + } as jest.Mocked> as jest.Mocked; + + const mockTmpDir = os.tmpdir(); + const mockContext = { + input: {}, + baseUrl: 'somebase', + workspacePath: mockTmpDir, + logger: getVoidLogger(), + logStream, + output: jest.fn(), + createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir), + }; + + const action = createDebugLogAction(); + + beforeEach(() => { + mockFs({ + [`${mockContext.workspacePath}/README.md`]: '', + [`${mockContext.workspacePath}/a-directory/index.md`]: '', + }); + jest.resetAllMocks(); + }); + + afterEach(() => { + mockFs.restore(); + }); + + it('should log message', async () => { + const context = { + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }; + + await action.handler(context); + + expect(logStream.write).toHaveBeenCalledTimes(1); + expect(logStream.write).toHaveBeenCalledWith( + expect.stringContaining('Hello Backstage!'), + ); + }); + + it('should log the workspace content, if active', async () => { + const context = { + ...mockContext, + input: yaml.parse(examples[1].example).steps[0].input, + }; + + await action.handler(context); + + expect(logStream.write).toHaveBeenCalledTimes(1); + expect(logStream.write).toHaveBeenCalledWith( + expect.stringContaining('README.md'), + ); + expect(logStream.write).toHaveBeenCalledWith( + expect.stringContaining(join('a-directory', 'index.md')), + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.ts new file mode 100644 index 0000000000..0e9173bfa6 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.examples.ts @@ -0,0 +1,51 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Write a debug message', + example: yaml.stringify({ + steps: [ + { + action: 'debug:log', + id: 'write-debug-line', + name: 'Write "Hello Backstage!" log line', + input: { + message: 'Hello Backstage!', + }, + }, + ], + }), + }, + { + description: 'List the workspace directory', + example: yaml.stringify({ + steps: [ + { + action: 'debug:log', + id: 'write-workspace-directory', + name: 'List the workspace directory', + input: { + listWorkspace: true, + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts index 481eb9dfdd..524e12b5c9 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts @@ -17,43 +17,10 @@ import { readdir, stat } from 'fs-extra'; import { relative, join } from 'path'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; -import yaml from 'yaml'; +import { examples } from './log.examples'; const id = 'debug:log'; -const examples = [ - { - description: 'Write a debug message', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'write-debug-line', - name: 'Write "Hello Backstage!" log line', - input: { - message: 'Hello Backstage!', - }, - }, - ], - }), - }, - { - description: 'List the workspace directory', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'write-workspace-directory', - name: 'List the workspace directory', - input: { - listWorkspace: true, - }, - }, - ], - }), - }, -]; - /** * Writes a message into the log or lists all files in the workspace * diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.test.ts new file mode 100644 index 0000000000..595ae7c3b6 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.test.ts @@ -0,0 +1,61 @@ +/* + * 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 { getVoidLogger } from '@backstage/backend-common'; +import mockFs from 'mock-fs'; +import { createWaitAction } from './wait'; +import { Writable } from 'stream'; +import os from 'os'; +import { examples } from './wait.examples'; +import yaml from 'yaml'; + +describe('debug:wait examples', () => { + const action = createWaitAction(); + + const logStream = { + write: jest.fn(), + } as jest.Mocked> as jest.Mocked; + + const mockTmpDir = os.tmpdir(); + const mockContext = { + input: {}, + baseUrl: 'somebase', + workspacePath: mockTmpDir, + logger: getVoidLogger(), + logStream, + output: jest.fn(), + createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + mockFs.restore(); + }); + + it('should wait for specified period of seconds', async () => { + const context = { + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }; + const start = new Date().getTime(); + await action.handler(context); + const end = new Date().getTime(); + expect(end - start).toBeGreaterThanOrEqual(50); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.ts new file mode 100644 index 0000000000..1cc69b1aed --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.examples.ts @@ -0,0 +1,66 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Waiting for 50 milliseconds', + example: yaml.stringify({ + steps: [ + { + action: 'debug:wait', + id: 'wait-milliseconds', + name: 'Waiting for 50 milliseconds', + input: { + milliseconds: 50, + }, + }, + ], + }), + }, + { + description: 'Waiting for 5 seconds', + example: yaml.stringify({ + steps: [ + { + action: 'debug:wait', + id: 'wait-5sec', + name: 'Waiting for 5 seconds', + input: { + seconds: 5, + }, + }, + ], + }), + }, + { + description: 'Waiting for 1 minutes', + example: yaml.stringify({ + steps: [ + { + action: 'debug:wait', + id: 'wait-1min', + name: 'Waiting for 1 minutes', + input: { + minutes: 1, + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts index 02cab239cb..ae0af4db5a 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts @@ -16,46 +16,13 @@ import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; import { HumanDuration } from '@backstage/types'; -import yaml from 'yaml'; import { Duration } from 'luxon'; +import { examples } from './wait.examples'; const id = 'debug:wait'; const MAX_WAIT_TIME_IN_ISO = 'T00:00:30'; -const examples = [ - { - description: 'Waiting for 5 seconds', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'wait-5sec', - name: 'Waiting for 5 seconds', - input: { - seconds: 5, - }, - }, - ], - }), - }, - { - description: 'Waiting for 5 minutes', - example: yaml.stringify({ - steps: [ - { - action: id, - id: 'wait-5min', - name: 'Waiting for 5 minutes', - input: { - minutes: 5, - }, - }, - ], - }), - }, -]; - /** * Waits for a certain period of time. * diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts new file mode 100644 index 0000000000..e3c7d3e15c --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts @@ -0,0 +1,85 @@ +/* + * 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 yaml from 'yaml'; + +jest.mock('./helpers'); + +import os from 'os'; +import { resolve as resolvePath } from 'path'; +import { getVoidLogger, UrlReader } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { createFetchPlainAction } from './plain'; +import { PassThrough } from 'stream'; +import { fetchContents } from './helpers'; +import { examples } from './plain.examples'; + +describe('fetch:plain examples', () => { + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [{ host: 'github.com', token: 'token' }], + }, + }), + ); + const reader: UrlReader = { + readUrl: jest.fn(), + readTree: jest.fn(), + search: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + const action = createFetchPlainAction({ integrations, reader }); + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + it('should fetch plain', async () => { + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + expect(fetchContents).toHaveBeenCalledWith( + expect.objectContaining({ + outputPath: resolvePath(mockContext.workspacePath), + fetchUrl: + 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets', + }), + ); + }); + + it('should fetch plain to a specified directory', async () => { + await action.handler({ + ...mockContext, + input: yaml.parse(examples[1].example).steps[0].input, + }); + expect(fetchContents).toHaveBeenCalledWith( + expect.objectContaining({ + outputPath: resolvePath(mockContext.workspacePath, 'fetched-data'), + fetchUrl: + 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets', + }), + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.ts new file mode 100644 index 0000000000..4937b72991 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.ts @@ -0,0 +1,53 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Downloads content and places it in the workspace.', + example: yaml.stringify({ + steps: [ + { + action: 'fetch:plain', + id: 'fetch-plain', + name: 'Fetch plain', + input: { + url: 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets', + }, + }, + ], + }), + }, + { + description: + 'Optionally, if you would prefer the data to be downloaded to a subdirectory in the workspace you may specify the ‘targetPath’ input option.', + example: yaml.stringify({ + steps: [ + { + action: 'fetch:plain', + id: 'fetch-plain', + name: 'Fetch plain', + input: { + url: 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets', + targetPath: 'fetched-data', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts index c10f696bb9..9796744715 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts @@ -18,6 +18,9 @@ import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { fetchContents } from './helpers'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { examples } from './plain.examples'; + +export const ACTION_ID = 'fetch:plain'; /** * Downloads content and places it in the workspace, or optionally @@ -31,7 +34,8 @@ export function createFetchPlainAction(options: { const { reader, integrations } = options; return createTemplateAction<{ url: string; targetPath?: string }>({ - id: 'fetch:plain', + id: ACTION_ID, + examples, description: 'Downloads content and places it in the workspace, or optionally in a subdirectory specified by the `targetPath` input option.', schema: { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts new file mode 100644 index 0000000000..7ae34cc140 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts @@ -0,0 +1,71 @@ +/* + * 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 yaml from 'yaml'; + +jest.mock('./helpers'); + +import os from 'os'; +import { resolve as resolvePath } from 'path'; +import { getVoidLogger, UrlReader } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; +import { createFetchPlainFileAction } from './plainFile'; +import { PassThrough } from 'stream'; +import { fetchFile } from './helpers'; +import { examples } from './plainFile.examples'; + +describe('fetch:plain:file examples', () => { + const integrations = ScmIntegrations.fromConfig( + new ConfigReader({ + integrations: { + github: [{ host: 'github.com', token: 'token' }], + }, + }), + ); + const reader: UrlReader = { + readUrl: jest.fn(), + readTree: jest.fn(), + search: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + const action = createFetchPlainFileAction({ integrations, reader }); + const mockContext = { + workspacePath: os.tmpdir(), + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + }; + + it('should fetch plain', async () => { + await action.handler({ + ...mockContext, + input: yaml.parse(examples[0].example).steps[0].input, + }); + expect(fetchFile).toHaveBeenCalledWith( + expect.objectContaining({ + outputPath: resolvePath(mockContext.workspacePath, 'target-path'), + fetchUrl: + 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets/Backstage%20Community%20Sessions.png', + }), + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.ts new file mode 100644 index 0000000000..bf71068bf1 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: 'Downloads a file and places it in the workspace.', + example: yaml.stringify({ + steps: [ + { + action: 'fetch:plain:file', + id: 'fetch-plain-file', + name: 'Fetch plain file', + input: { + url: 'https://github.com/backstage/community/tree/main/backstage-community-sessions/assets/Backstage%20Community%20Sessions.png', + targetPath: 'target-path', + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts index 7b33ad93b4..7617398caf 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts @@ -18,6 +18,7 @@ import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { fetchFile } from './helpers'; import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { examples } from './plainFile.examples'; /** * Downloads content and places it in the workspace, or optionally @@ -33,6 +34,7 @@ export function createFetchPlainFileAction(options: { return createTemplateAction<{ url: string; targetPath: string }>({ id: 'fetch:plain:file', description: 'Downloads single file and places it in the workspace.', + examples, schema: { input: { type: 'object', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts new file mode 100644 index 0000000000..f744460690 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts @@ -0,0 +1,230 @@ +/* + * 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 os from 'os'; +import { join as joinPath, sep as pathSep } from 'path'; +import fs from 'fs-extra'; +import mockFs from 'mock-fs'; +import { + getVoidLogger, + resolvePackagePath, + UrlReader, +} from '@backstage/backend-common'; +import { ScmIntegrations } from '@backstage/integration'; +import { PassThrough } from 'stream'; +import { fetchContents } from './helpers'; +import { createFetchTemplateAction } from './template'; +import { + ActionContext, + TemplateAction, +} from '@backstage/plugin-scaffolder-node'; +import { examples } from './template.examples'; +import yaml from 'yaml'; + +jest.mock('./helpers', () => ({ + fetchContents: jest.fn(), +})); + +type FetchTemplateInput = ReturnType< + typeof createFetchTemplateAction +> extends TemplateAction + ? U + : never; + +const realFiles = Object.fromEntries( + [ + resolvePackagePath( + '@backstage/plugin-scaffolder-backend', + 'assets', + 'nunjucks.js.txt', + ), + ].map(k => [k, mockFs.load(k)]), +); + +const aBinaryFile = fs.readFileSync( + resolvePackagePath( + '@backstage/plugin-scaffolder-backend', + 'fixtures/test-nested-template/public/react-logo192.png', + ), +); + +const mockFetchContents = fetchContents as jest.MockedFunction< + typeof fetchContents +>; + +describe('fetch:template examples', () => { + let action: TemplateAction; + + const workspacePath = os.tmpdir(); + const createTemporaryDirectory: jest.MockedFunction< + ActionContext['createTemporaryDirectory'] + > = jest.fn(() => + Promise.resolve( + joinPath(workspacePath, `${createTemporaryDirectory.mock.calls.length}`), + ), + ); + + const logger = getVoidLogger(); + + const mockContext = (input: any) => ({ + templateInfo: { + baseUrl: 'base-url', + entityRef: 'template:default/test-template', + }, + input: input, + output: jest.fn(), + logStream: new PassThrough(), + logger, + workspacePath, + createTemporaryDirectory, + }); + + beforeEach(() => { + mockFs({ + ...realFiles, + }); + + action = createFetchTemplateAction({ + reader: Symbol('UrlReader') as unknown as UrlReader, + integrations: Symbol('Integrations') as unknown as ScmIntegrations, + }); + }); + + afterEach(() => { + mockFs.restore(); + }); + + describe('handler', () => { + describe('with valid input', () => { + let context: ActionContext; + + beforeEach(async () => { + context = mockContext(yaml.parse(examples[0].example).steps[0].input); + + mockFetchContents.mockImplementation(({ outputPath }) => { + mockFs({ + ...realFiles, + [outputPath]: { + 'an-executable.sh': mockFs.file({ + content: '#!/usr/bin/env bash', + mode: parseInt('100755', 8), + }), + 'empty-dir-${{ values.count }}': {}, + 'static.txt': 'static content', + '${{ values.name }}.txt': 'static content', + subdir: { + 'templated-content.txt': + '${{ values.name }}: ${{ values.count }}', + }, + '.${{ values.name }}': '${{ values.itemList | dump }}', + 'a-binary-file.png': aBinaryFile, + symlink: mockFs.symlink({ + path: 'a-binary-file.png', + }), + brokenSymlink: mockFs.symlink({ + path: './not-a-real-file.txt', + }), + }, + }); + + return Promise.resolve(); + }); + + await action.handler(context); + }); + + it('uses fetchContents to retrieve the template content', () => { + expect(mockFetchContents).toHaveBeenCalledWith( + expect.objectContaining({ + baseUrl: context.templateInfo?.baseUrl, + fetchUrl: context.input.url, + }), + ); + }); + + it('copies files with no templating in names or content successfully', async () => { + await expect( + fs.readFile(`${workspacePath}/target/static.txt`, 'utf-8'), + ).resolves.toEqual('static content'); + }); + + it('copies files with templated names successfully', async () => { + await expect( + fs.readFile(`${workspacePath}/target/test-project.txt`, 'utf-8'), + ).resolves.toEqual('static content'); + }); + + it('copies files with templated content successfully', async () => { + await expect( + fs.readFile( + `${workspacePath}/target/subdir/templated-content.txt`, + 'utf-8', + ), + ).resolves.toEqual('test-project: 1234'); + }); + + it('processes dotfiles', async () => { + await expect( + fs.readFile(`${workspacePath}/target/.test-project`, 'utf-8'), + ).resolves.toEqual('["first","second","third"]'); + }); + + it('copies empty directories', async () => { + await expect( + fs.readdir(`${workspacePath}/target/empty-dir-1234`, 'utf-8'), + ).resolves.toEqual([]); + }); + + it('copies binary files as-is without processing them', async () => { + await expect( + fs.readFile(`${workspacePath}/target/a-binary-file.png`), + ).resolves.toEqual(aBinaryFile); + }); + + it('copies files and maintains the original file permissions', async () => { + await expect( + fs + .stat(`${workspacePath}/target/an-executable.sh`) + .then(fObj => fObj.mode), + ).resolves.toEqual(parseInt('100755', 8)); + }); + + it('copies file symlinks as-is without processing them', async () => { + await expect( + fs + .lstat(`${workspacePath}/target/symlink`) + .then(i => i.isSymbolicLink()), + ).resolves.toBe(true); + + await expect( + fs.realpath(`${workspacePath}/target/symlink`), + ).resolves.toBe(joinPath(workspacePath, 'target', 'a-binary-file.png')); + }); + + it('copies broken symlinks as-is without processing them', async () => { + await expect( + fs + .lstat(`${workspacePath}/target/brokenSymlink`) + .then(i => i.isSymbolicLink()), + ).resolves.toBe(true); + + await expect( + fs.readlink(`${workspacePath}/target/brokenSymlink`), + ).resolves.toEqual(`.${pathSep}not-a-real-file.txt`); + }); + }); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.ts new file mode 100644 index 0000000000..4c4628e715 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.ts @@ -0,0 +1,44 @@ +/* + * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node'; +import yaml from 'yaml'; + +export const examples: TemplateExample[] = [ + { + description: + 'Downloads a skelaton directory that lives alongside the template file and fill it out with values.', + example: yaml.stringify({ + steps: [ + { + action: 'fetch:template', + id: 'fetch-template', + name: 'Fetch template', + input: { + url: './skeleton', + targetPath: './target', + values: { + name: 'test-project', + count: 1234, + itemList: ['first', 'second', 'third'], + showDummyFile: false, + }, + }, + }, + ], + }), + }, +]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index be7b47521c..791ac7f3cf 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -29,6 +29,7 @@ import { TemplateGlobal, } from '../../../../lib/templating/SecureTemplater'; import { createDefaultFilters } from '../../../../lib/templating/filters'; +import { examples } from './template.examples'; /** * Downloads a skeleton, templates variables into file and directory names and content. @@ -70,6 +71,7 @@ export function createFetchTemplateAction(options: { id: 'fetch:template', description: 'Downloads a skeleton, templates variables into file and directory names and content, and places the result in the workspace, or optionally in a subdirectory specified by the `targetPath` input option.', + examples, schema: { input: { type: 'object', diff --git a/plugins/scaffolder-node/src/actions/createTemplateAction.ts b/plugins/scaffolder-node/src/actions/createTemplateAction.ts index a667f91744..38aba32778 100644 --- a/plugins/scaffolder-node/src/actions/createTemplateAction.ts +++ b/plugins/scaffolder-node/src/actions/createTemplateAction.ts @@ -20,6 +20,12 @@ import { Schema } from 'jsonschema'; import zodToJsonSchema from 'zod-to-json-schema'; import { JsonObject } from '@backstage/types'; +/** @public */ +export type TemplateExample = { + description: string; + example: string; +}; + /** @public */ export type TemplateActionOptions< TActionInput extends JsonObject = {}, @@ -29,7 +35,7 @@ export type TemplateActionOptions< > = { id: string; description?: string; - examples?: { description: string; example: string }[]; + examples?: TemplateExample[]; supportsDryRun?: boolean; schema?: { input?: TInputSchema; diff --git a/plugins/scaffolder-node/src/actions/index.ts b/plugins/scaffolder-node/src/actions/index.ts index e4af098356..770c2516e7 100644 --- a/plugins/scaffolder-node/src/actions/index.ts +++ b/plugins/scaffolder-node/src/actions/index.ts @@ -17,5 +17,6 @@ export { createTemplateAction, type TemplateActionOptions, + type TemplateExample, } from './createTemplateAction'; export { type ActionContext, type TemplateAction } from './types'; From caea6122668c858fd730e6e08c2e4b98d570d832 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Fri, 28 Jul 2023 11:17:53 +0100 Subject: [PATCH 050/440] update the api reports Signed-off-by: Brian Fletcher --- plugins/scaffolder-node/api-report.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 46aba960d8..e5dec76d50 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -109,10 +109,7 @@ export type TemplateActionOptions< > = { id: string; description?: string; - examples?: { - description: string; - example: string; - }[]; + examples?: TemplateExample[]; supportsDryRun?: boolean; schema?: { input?: TInputSchema; @@ -120,4 +117,10 @@ export type TemplateActionOptions< }; handler: (ctx: ActionContext) => Promise; }; + +// @public (undocumented) +export type TemplateExample = { + description: string; + example: string; +}; ``` From d5a185bf46e819f04494e22724b1715cefe4058e Mon Sep 17 00:00:00 2001 From: Yor Jaggy Date: Tue, 25 Jul 2023 10:29:24 -0500 Subject: [PATCH 051/440] Update ADOPTERS.md Adding Platzi as adopter Signed-off-by: Yor Jaggy Signed-off-by: yorjaggy --- ADOPTERS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index cd340fd5f9..c14d669b12 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -254,4 +254,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Celonis](https://celonis.com) | [@georgeyord](https://github.com/georgeyord), [@LauraMoraB](https://github.com/LauraMoraB), [@mariosant](https://github.com/mariosant), [@Rbillon59](https://github.com/Rbillon59) | Internal developer and product portal implementation. | | [Rabobank](https://www.rabobank.com) | [Willem Dekker](https://github.com/wdekker), [Sridhar Gnanasekaran](https://github.com/srid99), [Ruben Ernst](https://github.com/Ruben-E) | At Rabobank, our mission is to make life better for engineers. After exploring various options in the market, we've discovered that Backstage provides the perfect foundation for creating a platform that meets our engineers' needs and helps us achieve our goals. We want to make our engineers happy by offering standardized services, freeing them up to focus on delivering value. Our vision is to create a one-stop platform where engineers can find everything related to software and services. In practice, we're excited about using all the cool features in Backstage, and we're even planning to build our own plugins. | | [JB Hi-Fi](https://www.jbhifi.com.au) | [@bahman](https://github.com/bahman-jb/) | We use Backstage as a central place for all of our components/apis across multiple teams. It helps us to quickly identify the ownership of a component/api, find the related links and have a quick access to CI/CD pipelines. | -| [Zenklub](https://www.zenklub.com.br) | [@zenklub](https://github.com/zenklub), [@gioufop](https://github.com/gioufop) | Developer portal, services catalog and centralization of metrics from Grafana Stack and AWS. Furthermore, centralization of documentation and infra details like Tools, Network services and so on. | \ No newline at end of file +| [Zenklub](https://www.zenklub.com.br) | [@zenklub](https://github.com/zenklub), [@gioufop](https://github.com/gioufop) | Developer portal, services catalog and centralization of metrics from Grafana Stack and AWS. Furthermore, centralization of documentation and infra details like Tools, Network services and so on. | +| [Platzi](https://platzi.com/) | [@juancarestre](https://github.com/juancarestre/), [Engineering at Platzi](engineering@platzi.com) | Backstage allow our developers to get easily engaged with all the internal components, technical documentations and software templates. All new developers reduce its onboarding time via Backstage, and after a couple of integrations it allowed us to create new components with in a couple of clicks. | From 25261445de3ad0cfe95eff56407fff2ddac05155 Mon Sep 17 00:00:00 2001 From: yorjaggy Date: Tue, 25 Jul 2023 15:38:09 -0500 Subject: [PATCH 052/440] updating not reachable link Signed-off-by: yorjaggy --- ADOPTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index c14d669b12..9c76b01ff3 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -255,4 +255,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Rabobank](https://www.rabobank.com) | [Willem Dekker](https://github.com/wdekker), [Sridhar Gnanasekaran](https://github.com/srid99), [Ruben Ernst](https://github.com/Ruben-E) | At Rabobank, our mission is to make life better for engineers. After exploring various options in the market, we've discovered that Backstage provides the perfect foundation for creating a platform that meets our engineers' needs and helps us achieve our goals. We want to make our engineers happy by offering standardized services, freeing them up to focus on delivering value. Our vision is to create a one-stop platform where engineers can find everything related to software and services. In practice, we're excited about using all the cool features in Backstage, and we're even planning to build our own plugins. | | [JB Hi-Fi](https://www.jbhifi.com.au) | [@bahman](https://github.com/bahman-jb/) | We use Backstage as a central place for all of our components/apis across multiple teams. It helps us to quickly identify the ownership of a component/api, find the related links and have a quick access to CI/CD pipelines. | | [Zenklub](https://www.zenklub.com.br) | [@zenklub](https://github.com/zenklub), [@gioufop](https://github.com/gioufop) | Developer portal, services catalog and centralization of metrics from Grafana Stack and AWS. Furthermore, centralization of documentation and infra details like Tools, Network services and so on. | -| [Platzi](https://platzi.com/) | [@juancarestre](https://github.com/juancarestre/), [Engineering at Platzi](engineering@platzi.com) | Backstage allow our developers to get easily engaged with all the internal components, technical documentations and software templates. All new developers reduce its onboarding time via Backstage, and after a couple of integrations it allowed us to create new components with in a couple of clicks. | +| [Platzi](https://platzi.com/) | [@juancarestre](https://github.com/juancarestre/), [Engineering at Platzi](https://github.com/PlatziDev/) | Backstage allow our developers to get easily engaged with all the internal components, technical documentations and software templates. All new developers reduce its onboarding time via Backstage, and after a couple of integrations it allowed us to create new components with in a couple of clicks. | From 5cf35d194818a4bb72db158e94d569c4ca8ec5dc Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 28 Jul 2023 14:22:57 +0200 Subject: [PATCH 053/440] Remove shared environment code & documentation Signed-off-by: Philipp Hugenroth --- .../architecture/02-backends.md | 2 +- .../building-backends/01-index.md | 32 ------ .../blog/2023-02-15-backend-system-alpha.mdx | 1 - .../src/CreateBackend.test.ts | 82 +++++--------- .../backend-defaults/src/CreateBackend.ts | 22 ---- .../wiring/createSharedEnvironment.test.ts | 100 ----------------- .../src/wiring/createSharedEnvironment.ts | 102 ------------------ .../backend-plugin-api/src/wiring/index.ts | 5 - 8 files changed, 26 insertions(+), 320 deletions(-) delete mode 100644 packages/backend-plugin-api/src/wiring/createSharedEnvironment.test.ts delete mode 100644 packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts diff --git a/docs/backend-system/architecture/02-backends.md b/docs/backend-system/architecture/02-backends.md index b6079d71b4..70ea8f7836 100644 --- a/docs/backend-system/architecture/02-backends.md +++ b/docs/backend-system/architecture/02-backends.md @@ -37,4 +37,4 @@ At a high level, when you call `createBackend`, it will create a new backend ins Underneath the hood, `createBackend` calls `createSpecializedBackend` from `@backstage/backend-app-api` which is responsible for actually creating the backend instance, but with no services or no features. You can think of `createBackend` more of a 'batteries included' approach, and `createSpecializedBackend` a little more low level. -As mentioned previously there's also the ability to create multiple of these backends in your project so that you can split apart your backend and deploy different backends that can scale independently of each other. For instance you might choose to deploy a backend with only the catalog plugin enabled, and one with just the scaffolder plugin enabled. We've provided some tools to be able to share services and defaults across your backend system, and you can find out more about that in the [shared environments docs](../building-backends/01-index.md#shared-environments). +As mentioned previously there's also the ability to create multiple of these backends in your project so that you can split apart your backend and deploy different backends that can scale independently of each other. For instance you might choose to deploy a backend with only the catalog plugin enabled, and one with just the scaffolder plugin enabled. diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index 66bf68ab07..0f23ae0006 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -148,35 +148,3 @@ backend.start(); ``` We've now split the backend into two separate deployments, but we still need to make sure that they can communicate with each other. This is the hard and somewhat tedious part, as Backstage currently doesn't provide an out of the box solution that solves this. You'll need to manually configure the two backends with custom implementations of the `DiscoveryService` and have them return the correct URLs for each other. Likewise, you'll also need to provide a custom implementation of the `DiscoveryApi` in the frontend, unless you surface the two backends via a proxy that handles the routing instead. - -### Shared Environments - -To make it a bit easier to manage multiple backends, it's possible to create a shared environment that can be used across multiple backends. You would typically house it in a separate package that can be referenced by backends in your monorepo, or published to a package registry for broader use. - -A shared environment contains a set of service implementations that should be used across all backends. These services will override the default ones, but if a service is provided directly to the backend, it will override the one in the shared environment. - -A shared environment is defined using `createSharedEnvironment`. In this example we place it in a new and separate package called `backend-env`: - -```ts -// packages/backend-env/src/index.ts -import { createSharedEnvironment } from '@backstage/backend-plugin-api'; -import { customDiscoveryServiceFactory } from './customDiscoveryServiceFactory'; - -export const env = createSharedEnvironment({ - services: [ - customDiscoveryServiceFactory(), // custom DiscoveryService implementation - ], -}); -``` - -And passed on to backends using the `env` option: - -```ts -// packages/backend-b/src/index.ts, imports omitted -import { env } from '@internal/backend-env'; - -const backend = createBackend({ env }); - -backend.add(scaffolderPlugin()); -backend.start(); -``` diff --git a/microsite/blog/2023-02-15-backend-system-alpha.mdx b/microsite/blog/2023-02-15-backend-system-alpha.mdx index 2aef5596a0..28ff7bdf6b 100644 --- a/microsite/blog/2023-02-15-backend-system-alpha.mdx +++ b/microsite/blog/2023-02-15-backend-system-alpha.mdx @@ -26,7 +26,6 @@ When we set out on this project, we had a few primary goals. First, we intended - Make it easier to create and maintain backend installations. - Align how plugins provide points of customization and how those customizations are installed. - Make it much easier to maintain plugins, in particular keeping the API stable. -- Simplify the process of splitting plugins out into separate deployments with shared environments. - Improve the local development and testing experience. Prioritizing simplicity is often a guiding principle that we use for designs that span multiple ownership roles. We decide on which parts of the system that we think are the most important to have as simple as possible, or, viewed from the opposite end, where in the system we put necessary complexity. In this case, we optimized for keeping the backend setup as simple as possible, followed by modules and plugins, then libraries, and lastly the framework itself. What this guidance means in practice is that when there is complexity that needs to be added to implement a certain feature, we place as much of it as possible within the framework itself, then libraries, plugins and modules, and if absolutely needed, the backend setup. diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 946de90b2b..88e6bddd97 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -19,10 +19,9 @@ import { createBackendPlugin, createServiceFactory, createServiceRef, - createSharedEnvironment, } from '@backstage/backend-plugin-api'; -import { mockServices } from '@backstage/backend-test-utils'; import { createBackend } from './CreateBackend'; +import { mockServices } from '@backstage/backend-test-utils'; const fooServiceRef = createServiceRef({ id: 'foo', scope: 'root' }); const barServiceRef = createServiceRef({ id: 'bar', scope: 'root' }); @@ -86,65 +85,34 @@ describe('createBackend', () => { ).toThrow('The core.pluginMetadata service cannot be overridden'); }); - it('should throw if an unsupported InternalSharedEnvironment version is passed in', () => { - expect(() => - createBackend({ - env: {} as any, - }), - ).toThrow( - "Shared environment version 'undefined' is invalid or not supported", - ); - expect(() => - createBackend({ - env: { version: {} } as any, - }), - ).toThrow( - "Shared environment version '[object Object]' is invalid or not supported", - ); - expect(() => - createBackend({ - env: { version: 'v2' } as any, - }), - ).toThrow("Shared environment version 'v2' is invalid or not supported"); - }); - it('should prioritize services correctly', async () => { const backend = createBackend({ - env: createSharedEnvironment({ - services: [ - createServiceFactory({ - service: coreServices.rootHttpRouter, - deps: {}, - async factory() { - return { - use() {}, - }; - }, - }), - mockServices.config.factory({ - data: { root: 'root-env' }, - }), - createServiceFactory({ - service: fooServiceRef, - deps: {}, - async factory() { - return 'foo-env'; - }, - }), - createServiceFactory({ - service: barServiceRef, - deps: {}, - async factory() { - return 'bar-env'; - }, - }), - ], - })(), services: [ + createServiceFactory({ + service: coreServices.rootHttpRouter, + deps: {}, + async factory() { + return { + use() {}, + }; + }, + }), + mockServices.config.factory({ + data: { root: 'root-backend' }, + }), createServiceFactory({ service: fooServiceRef, deps: {}, - factory: async () => 'foo-backend', + async factory() { + return 'foo-backend'; + }, + }), + createServiceFactory({ + service: barServiceRef, + deps: {}, + async factory() { + return 'bar-backend'; + }, }), ], }); @@ -161,9 +129,9 @@ describe('createBackend', () => { bar: barServiceRef, }, async init({ config, foo, bar }) { - expect(config.get('root')).toBe('root-env'); + expect(config.get('root')).toBe('root-backend'); expect(foo).toBe('foo-backend'); - expect(bar).toBe('bar-env'); + expect(bar).toBe('bar-backend'); }, }); }, diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 480f365216..7051b58ae5 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -36,13 +36,8 @@ import { import { ServiceFactory, ServiceFactoryOrFunction, - SharedBackendEnvironment, } from '@backstage/backend-plugin-api'; -// Internal import of the type to avoid needing to export this. -// eslint-disable-next-line @backstage/no-forbidden-package-imports -import type { InternalSharedBackendEnvironment } from '@backstage/backend-plugin-api/src/wiring/createSharedEnvironment'; - export const defaultServiceFactories = [ cacheServiceFactory(), configServiceFactory(), @@ -65,7 +60,6 @@ export const defaultServiceFactories = [ * @public */ export interface CreateBackendOptions { - env?: SharedBackendEnvironment; services?: ServiceFactoryOrFunction[]; } @@ -81,22 +75,6 @@ export function createBackend(options?: CreateBackendOptions): Backend { ); services.push(...providedServices); - // Middle priority: Services from the shared environment - if (options?.env) { - const env = options.env as unknown as InternalSharedBackendEnvironment; - if (env.version !== 'v1') { - throw new Error( - `Shared environment version '${env.version}' is invalid or not supported`, - ); - } - - const environmentServices = - env.services?.filter( - sf => !services.some(({ service }) => sf.service.id === service.id), - ) ?? []; - services.push(...environmentServices); - } - // Lowest priority: Default services that are not already provided by environment or directly to createBackend const defaultServices = defaultServiceFactories.filter( sf => !services.some(({ service }) => service.id === sf.service.id), diff --git a/packages/backend-plugin-api/src/wiring/createSharedEnvironment.test.ts b/packages/backend-plugin-api/src/wiring/createSharedEnvironment.test.ts deleted file mode 100644 index 381a4799d2..0000000000 --- a/packages/backend-plugin-api/src/wiring/createSharedEnvironment.test.ts +++ /dev/null @@ -1,100 +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 { - createServiceFactory, - createServiceRef, - ServiceFactoryOrFunction, -} from '../services'; -import { - createSharedEnvironment, - InternalSharedBackendEnvironment, -} from './createSharedEnvironment'; - -const fooService = createServiceRef({ id: 'foo', scope: 'root' }); -const fooFactory = createServiceFactory({ - service: fooService, - deps: {}, - async factory() { - return 'foo'; - }, -}); - -const barService = createServiceRef({ id: 'bar', scope: 'root' }); -const barFactory = createServiceFactory({ - service: barService, - deps: {}, - async factory() { - return 0xba5; - }, -}); - -describe('createSharedEnvironment', () => { - it('should create an empty shared environment', () => { - const env = createSharedEnvironment({}); - expect(env).toBeDefined(); - const internalEnv = env() as unknown as InternalSharedBackendEnvironment; - expect(internalEnv).toEqual({ - $$type: '@backstage/SharedBackendEnvironment', - version: 'v1', - services: undefined, - }); - }); - - it('should create a shared environment with services', () => { - const env = createSharedEnvironment({ - services: [fooFactory, barFactory()], - }); - const internalEnv = env() as unknown as InternalSharedBackendEnvironment; - expect(internalEnv.version).toBe('v1'); - expect(internalEnv.services?.length).toBe(2); - expect(internalEnv.services?.[0]?.service.id).toBe('foo'); - expect(internalEnv.services?.[1]?.service.id).toBe('bar'); - }); - - it('should create a shared environment with options', () => { - const env = createSharedEnvironment((options?: { withFoo?: boolean }) => { - const services = new Array(); - if (options?.withFoo) { - services.push(fooFactory()); - } - services.push(barFactory); - return { services }; - }); - const internalEnv1 = env() as unknown as InternalSharedBackendEnvironment; - expect(internalEnv1.version).toBe('v1'); - expect(internalEnv1.services?.length).toBe(1); - expect(internalEnv1.services?.[0]?.service.id).toBe('bar'); - - const internalEnv2 = env({ - withFoo: true, - }) as unknown as InternalSharedBackendEnvironment; - expect(internalEnv2.version).toBe('v1'); - expect(internalEnv2.services?.length).toBe(2); - expect(internalEnv2.services?.[0]?.service.id).toBe('foo'); - expect(internalEnv2.services?.[1]?.service.id).toBe('bar'); - }); - - it('should not allow duplicate service factories', () => { - expect(() => - createSharedEnvironment({ - services: [fooFactory, fooFactory()], - })(), - ).toThrow( - "Duplicate service implementations provided in shared environment for 'foo'", - ); - }); -}); diff --git a/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts b/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts deleted file mode 100644 index 57f0533523..0000000000 --- a/packages/backend-plugin-api/src/wiring/createSharedEnvironment.ts +++ /dev/null @@ -1,102 +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 { ServiceFactory, ServiceFactoryOrFunction } from '../services'; - -/** - * The configuration options passed to {@link createSharedEnvironment}. - * - * @public - */ -export interface SharedBackendEnvironmentConfig { - services?: ServiceFactoryOrFunction[]; -} - -/** - * An opaque type that represents the contents of a shared backend environment. - * - * @public - */ -export interface SharedBackendEnvironment { - $$type: '@backstage/SharedBackendEnvironment'; - - // NOTE: This type is opaque in order to allow for future API evolution without - // cluttering the external API. For example we might want to add support - // for more powerful callback based backend modifications. - // - // By making this opaque we also ensure that the type doesn't become an input - // type that we need to care about, as it would otherwise be possible to pass - // a custom environment definition to `createBackend`, which we don't want. -} - -/** - * This type is NOT supposed to be used by anyone except internally by the - * backend-app-api package. - * - * @internal - */ -export interface InternalSharedBackendEnvironment { - version: 'v1'; - services?: ServiceFactory[]; -} - -/** - * Creates a shared backend environment which can be used to create multiple - * backends. - * - * @public - */ -export function createSharedEnvironment< - TOptions extends [options?: object] = [], ->( - config: - | SharedBackendEnvironmentConfig - | ((...params: TOptions) => SharedBackendEnvironmentConfig), -): (...options: TOptions) => SharedBackendEnvironment { - const configCallback = typeof config === 'function' ? config : () => config; - - return (...options) => { - const actualConfig = configCallback(...options); - const services = actualConfig?.services?.map(sf => - typeof sf === 'function' ? sf() : sf, - ); - - const exists = new Set(); - const duplicates = new Set(); - for (const { service } of services ?? []) { - if (exists.has(service.id)) { - duplicates.add(service.id); - } else { - exists.add(service.id); - } - } - - if (duplicates.size > 0) { - const dupStr = [...duplicates].map(id => `'${id}'`).join(', '); - throw new Error( - `Duplicate service implementations provided in shared environment for ${dupStr}`, - ); - } - - // Here to ensure type safety in this internal implementation. - const env: SharedBackendEnvironment & InternalSharedBackendEnvironment = { - $$type: '@backstage/SharedBackendEnvironment', - version: 'v1', - services, - }; - return env; - }; -} diff --git a/packages/backend-plugin-api/src/wiring/index.ts b/packages/backend-plugin-api/src/wiring/index.ts index 242301ea4d..9cb767b8ac 100644 --- a/packages/backend-plugin-api/src/wiring/index.ts +++ b/packages/backend-plugin-api/src/wiring/index.ts @@ -14,11 +14,6 @@ * limitations under the License. */ -export { createSharedEnvironment } from './createSharedEnvironment'; -export type { - SharedBackendEnvironment, - SharedBackendEnvironmentConfig, -} from './createSharedEnvironment'; export type { BackendModuleConfig, BackendPluginConfig, From d008aefef8089e9aaeda25839ed7dd5df55aabf6 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 28 Jul 2023 14:48:38 +0200 Subject: [PATCH 054/440] Build api-reports & add changeset Signed-off-by: Philipp Hugenroth --- .changeset/rich-zoos-occur.md | 6 ++++++ packages/backend-defaults/api-report.md | 3 --- packages/backend-plugin-api/api-report.md | 21 --------------------- 3 files changed, 6 insertions(+), 24 deletions(-) create mode 100644 .changeset/rich-zoos-occur.md diff --git a/.changeset/rich-zoos-occur.md b/.changeset/rich-zoos-occur.md new file mode 100644 index 0000000000..65d21710d1 --- /dev/null +++ b/.changeset/rich-zoos-occur.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-plugin-api': minor +'@backstage/backend-defaults': minor +--- + +Removing shared environments concept from the new experimental backend system. diff --git a/packages/backend-defaults/api-report.md b/packages/backend-defaults/api-report.md index 07218f610e..6cc58de663 100644 --- a/packages/backend-defaults/api-report.md +++ b/packages/backend-defaults/api-report.md @@ -5,15 +5,12 @@ ```ts import { Backend } from '@backstage/backend-app-api'; import { ServiceFactoryOrFunction } from '@backstage/backend-plugin-api'; -import { SharedBackendEnvironment } from '@backstage/backend-plugin-api'; // @public (undocumented) export function createBackend(options?: CreateBackendOptions): Backend; // @public (undocumented) export interface CreateBackendOptions { - // (undocumented) - env?: SharedBackendEnvironment; // (undocumented) services?: ServiceFactoryOrFunction[]; } diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index b3cbef993c..093b4acec4 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -222,15 +222,6 @@ export function createServiceRef( config: ServiceRefConfig, ): ServiceRef; -// @public -export function createSharedEnvironment< - TOptions extends [options?: object] = [], ->( - config: - | SharedBackendEnvironmentConfig - | ((...params: TOptions) => SharedBackendEnvironmentConfig), -): (...options: TOptions) => SharedBackendEnvironment; - // @public export interface DatabaseService { getClient(): Promise; @@ -476,18 +467,6 @@ export interface ServiceRefConfig { scope?: TScope; } -// @public -export interface SharedBackendEnvironment { - // (undocumented) - $$type: '@backstage/SharedBackendEnvironment'; -} - -// @public -export interface SharedBackendEnvironmentConfig { - // (undocumented) - services?: ServiceFactoryOrFunction[]; -} - // @public export interface TokenManagerService { authenticate(token: string): Promise; From 7f5e3b6a185f4e0d7f6a7e67f82fafc3fdd4d664 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 28 Jul 2023 15:03:01 +0200 Subject: [PATCH 055/440] feat: added a blog post for frontside Signed-off-by: blam --- .../2023-07-28-frontside-adopter-post.mdx | 51 ++++++++++++++++++ microsite/blog/assets/2023-07-28/header.png | Bin 0 -> 58031 bytes 2 files changed, 51 insertions(+) create mode 100644 microsite/blog/2023-07-28-frontside-adopter-post.mdx create mode 100644 microsite/blog/assets/2023-07-28/header.png diff --git a/microsite/blog/2023-07-28-frontside-adopter-post.mdx b/microsite/blog/2023-07-28-frontside-adopter-post.mdx new file mode 100644 index 0000000000..c6f3cba403 --- /dev/null +++ b/microsite/blog/2023-07-28-frontside-adopter-post.mdx @@ -0,0 +1,51 @@ +--- +# prettier-ignore +title: "Five common traits of successful Backstage adopters" +author: Taras Mankovski, CXO, Frontside +--- + +![backstage header](assets/2023-07-28/header.png) + +At [Frontside](https://frontside.com/), our goal is to help cloud-native teams create cohesive development experiences. We've been at the Backstage party since the beginning helping companies adopt and extend Backstage to fit the needs of their unique ecosystems. + +Through our experience, we've uncovered five common traits of organizations that have improved developer experience through successful Backstage implementation and adoption. In this blog, we'll dive into these traits with some thoughts on how you can follow their blueprint. + +{/* truncate */} + +## **1) They take a product-centric approach** + +The biggest factor for successful adopters of Backstage is their approach. There is a high correlation of success within organizations that approach building a developer portal like they're building a product. Some organizations will jump straight into solutioning instead of taking their time to identify what the problems are, how they affect users, and how those issues can be addressed. + +The team building out Backstage should assess or work from existing insights on the core challenges that developers are facing in their organization — both qualitative and quantitative data counts here — and connect those issues to a product roadmap with initial use cases and adoption milestones marked. By doing their research in advance, successful orgs have a clear vision of what they want to accomplish with their Backstage instance. They know exactly what goals need to be met and have pressure-tested potential issues and barriers. + +If you've already started your Backstage adoption journey but haven't mapped a Product Requirements Document (or PRD), don't panic! There is always time to do the foundational knowledge-building necessary to deploy something successful. + +## **2) They tie Backstage to a larger platform journey** + +Platform engineering has emerged in response to the growing complexity of cloud-native software architecture. Backstage has a huge role to play in implementing a platform strategy but its part of a larger story. Having buy-in from both higher ups and the teams tasked with platform goals is an essential step in successful Backstage adoption. Without the support at the top, it can be difficult to implement platforming as a priority within your organization. + +And by "the top", we don't necessarily mean your CTO needs to rubber stamp your Backstage POC. But it's important that higher-level Platform goals have been set among VPs and directors with the understanding that a well-constructed developer portal can be the catalyst to achieving not only better developer experience but broader cultural shifts. + +Having this kind of executive buy-in means more than just getting stakeholders on board with a portal build or clearing pathways towards Backstage adoption; it also means ensuring they understand the realities of your organization's journey. + +## **3) They prioritize developer experience** + +Having a dedicated developer experience or DevOps team tasked not only with building out a Backstage instance — but with leading adoption — is another big factor to success. + +Competing platforms are very common at big companies, with many teams doing different things or serving different parts of a business. But developer experience teams usually have a very clear mandate and are often one of the only commonalities between these competing teams. This team should have the bandwidth available to oversee the adoption process from start to finish, and partner with the right folks (research, design, internal comms and marketing) to create an effective adoption plan tailored specifically for a company's needs. + +If you don't have ‌established developer experience resources in place, then the questions the team leading the Backstage work needs to ask are "what are the common problems to be solved at a platform level?" and "once we've proved our initial use cases, how are we internally evangelizing this amongst our competing teams?" + +## **4) They collaborate with other platform teams** + +A developer experience team can not single-handedly transform an organization's development structures, processes, and culture. It requires collaboration with teams responsible for other aspects of the platform. Successful adopters collaborate with other teams to bring them along on the journey of improving developer experience. They use Backstage as an opportunity to foster their inner-source contribution practice by allowing multiple platform teams to contribute plugins to their portal. + +The developer experience team takes on the role of host in that collaborative process. They support other teams in integrating their features into the portal, provide guidance on best practices, and advocate for the needs of developers. + +## **5) They engage, learn, and grow with the community** + +One of the key benefits of building a developer platform based off an open source framework is leveraging the contributions and best practices from the community. The Backstage community is the largest gathering of developer experience practitioners in the world. There are now [thousands of adopters](https://github.com/backstage/backstage/blob/63aa3a65ec05f638ba76c06878d6635194620b34/ADOPTERS.md#L4) with a wealth of experience and best practices to learn from — and they are excited to share! + +By participating in the community, developer experience leaders can learn from their peers at other companies about strategies that work and can keep up with the latest features of the ever-evolving Backstage platform. They're aware of what solutions exist within the open source framework and plugin marketplace as well as what they may need to build in-house. + +In short, successful Backstage adopters engage within the Backstage community and their peer group to find solutions that fit their common challenges as well as their unique needs. diff --git a/microsite/blog/assets/2023-07-28/header.png b/microsite/blog/assets/2023-07-28/header.png new file mode 100644 index 0000000000000000000000000000000000000000..69036b60384d215612fb79ec0a97ee1ec770d1ec GIT binary patch literal 58031 zcmbrl1z42b*Dj6)5=u(vfPgr}3`h>3(yf4k(#!y&bT=wUha&NK2R0&>*1F z(k0yu|2-)B`_B2kbDjTn=6bnaWcIUT?G^XB*Ls3)sViI{q9?+`!@HoQD65HwcQywP z@3hN#eDD{I>z?}He}s05_Z;!?h$(SDr|@3Cp~b^HZ)d5k>!houDvq?Z<}*Rrnws&s zS=)ipcz6hDH#-yLBQqyfQ!@)o8%fAgSrvrU5+w=IxuzzdW+!9zz*5n}!A#3TT^s4~ z2q}hwNK3II+{D2I)@Dv7tZvp;Hjd(Ml91zh#li2mKl4LakB2xtl7!sAEy${?c8gWU z*1?Qbj8A|UDIfr26%pe@3cv+~OyMXqb0{lZ04~Tc00;l^!rz@w{ z`#1{u_gOn<2diT-p^*G$R%X^3Bg@8uYd?IOjH{tATA&xE+BYS046RVfIG9DxEfF(l!=qc ze;o`L(H0OB7lMfk!FdI){TpnHvNU)9zZ!bH1zQJgTU)CWtyHoB8ewT+!wM7S6J+I9 zGeKI~;7)escqeLV;z~A-P9`=;GbLF`2-q8+r6o!nDPRsm3JSt_O@&27d41Ku`+RVl!Vwh*xH(lgKLGbqLAX|whq=NK*ubtO)Sj#?QAR{ ztl%s0TMo7;XQY|KiLh<~^Ha4nbue*oXN8IIf!o53(snShvoiw@L*B&75iI!k^2KFr zt!y3CY*FCG1#t!lGdP*3kRa0Z8jz@%2uzq) zKtM=<*93_a;YEs=2$`6hnurOZgdl$&M*S~>{l6B>@3n3JpYP}QJP!Y(fcgKPT+!0e z$=1RBk2BLUv;Xs(l_fX}FmiDdB<_kNAxK*r7c&PZGZgNSxG(HX987>)HFE%0XO0sb z5V@5l(gZi0-;LMO2K8HuooxThH^=w;dj>~ab0=352eTU%KnYJS^#7p!zn?-rFtM?~ z-7T>E-+ys^U_bJqXmFfKNzKMwh?hC%+v)lk2c>}1#fDZjtM zW&PhI`QI#o+r>Y#_#fAEGyy7ovf6*@^Z!4e@!!e#zwvwjhbz5x;(A%(LVVZ$t4I6a z?i6<%e%x*S)_8IY06@Zdv!i)DyuL{# z*&Et!Z{~+w%MHvDHjg^)KiV?XQc8;=^B|ZF(tMd~a-;s|MqFIOFhUR+Z;!Q?Cx8C# z?Ro06g7`N7Y zd-u1zhwgGl!NQCS$G`pB=Xg=kcwF}M+BnW8yUQ<#9S!3FvA@s+8zSwDNG&Cvk9 zgYX%N2+f{YiO*)YF;lwCIUeVc+(1eG`-85krk}l5)*|AsM)JxO)*B zmeBsQ>+bTGyif9x+<)iI5_otT+DoJ9z9GJlkigM^Dw%pRY_~l--Kqcc$#f}EuI!&r z00v$4Y?+h}nZp>UFQt)`9?j4pnmAc?aEX#VaD*5ih8dV4m-{n#LPK=aZkr*T*))d^ z8B}Nbt;Ou_prG=9fewX}qbx60cdxY?0%kr5u9}J&t zq`lko%=Ou0MW-Xhrs~!{5LkbVe&O*~3iL=PTef{IFy_M#w^>)x+dKt=dtP`{slj{MW6&8!%@^C%qMDpynZ=CvZBgcwZ%hhsj z#&{4dxZNm2DzNf3Zl2e=e)U$+$)UQAw8wk|!YsbnH%>at-#eo3X%m0q9GZxF=tNX$ zN891ZAo=d(=7W+ielirml7-iEJ73b>SSy3giUuaSuvHrSFDj?~+vjeic+PH(J!424 zuM<*qacF7em#5E-uOT04RQ??K{n3Xr8QIVQY{vHoOY^9)PwYF(wWI<*tK{>%Hs{X7 z+=QOkNaZbpyGC>!wW~XgX8H5_6&RLQ1lS)2b<>I{rUOem>34Eu?|dgL~nBbHc$WHQKhrv_R(dbe@?OfiBi5kFJ^|~gQqQS^8~|}l>?kic`)f` z{#~|1&bKGm@T?k=%95irGnM8zgQOu6Vo`pNc%tSx7 zFybOb92JYlhzO(m<})GJr7sy}|IG4YnDQV&2n^pU9vEeMreAz}NzkRp!G^kJw(X}k z!v4wcVi4uUz^cv}HhDOb1g#t9QPLV>bPzC7$Jp@3LCWxJ()}x@_nOI0%;7NP(Bl{GL^*ZR~tVvg3fin{J3EJHRk4tG)29d&*K}b^Z<&1H<4i0q zI%!3HFnl-m-E@tM(=lu&@Npz1_kELEV{T=Y^B=Aou1iFe6Tsb4xcrN6fr%+h!W5sy zeftzAqj*$m*Ig*-vlE92zt8=Jz6(k`koUmSl8ttKE&cME=%#;u?>*ah_xVf*D&;j! z!U6m%(XTJ`V_`5^B&^xs+}(qHo52S`?Cr(peFZ)mo|q5a1)#S{gJoG0 zz!K%YMtuGBZ%E(gXLh2wRt(v9lPmJ02n8cY*h!_o6kk#3(jI(j2K~1=ic9nI8mt8E zZp<+q3VgB1p4S(=j$V!T69q(HvZURB0q&(uD?Yt=4U7gZ0G2pn5ff_Y{rqQDZkA%st?G z9punc*|fOFK;CBScFQ50c(ukcH*;8E5Dj*ve4_E#%v zfmX=lv_hApNPp^?(V(BN>WjEEgCN4)*>tKL=w$Rsn3&hTWE?Jlr3LZPFeUJNBtqSy zMcuq&!Jy91Qu(`!zyp<}KfZ{B3%HJS=s@aEgQR?I)M`_M{p3cE{mkri*MHohA&}3D z1=95UdU~g}x0AOVn^TrhIvqB@Brib+EGOJf93a8X%Zu!BFnlBlI0@czevv_alyt>2 zSoMlOB^@IB=fBH2Kf zR4dR2b~yE+$nXon($R%ryVn)O;!PJmSlW3-I z#iP#p7-sm-xOW7Ja^&fdB%;TWv8T}fAlM>jB39Z=-wu(atNG8sCO({b^b(E>H+C&U zpNfxe@O%e`SWe+9AYamz^-qC$z$W|qBGfdJWRtquTCeg=;^KENOImsk9RtI^8w|g5 z>+xmX!f>7J?w_62#q8$GoeDl3+jI)u+WjGuNn|IgL$7oyro25bhc`4Ph8ogImgsIn zuE6LGDVtN%ZjrMZ=$Sb|A}A-G4`)<<=2X#S^mf*VBpxt|OpFKR^HsBib!GnDpe2d3 zaZ@5dd8Uqnmy9=u4Vw0r4$j?>kk9|?@=?o{#7X61Erlx&o%R^nW9E7zI(z z1iv7Dhug%OyGOI+{`MPU_tD^CK^Q#F4iP^6ok8+M6~j*R*vD2i(aJ!nlgnS&KDWV3A}o%Z&_RT?kqPaes05f#hIUe&Zi(JueofKl>AC>^2@ z*{ub=J+o*&HEBC}2AHDg^S32AgafPBJpPL4HHe6)TlY?kv6tQ4ZUIRuXwr{!hj)GN zY9=l^qUxEp`_^Y$&l2_zc^*C&&v~BbX}3t~z!bl2sfNb;l6;7}n6ewjv%_ z89nQzn=S1GqYaxI`~J&qL);kefDxCu%@X|j@&cQWiDNL^?I!Hga`VfX#!Gc$e)Y@BqU`9#N6-4zof%&_ z!~1Mu-mvgZ%(c0h-kjhujHFZ1=i66f1TfVXw+ZXs`8&{c38tbYcNMXWB2lo0c8L5_ zo6;-PTTgRy*6rj04xcav8jw`)!gxPEo>1Xt`H@J~)cYa>B?g0+rT25Jjc|!78r@Dy z!aV90BT87Bp66bzRlfO^(h9T2!ONeWHdTVRjmJe+x4E>pgF=vI-)+e3`EW*)KtT;f5(O4b2tAyCi{8EBuyeJaeP^??$Hgj7c_> zpE+m|Um}TvAzwMS?Zw&Gr>KhUG4A`%a9h{A$zKh}q2xnxAX=fm2$__O>$zz)@B0LI zz8qAU*Q_HSXz~MZMS|CnL8%eOrTU6yaqryP(P5(H&%$s#vP1!9F0wCfhD&@l_kjJm z>PghMt9yNUN!&hJezZ?5s4f-1`OENEG(0Br`!R;|eF9Ea`l%<;u&A(rJml=oc2uNe z>+E!%3QkSCjKZpG*%=b$OZwZ9iTe=#pF6}ieWX_i$G3R%;0LZ5sC(2lneq);L%Lt& zhW9ku_oRcO35kaZUU~WT9m%DeS*}taCCy1X5vcCBr8kt&^D0kzkRaVbWuW zRgEVqyl{rfuwvyWCQzFCG8IXlOFQDe@F&wBWm%kLVYkzrep$rh&cKrKkT{8ip>X_` z&C*-_Z2SI(?9nBgvT(dpuS4~!-?BH!$xb|WPi-&Wb}G#BeZs=xND-5(q?Y(pCxi4C zV~q9q_qq9@+^9Gm{Tc#hFOpbs1A~Da>!Y{rI2Z)?zqIbA5pbcynK11I2hu*~rw`3= zqFCq!4e9FMUMj0ZzuATekhsy6AhftB6Wg=e=8E^;wN&RTsxj;@6K!VJN#%lA(hRKt#;okEWp`qmjNZ@W|g7 zf3O$Cksu^6;1PRaSdhoXc2Is9eGX03lv3CS9_DX@Ac@GzD-9{B$(F`KgwvSu-Nkd@UH*a`-d6#`CG2}!^ z!gXD50%u2GulU11(fvsu!$V{9+(!`+mA~M5!7|);2JS5KK_Fi$6KO^jLrU+AKgq~S z^0XC1d)a)^U_d;;lBsj{74DjiMddNNckNI;T+sEH!nuQFy*sWl@OhBqvk;+`(%j8{ z-prETJX`qbKDM}5`^|McWI%5q&`Ub6Lbk>CZi|5;dC2ednp&JDgKVXe9fiSxwa~pS zmYgDM;#@_;j2y5})VFRTD4iHI^nsA_Tvi3bcW$9BRc+!GIWkJDQiHZW4 zx6TLRJiH73f|ed-HqCf01XCCrd{-)JE_jBN}?W-XK&_BCZv%8|2p z8{z=EHFBp+a>F6+SqiKaoC(S+tF;<-2f18%(*?0~G>H+pQZS-f4y11mT5 z?-$wB7J9mtnN={CTYEdOF+WZo5XRYJg%cMCdkhS}<(RqhHlr+h<03pDTwYf*2$(<*UQ(-zfRtXBO_+ZeHn+i7f2rOJ#Ot?jH6aXIS(NnwXHexa*zp zI5EN@ILo@M@r})RJ@%%II{WA44_X@`-^$92js(ATsNrq^0X){XW&PL(d6~@mDVt%n$GwiFBD_>|J-5EE}+dLfJ`sIDfDs}T7u<6lASw;1Po5JF8JbVWAOvWTJ>f4uqByPL~*K=vyT~{hlU$|wl zfT3i?Uu&l|@0qIfs+&t}5mH}AWDEo|R9N6R>2o4A>yo96Z0kh3y~>+Tl4F1eBF5vV0|xR9+x@ru%-%w>rX4N8fGlxo%aATpP1^S?#uW zSQf7F=1ZNRy4epdsk+Z`X`Pb=x39SD*Dt&Tt^#r(m-x+W9fsdQ>rlctWN_I=YL>*% zZQWHhOcg@W@o~^V_B{=v<1$$UnpAD1-g9XpqR%34c{jdyuS@w?bo0?+D3;-y5q3?0 zxq|2RkqrKaSWiRJx{J`Wg0#@LccBXdmA!hxx)I^&aW{_E2DXTyE!fPvePs^ULT!rU zBs4sT9S;|b&JWPN3x@6XT>%?9qaN9U`nHOQRF%@Oa1@mG-n%ou{iDk6uxg*Oug>W{ zju&$n39Du~Pq{Jaw(5D*M0vD)6y(nymMC>0TgvHa_|L4$)5`-FJrj*?kY4ku7O>Ii z81@RMB)VO1){#fEJW%0l{s7^(ux7GH?>jIRDX+NASUMo?w*P22^`JnleB8p7oaA!) zCROgbqZaUJ_$TbAEPXw&JL=j^lDVmNgHQs;i-qk63<7t@Sg`!}fmTrEU zeaNt4Kc4djox42bhVLt?3Z*w2s<8-0-DGsfUVb^pMDXnbCy-AU@tvztO(YJK9~!?R zD|~qFJkn!GvU}cv*b`D{l?qS5Ws*DbHJv2&Q<8(QH4+aZIn!~hak-TBYX%2E?KtjT zTy0>iZ_tqnj3iqyh#&sE*R=NQJ%!fF2m3w3w64z%*P5E5hN-i z`A|%nK1yx?Pz8-nf2%PGnb!+8dklEvg0euC1bb%wcK4taw9RtHN~ zVEXA`!}fu#4KsT5(!9i3j%$__WjdLoi!FRAot|aW@7@c3Cix3536%m z`7C-uqTkCKyPey+Ybv)Y)_?!L?q0?)8C&z)#OKH1Ip8!DEj>~K2y@KClA1{VlBZl* zM|}5&X~%+dc|Kescc&~IR(Qr!MlBf_S-GKl!5OpCs2j<($BuQ{gLV1Yn?2!wQ~1wp+ggCYSnJ$bw_b$ z_iu!hZQlA=2#RBY+V)kzyN59n<;a3!PpQ9_(!Qi5^q{GuulxbwQsn`lf_|Kv=d*1n z#;D(?AU~C3J-BF7?!olv{F@gdz)&0wD6}|7zt342~QVm*$tVgUMyq@6oS;bT^7>+Ag7&R8GF^?9n{gl_T z=KsD3FI*7vP$fqP08YN8P+?O!S=t0a+EN&-Mtd|>C4Ilg1wVne*;(^JXa7~KRnvXAc5n$#h zT0lF^J81DDr_X*N@$Bp(YwW8C3#yZ9-#WoLU5NLDJM*DkkSb4GX#-|#7pd{yeE=WZ zkcNb6OfLRj6XN|IPvt!eE%Hll)1-q?RcSO!f;*p{p<%WEjP}#cSAQvKP)>rP4^2rh z)98-Lncmz$hDhnSz{3Rw*#&4*9S6=!9e*lt^CgzxqIW|U1M^a5rFYwjgzv*i`E26x6)=z$OABpai*3oZ zsO7W~+km=MmcCxewbYd&K$ib48^fWvITf?FOeY=0hPlL!{g_QT?YXo`&KzU0wMrZ#>+hE)@86XH{z4VrCgzd?joph!J1U7PXf&g_GU z?*>+hk)Y(p_LeKga$Qm8b!d|E6O8gHz#(*X_yC(Y^A1l1MdqHR!b;D^5S-)KChlW5 zAM9n`bUNadH@!s504yuiY<4`q@v$Jjp8_|AP5y;VspU}KlL#GQEt`k$ei+~*uV_o* zMMyu^$<|!>1tE*P=D}$B_&P$l;1+5&GP{=MyjJ#xkjML^23nGU>ri>CLD8;24KBw< z6aSm1h@8F-eGjmnE7S)(Np>zgE^L!8Sm^PB=;v!9lp+2*BTI{;+oAkv=|5!)^g;Pw zK9UP=>TZ~D3nKS|Br|2`Q|SVqu(WXOkB#hG{oS$^A4!J^YVoL#2?eUUZ$rSt`L#MQ zmScDf%3LZ|4p@C{juOMAsW^pwpgYJ&ljd{N@VRjo2m`Z9{D5r1drv$dld87>(Y${G zc#{eoZ!+n8R4-?ASVc9P`n5n$!&Gj!uQKWe8&lj(QZvk6b@->^9hXfjuS?QoN@*){ zHNAy*Z)}F#%?RFQBn_G_{nl(&Dj}YJnle%>r2BBR<;^l$J+fZ$9&PWbi{rS2}#qZ5gVJtA9 zq%V2aza%A{sENYFtmt)yy=fFMZq#MU0|J;%EnTz}C_0~)KYtDm-7m6TZ526U>bZtW zRmb;xdX?M~)YV{FDs!7m{^PgX53+3?rz|REbJKz!7JRZ%1t;+)QWs@Bluu40quU6p zUfBtfefN33x4yZ|r)gVIV=AXsdy!{( zFrkX$l?Ht6GcoLjv}E+tn^3ghM4Wg@uePDP4|A1gL!e^n3;(VwVHxl2$?5KgO_M9u zo&O;ze0T_ZqoO{MW65QrDsrvoxJ;FtfRhjwhlTtwJQ>XHVG*fJjC-3^>{P0tatgT3 z2|Pg7$UAEDoLj8eRxZ^W0BALPSy?uK54l{Q+`C{0Sd=zpBjh9u5$_mq#YhS`c!#DzS^BS zcBPyGozyP4twrc&MyVE|VlpL!9k`*nLKXe6qmuHDGbt;`=_A3G*#NhFSG2X=IXh?3 zbxUxvJU`B@@%FmzC0yIbz8RJ*G920P=xUtfLM&lmZEyAURbA+?(9ag<9f4xMCyh3Vw*p-4SF}$t>E$wpHjQ(d3Vb_eM3MvV0x{FzLX)|oY%;Wb^sbN7 zN{JKA{YK8zak|VpiX9n~tMxxGWz6(0_g8+`fk0}*VZG_11#JWAHhniZqBv>K=UHtK z#eDL@JeI!BL51zcRp{t09>um*%4x$%g>?N^DM8}@mSEG}hj`~bWR z>J<$8*g6W-$@@y9^faX7b&NbBR?t_@BJIK5m1li+B;8fyg4D*D>Ah0ER8+v!QkA{c zTxi|3!lCD~FtT!4L+hhcR0P*LuBaxD0G3gUhJnjk&2w+TStpYBl?FIMt>l18g@Sk68e@2p?z8|so3$JFIP&)oxTizzPp z;Yh87j`1SKsr^0I?WO_#)c&Cx0O9IX=)#+4+1~_(o!?XGKjL@=$373KpUrYwtIH?u zE%sikq$KhdPr3!R#fgh$=*kuSSUYjKM(2B=dtl%A2cehgVU+4CC)zUN_}tv1ttlN8 z)ogZD3AE+i-Hh9rcb)rtjL3$EG*k?0X-+L)rbYs=EQ$5(UhuKOm zEjO6)(~yMgTIA7oq}M!>B{^-n!}Ec>M1#GZWGtz{8rzR-Jq_V_>vctVBd9%#&3~;e zo6lKw z#b!)HG&yV9eZ!qms=8NTHL*=_W8um>`Uh!V0_-)VBdPVy+xgE%UZHRYU zs9Ipd=)#%J6p7Et5N*q+V=&B5t6B5S+a9iS%QSDVjHmYyWJj)oG?P+EcnP!b|enFUNR;+4KS)vagt63N>N?N zG$mc-ADx|bnK^jWad#F4=11QE5gJ9cjH{Q%G!MEoT|yil96_cTWZ?FVm1HU+c>s5^ zM_7=I8b4R$uIswPpZDv#GY322(>WJsF9XIp%B zi4Q%ox99Jdy^%51s=iy2fja;yta@pU@`8fyPO~_(fly?YCR!WOH`56s|HW4zNZiJ{ zF&7R4HA``{B`(6aFkhXPZ1- z_zf=fk^zi(er%UiZe{einKpG>^%eM8K{v2VU@DS3INOAQoO60jmXT%4cXVlI(n3o9 zIc;2>kbd@$nH53!4`oJ2A73>%T&++q_jc4(`M=E(0 zCPzB~cZHf&mqEQ;JN7bgYKx{!>B&^bjip|S!cutIAP&anjN)fH*6bKFYv|N~ z0sYskI}neD*IwlMGaCcv@jMw%MfPzIvD*`UK8=AN27_+clGdZn3lnFM!5j{N z??6}m`jp>3X0YT#Z6E zm{N;Rznd}Wy)~qoAYRakRFa074--C%#t=pFy1yRc^;D|Y)Qw5ORr|W^JP!iqdOgY|O!$^L)5SCF;1@#0Yc8uU8I!m>FVr@3;X%{tE7J zG<3)>d7v3m$hIHb#+86A^Kl_isF;KhC8;+XWcC&w(gXA^>@u&5xwlLbDY;3jA+^Jy zS7=k6S!SF>T2+fa)#GT-7--p@YG1uWv%FbURne){gtr>TMjdf$F@3o;R0Stj@9o>5 zZ>&TU`{NAo7M6J4t5oQ!CcyxGDTTe5gh7YJ`tr$^#PQ}iA4LK3w2DWe;A-8qVhug6 zfFH}`1~Rnaau^#U$*7}Od5+DcGQHQLM-zfdvg1zCA-zP&z>hwkT?q!Z+p(cI;`%>-8vEICjL95nQcA{O0mE$IuTyK5`_(oN)o}t=8kq5Q0`W<|hwcs*1M- zln@vD{8;(CG}OAi?S#<(+V%-JpP;-WE>F%lQ;kQ0k$kTeEOM{&U>?lq1Jl_Bri1n~ zJ?VaMrV&Z>;?(<*Wqi|$K4v)ZPrDM@$2^Sf5{M`>V*rHo_LavvLDP>zz}MsFEsnGP zY0II?c!mgx;Ax+&N1Xng6ycH8YY)RQ0Ak4Q#=!zm&>NYC7K`~EIVJ;--oGQU^PNRmKHPu5r* zP3-8_PS7)Uw~rKLR}EFM4NxOE9lj-~Y* zp60rwk>k^n(R#1+d8r;3UHBsj&@n`Uv$8H}5PF&?9jIOpl=%E0EMMRDQw>tBVTl-X zw@Ky#t(<5d;QaHTxcl2&9P5-@n}uFds;9&i!`=@A42SlabZ3t9!rU(j9N_aNi1c2P znDBDf3|4Y8G&p7)Q1 zwLg+pO!=zL31jN$a>3=VX!9e&XOaax8d60;nVv4s!>}uR`^QTg;qLC#XbIn__6u!D zwWI6)i@At5a^0!dRKwKHFbuVV!d937W+h1Bovv=HLE-bsxx3^S0twH_9K*(4z(xg; z(2l$J`bYz^uF$}W;K7Euh68<*&=iddT56Pme2)YXKrJW^h-_#-oK!TX{iMwe^d!lgw3M9H&z#l=@4> zq9IiqdBc?NX8M(xp%IjX{B1{kO)4 z!2)E3$ND2 z)-QthgF*fde?f~}7Q2`(`&6gU+Ps=rWku{_ZVt{;cjk_l1_f#wq8Fe*?R;ozBX$5K zO7M)MO^ldy6zIPXQeLLBF%$I5!>58MRZF+15h z85CFpEnlIwDH*Y9HfTdpb|1Gq!)rh@ogC!s=~Ebkf;TA{IskB--#&wzcH#nXQ7AYs7L~Y0L8r$ObOyGx@(#Ff?Bfld|od6cJ2+z8O z47I5t%9lYV(XWo6uPxkI0rBZGXjsDoRODnSUofbBq_;Xs@14`5<{P6Vo)Rz_Gnqem z>*5te=ILCi(6wuwKYqxU=wsIq5cK&t)c`Lk4OX%TxCV4z05?OmxMN@C&(pO_&#Fee z5%SyAB*>aJnYE|{DL2j^2VClKUU?=n0Wo=PI8eizmQc$zE#1Tx$SkAfE`gadz2_l* zH8~O%a9JfL=RqeVhTo|D^|eP29zJ}h3)RfLdun;_pw1Kqs*2sIYRIY9IDNb7bNXH@ z_1j*hm&wpc4T1r>9Lg#EwKbPIZfEp}n)jQ4mq@<-y7mlMS8~weT{+Y?t}MA)!q_IU zx$Jk3Yx&9W;cLp_P4)Y~+SXr&_7--}T#>`C$A&YMOvdQBO`sLrCZlx@XSTegSfmmo z9|#f6&qZCO4*gtIly5&S54KRdRdwW@s*%{PH@pk_jH^i##+e8cS6Hp{%3CR ztmn+6OmjQOip_pNrhj8B_2l{8EOCxkiwtej;$1N~l&QVbG>|=(dvr(&uSBHRp%B>@ zc|4-Yt)|-(yk=F5On-d3r|&xCT)x_TwQk%V9@olHMG<@!t>|wopeR7g!Fchgvns01 zT!}Nvs{eCvylrKiV7sWF3SWtTib|~TZVM&(4m$>R_RI~_QEvWEMr}`NV#gdADLP+; z49UsL6M|3&|5S3EM*bpQ{(5v^vAEy3H@ofWKHMx4`}HBYcr<{) z&L9?a1aL-GFKw}WE7(ljjBY}Kw`*jRZ{uV#o0ixveY7T>?>OClYL^G(K^Pc*Vuu1x zjB)J`wN`hRQ}qr?Y%!p@0wnRW0g}L3U#5IdL5QhZv&oX!)qO3TX@1j+r`Pzn-F~-z z$aT1FeYSfi)^~@7=-FxDBV-{@rZ)~e2iFi!t4A2lEgh|}991U;GB>M<41FVw3JqG1 zJm8{Ar66<>UYZ2R=E1@|E0f0J-T{6Gc#G|f01Wl2|H_0{461@DwrN?o*ry~OQ3c3KB@)dchRdnRY)?U-}+N++b9)jk>xoHP6(_Gr3Ar}T6ef#>y z6^TKLw!oVym=NP8d(JOm;OF&kD4EItMyatCZ$eSDuYG$dLbi*ze9lq4-5DWFlY~8LSAvsg# zA@{xtu|4AFwdk1mNYSkz5f*Tr^*WS#T>5Zay7*vofWR9cQ2l`I6(D0}j#wQly$1EN zr%SpX^g#4!TH+SS=|Mr3oG$k`@oNISpZ+$qr$Y+8K|Bq^g<|gahETe$sgA@BiJvPM z85=Bh!6MV{{x{i9Kfz1fuH)KXu=O3txhE_8v-OaYC~D;_Ly@gXd)GOqEp5em3Xcci z5I2tx(MEfwP>nAU*-@&qGb%nph(rF}yg{)TGhxKA?1@ zx+pO@XRzc!BjGatU|AM;y;fR3lw-&Hw6Z8z zFdc~aGV&T4q{9b`uJ(*+Mp?La_6YU7*VUI8+Oojzi0Z3oAM! ztLsC63}}ByLzj?Mb?C7<-zNi)n_mlrwiM3tQ3ZvwG_Ffz51~py>$r&RNB@zC;@>O?3k4dwxQI6{Cw{T8E0Mr!$bB*hq2RWgY zulQs*|Ii9H;WYmUMG{E`4*~2K!_I0o=h|_oCW)*n8{Ly2nPe z^?*}RLD$bdC684qzN155hk8<*R9)NTv<%83!}=70@r?t@_-S`M#AYwjyAsIr`Tzj# zoalEc$Ich)z z*UdGRt1{A)MX}P7r0c%G+>dUEMYP2j3@9~dhBJd)?;>d8BqukNb{Tl8FRZdQg)8Dx z31|CYf^*Y*Pf26l068FE{EV0epa9SnTu~`sV2E5Tv9Ozxv%UN(sJp9zspx)vq4$C4 z>=995Egp{iIOE_AZgqq%(oOWKSzoK~=sn@3pYp&b7h2;|5E2t0V%fvTfuI+)yU>~j zyc|HJvRD#oUrksyHm<$Mcjn<_bM%)=>&M==m$Gi1+m}`H=b{Lo`10!1&aJ|u*LxN; zfFXFy9CBE1g+Wyeo?;hJ(fufbakx?6Xoynm;<) zP%D2r( z+zUlc$g2krda?|>D*^duz7%rD%4g*=^b1~`RlwTObbPNALDAyoj^xi)jHKtx;-U{y z#l+UCFYlTA+SJClHvF}LQ>PqwE$1=FR!Gh+?=T8mxrc9NU2K=wA;B4x3@)=rSAB6b zcw_urpIf#&HFMBuHBNu8w^mimLD;j*b>#b;Zp_^f#o>+h^;=NtJujvnXTlUMf5W4r zP-|UjH217G%<`x0#vY!IWH^yW)FgRWF)2BD#;Bt-(D$7ZjjXIT<7aNZ7Ho zRxOt=@*a99Wwxv7IjG%|b71F}8e_^~P zkSwTfx%|n!PDrv!iGHePx{ybh;mVHJ`uaM_z>b{krXcotSi_YqZMU($b3#Q$FCwmz zTq39A0WLp?5wByQCv>(A*t;HA=))<3 zW$7j5v%k$b*NiSR=;6u921s6zrs`5x{;>5{ujgHahmJ0brxc4tWF!GxM*aHO*XHM1uZ#70WJ@1&_b4tj{;=>b{ zkk~^)=_dR8`{^a0k~m^uvNug07SOBcR5fCLaJGw$Y6EClzerK&^CJ}GzyOCp2%2!O zQL@Fhb>&%ei7aL~D0029`dPr#vsOIwEk9Vnl&bl%mGu!d zIh{66ZXUJ24Z3r%71zdf)pyx|Z?{WYQ}HFY%R+tOhR!F(V)h8p)4e@`*YrK^Zo0ZM z`D~ARSN>>?6D(OQo!j+d0zvTek?pt@q&{n^0#S&Pnoe-SPuG3ZZhC_$00Qw-j1-lV z-37|43HXV`M1rb)-<|q2si%>6O?7NMuCaa&Aef%nEBz4=KOP~G)yWRXBbINJWxu?b+ z?!4J&K}qzCn>sX{dGc|z@?|_6|BSr|Qu6aak&uKT(Qpmuy)UW2qsotOTjBHwPK#5- z^)t9WrBm>9DuyZE2?D`Lv!QMc0X}g6qQa&xRNc7-F9rn#9Lm}7sPL6|3ni8qsV(&C zm0}V0nMvd2k5+yb%2yi19*M{^%Ho2+ztJHTW#7>vUv2H1#$@Zs2{E$Kp2x91bjNDD z8+_cXZ0gsRM2zIn*ry^ zK@UbYLG{v-cgcE}${r#OG#-!9fqrBN)%hH+A)c5|_tn3$uu>3>$5kFK@Bq{mOdkO5 zptCY9d#`z@#d=|Xam}{_^Zk)qPi7IQx29A)5{y`|U4I3at=P!4H3N0F^3DE7sQf-D z>9)u^N-EdIsp;6t3%xX=_pT3I%_a|R*mGJ?PB}e4unQ#D4_+VNKEq)h7;EJDOw%>a zQC&1zmP1{q(Wo_9SxsJ8 zVt=_doLK>|LI9Fdkx&o@xGhe`x|#ofOuYv@mT&t%t`f=~5gCz?M7GRASsA5_?3H9? zWUrFFLRMC?l1@Oc?48yzCJ?tbf!Sv zuJY*eK)Z18o!f~9FcT~M3h8RkuK4#!Sz+=WHZ2Afh5k^He8#h{Pcz>1$n&ok6<3=7 zF(x9Wv;f#B@}Xd;;o+E;aM>%`R9XHEHF3gBsF4V2B<<;d$g{IG?5$9j(hH^s>^a#5 z-l@67Ipt5|t7<#m+#Pop%j2joFn9hF{L-G<2aLjH<>mX!#$v6;VuwQy9CZMJo&a(h zCG$dP#L;?4+<&G3eQjU@4KkhCaI49m0wz*`y#deXIn4QI|Ji*@Od$ z;@1+++|%7H{__RRA8Y%OA}g(^+1Zy|F?jaluKfI?wmrze+bj(nMYwdgI@{WxT4qP1 z5hg(5+!A$=+28>X)o^6yERl51NIx>DSj%+Y?`pA3dNzm%3K5nh8>7&;^X2wpU&Z0* zYMK(upYHDSe^xW|cXG=XmzSr*t+tXvRY z=xtB%3EB4azcz*AbUn;KZI7R8japC7GheyPRG$V;7jB zQ4t@g3i4qhdC-3{U~g*+E9^0A#8lCU1!}#C&bao&rQ^LTfW>RWd0MNd9}3`%M#FoG z$f-esP+jTUu#nN6aVUK~#(z2rloj*l(ds`v%{`*`T>=Snd``lY3}d@hyX(Ji=e`+z zJHTnu%?K}QVs4(Q#-<;5Z{lui0UO-8aR*l(su|M6JfrMLD={UlK$q-c3i9bK(^KQ$TUoWMH#RA9u3T0!RRXvCnE_0nrI2{aE$8@ ze1BfCR7A&#R9Ym2!q(?D2DHr_E|a+MKONo8*>*OqvQIOuQH8FDcE4x1Mn^|`U;lJf zJU(^<$g=CzC%AW$K6D+>R5UFQ6<#|wg6l8aqV_(!+-^;B+e9JO@%+ARq`v*7fw$Nz z_39w25=XWp(F}A?4srKc+I~CJ>F(m*-kS$E??PS-PlWwMDX^eIH8bw=v3x-Y>$u&g z%I^gH(7pQ^l3|g-e6;F3Aw4f?I=gxZk_WZEs^lVak^Kt?(>K7+2dKNX8Tj1gbIoVG zhnNedy2d%#t#RH-KSnbKb#a{D4vgNNa|n*8US)A5R4LkHJQspYLd6iu!tm-^Afh@N z)0$zntoE0x-Zk%52zJm11ljV8E5U}KhIiM2TAMLd-Kag_trvgt{+)+7Eaw5>sE8?< zfJ=_)B;Ce#*rPk~N_5}y927_)3IB;W%?+cGX_0|^E*0NYtz_fgc{j08B{kT3I7r)q z0J;ctH)WM@IK)wk%8okEZa~uW>-_)ebAceQncMUAO3rdLzp$C8^M0w6(O~^i2orG2 z=wCpIauj%n5%bJ{Td{4dcX7btJqtle-b1=yFwzKFm+1L^~Uub|g)=ER=Lt z_SdTMr2m{+wfT*fSLYKu5t8x|4N~js;y@wNBNLV{AZJ+}09Y7l=hj^&P6=fHN_yWj zzzfyIX|hvWo8r=TG2+e7gDM%?g+P$aIJ#(~B~$!lpI2+ic3bhEq5N3DQwH7W&N8Oz zB8~BqK;3e;e$!N?02Tnw-ue1uPA`D@UZamt`an)y4FDsHgbx|`sh!Vr2yX~+)m)M! zx%a=zw|DGD(sk98-`wzDficS`|N0vUtii>K{&|@lL^o|~K3=EDUheNKwksoEFTMU z<;?^`m~iA9+SSlWPtjZ$b}PdTzaws&00WSb;isPu**dRyen)c}TotlogTqw7ht}y; zveXq|4IxDXSL&8sRCKv5y>XkUUve6?Y*M*&wl>JE9f&FQkZw3o_b{<`wm`i|)=oT`WL3pb$w& zK`T274vm_*9`kqTJ~c#5K-^xDu(P5h5PC(@;5Zrhn+V#a%=L9%;ko3Qg6Z{8S->?# zfr#Cs4db}|Dnex(mHFjiKZ8R^pV|^neLC5%VL1Z_gTc!1Ps<}4K+Cye>Wfyy4%hSp zK`jGdvuS^pUi)X>zfMcp)K2qB6;MiNlIf0FxL>wiUFHD!x|0bI!odccN5c`H%H-ni z9U8g>OXQb-$i{vSfakm=H+Up#H-)YDg^RGOD-Le_wc9SwARBIBdO1P4t&h(zieUxm-MG4S(#xs9a9oGm; z_rsC4&%6Qll}lP?gLz5kbYegN=8YUJipbG23o4`q?ycVMDf*W{+<+GE!F2&$q651W zK$i`;ZE8apA)hS!D@ z@kMqcytKy4j<^=k>BXPhy9^cUI?2r7>_Oi|DM0_9T2@_y*|)P=$%dY=FxG!^ISSZayk~>9ClbiR2QD zO9^x9iluz~#rNmC6vpp3qrTSuWiaHi$ONb7i3`Y^v~eh@dzc z=Cg=)CFwl=HxP(RCw`Zz2||KGnBAvFSKat`|Jo3)JH%FoJ>W1%J^OH*6qn3h#jHiK=!$+9|s(+_99KSjL zb?oaqIvGEW_!NILLI86hlh;Yyar7aDRz1@A3dS=L;cUImoT!27r%n#nl19kx%|;6| z`slwqMHvE}&#yUSV2K?UB7Uaaka_0%X$-+nF)InX>lLKFu#V5v2&#L*xOz7*Kax z=O83&u-uB9zfClBhVb|$3{{eqYMv{ZI>)R5;`q zk_tfsPy>|iAVG|zzsMbV;UWjoJ2WdPw!rD)-9T=^wEOV`j>r+^x!~Jlb#* z4*FS6`B*L9_}BLS*;mVfq|PetQOG7%YXQK}M^hBl6VQ`bAo^wNk9Z#gnOP!R5$IuL zXPJ>QfZqv@YQ!!AcxB++{~s5c!yfnaOnj{WSw$cJ{po(<>ACAvK|3bES?2ci^gT?< z4hk;fD;pl3Us$fq+-CRX0YDDx955uJoL`vf{e7E%-33wfqjlks^aP!@oyzi-`mjM2 zRMGbUUur}E!?2MCy}>8na9Ku&$*Ahdj@I$uxg9v$@Xa9Z;lgyEs?N;Lh$S;M!S3RZ z2P5cgpW$Jaw{MAC3}c)QGN^63z>9i__tjwI6YfO-kKQ;8K(>dMN z!4^sM_2o%0#_M{6*;ItIp#A2q5t2L#EJV*BA_Y&q>Jg&1mxx*yHmgnqCDdo1xsB1f zkcr=PW4|s%ReAP1af{3_6p7dtl>}kx?A20uxMt=O@cjZ3;I+M%enxW!-7!X!&gO$D zWoDv8;ddT1sR~{>D?+y{#_ASz##_H?SlsAUrvI#fqN#t)+FAhWUza6~@hMNbqwC?! zilX1{J(NsY2hIF@`m#(B;KLkue(>3Ba02@D6+xfQLJ8d^ZzK0Umm90KsAU$!0K*-M zV>=48r(^CPcV_&U8>bw%A1MmxBb-AMoqL=#V|QksYMOR>=CkQ#_anA}lPwDBxBoO` z6yt+AX-E6){yIhUresjNb$C^r&eCoEOB@eea@zXTioGiezJjKOg@s8!<^+Lxcz1@c z0KX)|0a=22x#JC+C{c;hZh0=M9*_x9B1%N)<)IIApaog-H?dz5r)!-@N5h2rs2ec? zlJqKKrAs;G7`~DW*vBtgi%gd0C+2a-YlW(vN$;dVilw}5)G&^aNx{2IA6zNRn|!^+d;J?c-4t635Z0cBZu&Ai zG>=Y!oN(g!j~XSsDDvIOQFyv;h&WCiJz=sSzQ@wI`R2SEf{i6=*R~tS%NUO+5Xd}k z+Bvk9)#J#98wFJtatfWd5A^N%ed6uO!-EBbiiRzgbv+~;?HeqD@_|*@#U9kS%BZCy-MuSOUT~HmBxF*9S=*|J58eV=@!TPyeLKq)2c( zF!^FXf_+X{ciFFS9W}A@Oy)yVzDdJ*x6=mqdP3+0%_fpUT!TkrRf&UU*PUKt=2O}n zJ$Bm6uV3B0koRV?R=b@I_EU(lFi9xOPp2S6c-xR^ii7nY5#Gk%XJf!mQO1Eaueu}V z*FLjp`|ocn&8h>xvD+-_XtZ6dF-qV=aL$TAQFV}|5eyL*miLlqu%hNgwD!65&5lWt>Z4ox>)eAH zgCC64r~NkfMvDuL4+#nuY;&FRKr7RrpWk^d(tP!B3?w_3^HMr@+{OH)Ph}(xmS3A7 zN>hQ;6z&$L9$T{Voo#*AW)d*zCW0@u+dZ&G7jz^brE0)uj;o#08Gi^?S&%~^!oLp^ zPl3?xd;L=<$4H$#cw8}~FnlM6eFJ14&Z{L6ik%wwUmx-8*jg|W`M;5Np&HRBDp(s4 zyFRh^C5mp(d?ZaJb9>|n_MdI))Fr`yhqM~Pi6EQ|3%&`$NkmMB<%QIR1syD4KcYGf zoYz`2#oAU@kA=QBoG-1%(~MWzGd}Ee4p{|tXYP9Bs{oX)p?bJicqZfBM3y1mdIYBr7(t}Cgx-67{QfFA1@R3YmQ z6`ce5G(P>aFAKt%HcBa?xajS1+J6*g+T6&WzG{79Wu}?`f%$Zt-(i2fbno3W(U7^) zO1Dm@N(EtB=6Ho&6T8k4dmiVXFZ#&E7q|yjj(30f9)Y>t_d_kHrXq8-9#(44wGA;F zsFQ=W$E@!nBv&EgPKFC00E<)lXm+=GCrZU;w9Q~2qIbDg=21gEl^1fgRXO^X3Wm(a z*>%;oKFJRLa&|l9Zk#31GaWD;jBFpA*6aOdeJbYSm0rDjLHK(7WBtQphvT&eV(|*$ z(u@bTLB|?I<>lpv!XeU%ii*inM3h~DoO?8MF@~Rcb1TJDU(76{6hTP-goWY?3=37$U11GCp|JkKk|FV>Z z>&9T%ew^#kt;cj?ejV1t18;#zlsrK1KFVicBMfX>_Ytqyip3tP+z`ldTysmKb)EOJg5fC&m(e#DHTYSjY*HZ^HpHU;bpr(*wfV5*V%~e=fG^s zRU9Pb-rSJLw+TyX@bLFb^x!7uK#1_dfsKc@tYdHNhK!=lotE>i-lw$G+2h$6Ol~

8_s0Ma|ck_40wP(BC_sLHrKjh?S!O`2LOz@r1 zeXs6l!2Os4#?&_gE=sxh2ghd4FK-28v3NaQI#=0PaGkuRyWpkBxzn0s^;P#UH_#^1 z^)A7TY{=b6w1y4Vx`^DYR5f<1olEK9VnKANTYg9lG+_aM(Cp?j!E%RXozox@)Bd#+ zopA|1PS2v+*#S#isiq>&xN+s<0qnuu7}Rl^Y`4a z);wNamu83&p4f0`Etp?igwSmEs=cWTE|B;`c?b42wT~@B3y?!B&v)XLqJ0~0eexex zU}304&pT8dHd^of1WsP~UfDegPN+@Q-28PRFi0^uwSuPet&}`RKY#VU{A@?OoW1?- z1M~Jx;SeQOndYkm>}%X=l>+;DDw*quIsy~|wCE3RdpFmT@-cJRvbp(eixF-qkjOHX z+B^Ro6W+5yN0^N2L9i)D2#$sPb5lB3|J4qGxGRL?O(o5Y=R*g-Ei?!oZ}pS{n|O;n z0DIKSXoxQorF(DZ!I3q=;yC4}BtpCm@!7)tL z-s~of@05!>2T<;ribd167k-%%_rbZ^Sf$^j5aQUd>6*A-I? zvddnc1o>EDM(UqhjWFDH3KKIbKwnG%vo0V|U=BQ*i^`jdi1PEg0YXne_^f|$SLiR{(Cn-Lr!*pU*M?9Sq2Ol3=WjZ#03H$G-TgrR0{M9mWwr)GQHk;+&ZB$~7 z*xO1MYu}$s9G|y>^>URHTv}4T-nGKTvp2~rw}j6nhP+Wi%G*2ifglkE5Gctd#3bi# z#UWNXO=3n}0J#b;r+w6P4u=Oy=D!92jrVGc1p`tBK}-r90d?_TYdM6*3)O2zQ(?qG z>lA9i4HR}e}pq;z1_7-ys6bTIlW?}gyMWp`C zI*8Fi(woO%Cq68y-EgpA>!F444r4;)swzax`Q6;O;UuSb_o`t_*v+`N{pz49nJoMF z#aj)E?g(FddpoFc$=NlfnZhZ5?1CUW^iI5Vfzbc~tp-@>Q>80Li)(oH==b$t>g_o-N7FpxK3Z5X5h)@mz$4(yyL}- z7Xr(9b!wGPyl~podsOEFVZjcdY+4aHt@;)jXd9WX$j<{k?1*UeATABWxzHMOksBaJ zyd63AdMOVxeZhY?1o;>sabVA>+<76JN^-`daBE)-F@W1r9niokqg$krjZr1P?+ zm4k@D>ynQ+v|otx6#%49kTI=}WVRHq&Vu93U~*LK#%drvR!QIMWGQOIQKVr}>eZL2 zYSYd;Kt$lPu(ww9EE|5&)BQZJp# z)8wqf6;GGts_{^fsk?t4b@KlT7F=ZcSFx#ZvMF{N4s&av!@55Cofq|seVId*&bvCU z<_w_|g9afp6`LKXT3n9lZ^^+=K?%!%ZwwU8W~l#72lFPC7ed4L40ik;w}qq^_Ieo$ zvtg}DYD0lSg9v$ZrR?jPkxKSnSE^k-5`hUcYz)3hO~CK;;{m5$Ehf|B=wDDV2=BxG zHXX<@0tK0+8Sa*Fh#FfXg4y$1Q1_%O8bfu&Pe4*fI^pphYypOB3aS~uNITgl;z$){ z{z#;CtFr=BK$(huO<(XwD6mNLkxi#2j>&T+T)(F$y!`^qg!pB^yQ>?=_sw%6E;K{1 zFmlR9SR`myk>v>-eKfKCRQ^Vbq7`DLxjsXJHPm4OgS+>6LVr;ZOgd^OGb6cEq5zwa zTqecYQ(vns%yKfP@srksnieRI-baR@Whu(1!3H%P%nZvA3VHE8=FvIwT+NPd@PJ(M z@_YCdR?H(}bNaJX|4{mNMAQ7s$_(t`Ql`d2>FvS^&x9YSW_(-uz>w?#Aqhwb4%knT zOTH)FIJG=j9snpndgUJ(rUVEj4}F4A|L89~+(S?BR?CCXv7_5-*}{~8R8dbIx;Dxh zw+qP~+v>wqGXCaUk$K!(q>8le5=?axk$Q?%SwVXmY_O!PWak z6qyBVKvq%C{_pJ|<}k_tuy7!Lmwrp&3)+qx7^vu;lRuImc6~r z6mcQT&ZmrL&Utq-f$D31fS!)I0(p6Pt>)tG3#?~k`*XBfzdz4>qqXay%0Y#tLq&zVp$yz^0xPuE~sliii*No zX8^herUoQ}=P3FPj!*ctqgrP$_GUQTTe8#(!LH(V_m_?rETsvs361c}b30 zB6wK~w8*`%dt4B_1xR8zhf0n%TK54wuIY#ug3Ks@nuI%-Hh+qA-k=Q$@0>#*$=f>n zm*M@h$MReL^MRmSN$>L#zycPkO?2Jd90Gr-Ay5B&lH@c7!ix}7V%h!s+XC7<$Gu4( zaIZkch2OZ_^9ewQ*mht*)bn)DHBsB(fjL2`x(dz->Ex>hAoS>6d^;;#?g4MMrI8E! z$F{a4l^n7Pn~92T7oI8zuS@Ry8kKOGRde9o@#?`j!AIfD{$V_h&2V z0i2--!Ezr3jsd_bLZva*5JgSUHGV#j7NHf4A8KudTRPGzh07dhftYHEhN_T+*zDjM z+4enGeZn3Ew-6sccW0zJo@m1VcFwCc9%PSjfV*+5uO=?FQ;9W7rip~rj)GGB>~%T8 z&to)M>jhiv!Aiw}2Hd6amOQs(CuEiKJ5j?cyFr#*9+YlnCiNh) zndnSS!mv>-+=*H}Jy}KET-emQ5Lum3>Sck~@ve$u0()wR?bo@{IE~1Mj3kp_sUk=2 z7IT8b)VV5%R&M?Sgb@Q38F8BHG&e6 z(zD?C!u5Ifv#Z?BOn&RAZv)@4x2T%ddz4wbH#VFw*bXf@+W6oB43BO_wIYTU0|dhs zPKMWdGl5tkQlDlQ81`8YnT;9Hoa)+u4;POVF=m}R zsv=t|u7FGouK)#+SZL^hw>8fQk}}L&aDNN8MWP<*a^WYT*Tf$EsdvsI)#tKOHaWq( zDxuQth?;_(V?mrGB^(dq1jpGg+CYMFX`&bXV}_RC%5ukz(uXApQVdk8%#qR;&UQ4z zzp6tEU7g*&8m{{SQ8#f@&ZAD}RhjN480rcqEIrA5_9l~eQRKO>ruYJ5k&yvG0h`-t z(BaYkCZUrGT;oY5%78-iT?IhVLc}wqnG$Nz;WeJp8h{;3dV7Fu7`$MfD1k~r$Gc=W zYr`l-uHvSzY6~u?#F1e6(#r6J9fIJ~dS1z8PCctJ^YG&obc|x z2V5k7^N}J>$Bk)Ew@T!ugn?9XX&H&%u^G-HjplM=7!|n!mdHq_d`YahvzxEm5qA%% zezK_qCk>Ggg+p~4%1(7*NXxi)^tdh`!{DH0n~$ zW`)g(R=~mszj9jzV?sb7x9A33ae;WIqXSc#rlg-guUspcEw;D${e0CxahITWl8jSd zcx~HVzoWQHqPgJG!(@k?k+~tbc8>%*9RP|y??!jKKeuLkF^>0;46=F3)1{y}!9zS= zupWK^mxyuDo2pl--S}^iAp1_cB*_y|zPTsC!rRn4wyW1CBuN7-;>haxCS74yJ zN#wUBSTQWN1nx#>kxjSTDp?cW*DS7+`00*(pZ_#=o9wbCbhB~pC;LIP;0k0hz!M#z zkAIwR*OS@%`fZ2czv%%*7B=KSyM9&~Js{a_d*o-Cpis2S#=7R_+G=x9Ol=N4BESs7 zIh+S_8khJaT?n*NNn-9}v=$wb#jOk#Vh_9pJJP@aGS9$;?Q}YJ3KioqXvBk$#q|Y& z(fnQo;%o3f`HqNR)58NB7FfxD#48yh`F#LP$Q zaeGTL%4T%8b91nzf(XavfSBy|&DTFagYaqV0(uSMllw{H_|zTSRi0K?9ugF0vJHrx zXqm2zr8C|aKaYvSo5U!MgY$si_lvK`R~Bp~A`z*J4@G1H$hJLLSl?qmQz9d7CH!#V zLnLPRZF;Y*j~{v$3YV4(#>VOD0x!i}iV1sME;hg$#pRs)Gof;qamZ$M&UMU%RX*dE zA|tuMhJ3NI%j)4KJh$ZF=e2vgkwPqGj;}9kP&#d8z_Z1C)K50ZNaAtw{2LhZ)v`2} z;F>K2Xd+GcG>s3XWyg*9_BX%tlUqjkC|8tNx{c6l(kU7wwNycN2M!}v&FS1cFS{}7 zZxBz_`Gn?tXQEQn9U_lJ{ZZ3uzh*yL_sx`@nbS~U=-C~&+`2EMAx*B1vgtW1W$d6Q z+}PMq7$5|J0LH6VujacQB{8}eY!#!fGhBelFmb@ge2DEu{wG_$I!fl?n^btAy#!ti zT4=;7g<}3U#+D|N#PXM#!2MpYPc*JqeH8atRQ}8+)rm=Rj!S;4z(bW`R=Qcs%ct0x z8UOhh3gj%7OMZusF~*fES1`}VYq$-5t*D5btn)GTEw@#F`<54J4iuy487@R~Vudup z8ECNG_%@{w{mJpshx68XDLPjkVB^k58ohN$c*Y(-`^Ddy{cwRJ-ve&~qseuW3(j2>P*HY(G z%-4$pVXVDYU6$^3QdRaBCNE$aczMRXSzs%`e(`dlC+I89Ph1ar7oy=|uWaT-Mne8NU=o_%+|^nws|mmB1PIeIX5g zv+L9$_IqV9kFh+sJB17Dnvj#2tnsS;udPgte zeb?=1Pr>}Bxn@*>L);bRv55r@%ap(Vr1I4F`P8M%ok+WCu&pL0n?An&&NNhVC1jxU z<2+6gpT*?1kh^!M)fZA4HHg$eOfFr?Quce`$O?UzV&o&9IMB4!uo+#xEH8d?{aiJj zD)@r6(Kt)DoXbH^BG!CwdVb`992@oQ&+>nBx#P!z=k)RXg09nwUd4?ixmkN6OAr|J zh0Eb?Yg%=qr-5Sn>pCWVzXAfC!kdPNdre|vlP}*wSAf&?=m7bK+Sejh9$#>SB) zRf9mi+Gr~WY9B+UY?{jtchJ+WG{+MamBx1d@iz0~(f$lY{h*~Od`ySsBp6d;bfq_)iqk`%Ep*i65^!tM92=nR@JN#I>HhQQPllpi5U1_~*l!yf z)^T4FA3x`9p&5BIN@8SW^hx#E#3f9@E86EE`rzCe_@>Y24vb{jz(kB^TVzCf$!kbk zxgnr1ZKI>#{#HP})engz>DaUV$PkP|XCFPy=)E(yxp%yW;yk}DFs77uk8G(nR)3@j z=AAhEF-Mo_8*~eiROp){v02?@)TOpW;3YSZ%}9cWvZ99ZZWT$Zf?HF%_&t;5_U+`f zG^{2or?NPeJ95}GO_N7a5etA9j+j`REL#V$hN4x>N$YA zNgiBaT_>2}jJjgi+pk0(WN^+u-|#w;jl|F$pyj;s^9V-eBsI2wyF`F5f~6rSC`i+3 zAr%psS8E|%+ZVLL&8SNtMl-UdFfHG16AP5~cFcAx{UpUfJOJMOjWoQT8G{{8#w z>JMtcC?zc|dBONuB*M}5*x$Utn!}k17$%73viXzE=dz{rK zLiCV4Cw3|Wj~V;^-5&&fKM6&>AY@NG>HhQQS0F|L2~rSV`*mT|jRr#W_H}d61Ar)9 zE=OE@_x5c7@b@aTz2JFN=#FRM2Jj{NDp_hZMp0Uin8K6N(!382oXkf4Sx1Ad1gZ(- z`+@OsF40}IHS!KhPUqk$|8v+14DkS?%x|K$9imTWHD}qK!@qzg?kXT+7yQwUvgq^| zPl72}6iB{=%bd_SJ&7Okq2=ZA_g!dP3w8wC3fKbl^QFzr@AUQc!MM*}I!&VOvi>l^ z{lqa?V9M9^=oJF#Se77q2tUj^HtotdikAxXF*2k95VhIjF}bjC9=;<51x;sDi4|&Z zc%TX`*-UW$caNMy8{81DD?=ccta7Yhsr9WE9QLVCO`>dQY}z z6T$|O+TLZfdt%}1 z|M>#D&>Kq2@&)j-;6Id}A8Xm0aMncVzaMoBuz!;Zw+J;A;j^&@1X-03D=9Wac!}J zl1;t%y&8*u=Mn?}xuU0b^jmRjm%?mIqbFgtazO}os)qf-hXRbC6lDCTaoWgGpw z4nXzqmK!3?(iWQ;xj9@BqkEm)f8sl-+`(0JxkKLaF|=wS=E~$jg%+ESwBvY#Y}w_+ zg~(*-(B%~QH7Rtaei^^@t-ddQcbu%GxlG!n7SeySn;3oEBj14KfmBqzSu#G05pkoG z$MDmM6aOt~=hPmPF~>QY#ib=gpRU9LB-7IN)b61SBMG&`#JguIDm%6r@IDF>;Yf=9 z{W2Pk+x;gOA5ja(rMZy8vt&mKoXR9a`Orw%0`{28raWQ2x55p4!PbioyuIJrtsen%do87od&I(U4({oy`hwBF2?^^*EhOUnV!15*bQe z|3EWU2j~8NEk)I@rQB+T>qK9^etqxnfBAPSxDU_oxrkP1bI^vQZ@12E660V>Gm?CY zic)^^fSE1BPNSlvNi?OnPU>I>LwE{n>ENF4)4j`jBKOIV&)4Fr!~_8`QfC4M#R`riZ9CvOoggG!EOX$UQV zp1xarM)?AL+ixEy@CH3&g033YV eajJzmaXQ){coIa#@VvdJ>gs+dfs&k&8Jpq{ zIuQ{Oj3k$|9cQit3;h$Iby=&i_y&xIq?3>V9*nOr7fh=w4?WS4aO8QHOmjIk3cZiI zv0YZ3$5A$khtvzUpC5Q)O>R4t-z;$w8+e;<9t(ee0<>%A>5(FnLY(yT=g*6Ekd5O+ zVSvctp7FKfa;N9L>f?gMuyfVme%nIJ1sN*;QdF&7{8u`Mq{qS=`y`v{>edeGEhD3w zASefKZ%n>HQ&D*)bUwaYbUA=i(wmLE?AO3`fL1{`*hlxehiTbq9d~FYnx#ykD4+do zy0@8l`WRF~WS3XMb24{Iasp5S&z?QYgVZDTviYyacIL1q7Vg2(<>CfAC^A>4uGMA? zG`G++p>ytx7W!cE zr_8^2+^sxa4xxjNzp+uJf6wuT6U^wiUtUt;i3@G6INOlrS&`;~W{nxTi$inW!!c0I z6clh_uve_r(&iw~8r)%qTQ41FrW}m)7`hE4=T9(1k)IYj`)P*NszY`{;WZ4m>S_%^ zcrZAY!ME(}(Ur{nBJw6HLE9?0V{mPj`m+&waM{`w_EWcgN#jk>^XghcavdWfnhbR-QomcJRJ5bE2Qmv{G-Op-0fSyPNG zA#4wJ_tz#vd@Y|}oEH^StvsL()xC({(mrTsjQT!`rYNfc-k#pvw-5sA-FJ)T4)Jq! zHU)WCn$F5~)=d5!W?H`~wcuHOnc}ma02d*qAgqK02eWMFWhdMe-mdA$z24+qo9Qlt z4B4C-I=@N$i&mrmM*8lO_#pr~I9P_v=a586c-s)NSeyI$ls9*%j%so^6wM|#_c4HX zeN-HeJap)QY2YeSI&?hv$vgBWzu%O6Kb)jg1~K-?7SRRV`~E;A;fo@911*{vY`od< zYG+@zd$JbqN|YOKkC(*YE59UKSFuxV$+mnH#irh!Jx985`Is6q2H>H#FjIaJ`}H@~ zlFI;80ors)_lZ>9#pEbVD3GK|ZCx-m-KTKdFJk*E{;p!ly0LxSP-zW=@1`m@n-k+E z^J!42yPJQesJ#ro%8}(N(AZI(0QwqMZKZOAN;Bq}yH+v9t7>Sp0?&UV2V&3?*g^Gv zAH4G0PJZ`@BeS(+1Y;-L;6x&ndIeZa_r?Dv_H2z}y9I}ltKY9tUETJx*?k!$CM0Wjk)+$F9AUhZAKWq?;?ZfX$$TjxhBuebEw z4^8WL%_pg6a~+l{X>gCJ{;@mD%ORYB6UdkswvN69vh08ilqRX20 z*N7{hE?<;wAi2^+D^rj`<>8%1qWrfyDGZ+55fx##+ zR|vUQT;$>9;o~61YWDN(Ulk@)}TaZ2w12rr?nAZayGJ1KM!BeApyy8vXy^8a=%B*^o#lC-P)1I+} zZSsZIDRPeYE({Y2E$6WlYKuYU(LVUPeLLrRtR)x1z~>ADmlLvpOr$mmyvS$rF;~ro z>TPnxMy?$8ZHJVd1wm}n;)3!)USwsQK=LeKhDi4EFft#4AW-~qJ+NvJ0_Aydp_ zyFInmqBpn?{Y#l-yR9_l(0q)uPa-W4vA58x3HuQp587U3k9ErMw z;*7mTh3G zD~!t?Df+Y4!4#)ZG+X>*D-oKQQS}UX>v&4pLS){_Y%fX!2gp0VsIig|HUSXm@e)y& zY*85}y7Hl#LX3gKgGr{SBYKgwX{kYm(c$DaKcBnp%y|N(_pcbv#pC2Z%^<^|(6W6} z+>1O+4cw}zbs~H(N9SXzq5&0dSmSsK&y*5h*JFJ4=Y5lbNO4jqN+AaD91@u}Myf&X z^*A!^;L%14nf%Wnvcgh=&dT$7=CNsMOjUag9Mhxdkp4Y=HC z5H|gCD)d`z<~byH7f?Met0_s)Al--Txiz*d5iTrC7GE*)I*Oo)kft@v3p5rj#cTnM zjgK%uEJpWM2kEdFgpiR`3P#fIWs|It0zZFg%19#~MssNGjEX(C^emMVtdgSHedv!L=(oafv_r?gkF6U#BoUI>-;v7G< z0#~N8vT{$Q+$EtFE9&o=nfKt)+Kwwf2b{`)a)*c(fEd=Wff#AisfuplP7iCJgOHxZ zdaCB5f#|JL*xG8w*qXBAH(Qcime=H4^lj_WR^!J1Qr z+RbST^b9>wQ8Vv}K@?vJ0m~g43Hc~QAIg0$|k89Ze*EMlpEYO3N5i?S)Th3sJlbo5AE?|phWQT@eg^L zt*L#Uu|5P`4U!!wbX-EAqko;K1+rVolw?fh5pMAVBS?9X?#` z(0|<|`i|6uJ>zjrZ8tY--oLr-Yx*~VU9l|Y3{-<_vkCB1KIre*E4Q9PmmX9H9VzW~$(N+*a?0)|I3He5|=hEqjUQr@W185+gDl0<} z<8-gG;tV1;1f%%GbhzS}VhA#@q?n?U6&`|5dYDx^W)rK_g>+r|8F&5xv7#ac@>b$) zW@C)4;SZPdj@ik6r#r;Y=H`LEW^r+G=YSgFn}8~sMl9n{Ep|k+Kw2+pIF67v#v1Zh zIu+f6LgK6iBi1puGYl1@m`2awemZ`OzXE_UVE+QSQv3UhxDHF%#e)S#a!Xlk&`DM& z0$c#(c4Kqsje941D2)*GqvHv|F!Pm@s^^w=G^f`kgGNpO@OccwVA^F5()yTiwq5D& z%|;stz#sInM;uCPfT(*u{(kA;*l{iJ8n3qjfzbQM>=IQfhK|R|j_;ge^_HNKgt7*~|6C830?Dip)vzy{v*pdS+y> z(Y?djx3ygLY(mi!`{jdBi>dRota6o~Bx4%Q<-`96Om$oSUm?rxYZoHx=i>uhI~gZ) z^?zs^!*K$qcfqSbL#FmqdG`qUk>aP6x9W=6-WqJ5aZzxgq5pjo1ac)M*3t?-cdXld z+4NMw6PpKQ`rFq31F#H#!S?`Mt%1PRpy{zB**g3wp~rz%Bq6^<5{qo01WuQ)lQ@<+ znmbT^B4M{Rpm!T`X_`IYA$JDO(hy%gv_-(t7AKo?ONx!G%eqz@-58=TAD%Rp=S6@I z&2lq(60C6vrk$wPU|}dM?5XN$(C77~$elup@G8v(d5$u&jSnNC(jMjX>K( zjpw}yj|&12P%Hqe<{qS7I+qzDcTT$wx=xnIIk%bu`RBT#Ww|VRTLg+E1fv>?vJ%*> zex23orb;-HklaWlWSLDZ&*R|Wpi;2Iin=kFrWI7JosiQiqae7D;;Qitc`tO388Sf# zBeQzJ%Zm$U-h_!Rtf9IepQ+HRD4umTQkC2N8b?6A%>tAJ-6Jdu+7OgL2W<#%BQVR+ z+{Oepvu%1HhmC`D9GC4(of#N-x2o8IhXeB^H{vk|e9Clu^nTYJtA81EOjMUc+YI6U zVzeVthy{Zpv!Pl9q*D->#7uD6kO6rC5XgY2kp?t~-mN$fnm2%>9Ubq%{|lOH1g}C6 ze8^^Y0i>*ujuttDq*skzB{)B)Rm^j2;)6ylBF!aXLiA<5lSwgwPhO@C>DFaw3-V$rA;*p$5G%o-9_wW9^<@w~0 zm(YOxS9zG?*j-r3V{K35R#+n4lK|lJ zV=s>RlxI8Zi|*(r<+R_75IG~fXF7TM43WolM))JCRG%E0N&Fg=T5Oc zpz$D07_tXSPEQX1`$gIy$>l-NjP=F8lvysucZ?=6gIB(hW?pl2DuX9J5)btuBR$6X zclUkDb3x=Z*egjNUvuEG)>^`zpi5+VH&4|v2gW90T47prmT@WY(=X;A{unw~Lv*lF zusQc;_CA^1%}4MEvIWi0E=e9n>LObDiRdDiLJ74_voFzz9Mm*{zP#q|_45gbE5qNze{j&rc9fY^c{x(V}H0cmtcs3P^gP-w9Jd6Dd zJeF%q6iYrCk;E#i{WxP-uS%(JZ~ay=%Gd#{mGq zSD}7_vcY#t8LS9JK9W3*pXIMfzwC~)n)3PP%lu7|@AW-B=Iw-*Jou;={zC4i90nl% z>A@T?Z9dQtMkEKPC6Ht^ntRa8eo(rmqxXySvR%e3^jZ0GP00AOCFLDSa~ZY#Eqm50 zMtM*h0ld4M%54MDdSs_}E~1?PGG4w9M&iHstkqcw=pO7px$)|2=$kL^&E>}RcT9WM zy~N8$#i#-cO%@*?XqA4{o1t8~T+k}0RgCOG_gSi_S9c|uqGlpWxv$#0ct4S% zhQoqhr}=jMu-prASQXv4AX&!7NbDRa1)v%0o4^jsc?SSh@h;l2sS|h{jzuNy_xyiN zeRn*T@87>lZk@klPFSh{TywQ9|)`3~(p@4iDA z+pJp-+xAZ`W=r0L32tp0Wg42177Mc7dXApf%#b?kR!yOYjgFxH&@00wt0p_lb!K)_ zHj5Ze{_d3gnfP^hh3AeeOT&uDs>U4K)z}u(M@D`PC9pJDNE)MLjY@Fh#}FZJ>Q|&= zzOL(-ZYc9qC1iQE$&V)4JU3-C9x_<~- zhFODs&*Tv)1;LFSMW9=S#0S?JtPzfJnqSQzIk)b8X{yK4;F^nPbIpZBT1Q;f3M4{7 zo)Xq^ZppF3xa3F3clMNm>D@6i&D}W{{1opHHg%+B&g*zYBrr9d1~BnIha6@~CH!vw zD0`-_FdJ#~FK&4y(C}ntW-4`m=!%rM@@dyPxoL^(mak+jXCw4F0Uz+>AE8RN$;qp5#LJ|rPV@J&yte^0bXPCmDX{us;kuB>)$C6 zB^RW)JM{hF#Dpz7?n?hYI0f^v2Bs$6q!;=0=)HGZyy%OOLmYMYvXc`6|B5d*F_+MR5et+Kfkm>oAidR9BjgCWYsdiOsuG@`qx-_%hW#r&E_$Kr?L*Tu(zk}`% z#=x$kl!CTvgr!>d=?pSw;T^gIcBe6t&>eBtA)@%ykm^rAY@HGeYV$N96*>imk@5j3= z)a;VyJY8V_UbEpNP@?fjP4B3iS{L#13Eq=t{G-UY)~}?ra~L>k6Kk^Ql?Mw0&wix3 zNOJ3ANdEBB=DXX%(lqDZCnV}kO8G^(?7a6{$njR=P;69zeVPVnOPDBr>A68iNIPKo ze2yFSr$ciTEqoX!qyjXjdAf)jx}%2aQwW}r?Yn@W&}G<@RZAoynAeWdcDWdrKY+ACb!O=XJM7DUG?Y3mS@FY^ehYx zFWq~o@EHV!@F;KW)Ui4~Jc2t~XCerDQHgerd1hAscdz%AMPhefTIXy3@GrrCnzQ}p zX(Ad$k-Y|`tJ?B|Uwe%*jJ!VJq4BT^;CQ>&@pDU;7QGKJ5nWJmFNv%s^tmhhIj=)Z zyKmgKu57np&@m=cM-#*FYw|Eu&ass#BL0TxqBiQD4Bxb71#gHVp%3!b?J7SosM^S> z#i#8cAmcdXap1*$SsmS=e}fB7_u1hnx%w>(XZ6%ij8XPTI(}BnJdnu8!TrgHao+Qi z>-MUc$h(mqUV)Ogm0~8h%USs=8?KMl;LE6VXx!Vi-qXIq>v@>k_}S;j?Q+Ihxr0vV z>?e185GV`diIYZO$)xp7MRa+H0^@V>@3%w;Ze2R}iiTiqmVmBy2_X38Ud0Sty^i_W zMR#-E%2$iHdMdi?T|cIMa))g+^K1*PpDysv* zuYb|+FVES)Fv=O6%g&F7I!0;i`CI2Z`oi_qOF; z-^3G(x2zN0ag%L}eWFRZid#TK=aSq`tJR?5fIMloo=Uo_7tZe>YxK4@k9<99vfsT+ z8%ytf@m5RviZg%h7I)YHf-(I5o0bW3A4gZ{N%^jz1sh4r*bkp4nMz&g&u&%n-MFNK zbECYc_r%s;^M(9VUBiZrX*Y$2k3K88k)>s9=L#)wzjehUd=LLV*@kS0)W99T5nfPP z^@h4tPXNkp=~?b%k+00OVNAzby~(B2h4~3kuDH05SX|niLOtOrFgib}E?%os6rk=B z9SeVjn;#BKWQHr-2}!dG8I~mL8qnXF4N8l{gb;13{7qHqigD+nq*~d$M12*VB)hu0 zCZC@jxpy+%E~Am#ZzO%+$K4;(^0}4y-zS8bWhYm`NLBXP7t{C}JSzY|2z(GwcR>K? zU_+Cd_A$)^tuh_4C6tlBT#Gj^glYS6YanqrT2rM(HRk3xQ#R`z@RVmQV_9{}=u7B? z7^WK3oG}#*R(`pAXqU!Kwx=!4k|KN!EsH;DFtPs^wi%+=k9J3bVm zOqO5>9lkDZLH%fU!=w!~YU>wzLi`tKU7ph1Y`1)O#~qQE1qIv1Ndu{C3e{z+dTh`;etMpU;+-f^kOI6;n*zYjLhq+N<4QDHMaB?gH`Y^(=fnXq3VatS#8d}cO>+^jmWayB?6fqf-X>lW2D zn8=I1e{_1<)_)OnVw|Kd%;~uylVO?a#fvytXI^YcFp4l(L=dG1vb{9l7~4SL<}i~% zzT_1u!DMdhYl^2-$CM>zv2Iv%fYEs{;YQlOZkuo;G;(ZrLCUjpY;5d;y81HPDs#cA zbfDsZ4zHP+vBUn7pm|U^^+VZ1UUcEcy*t$I?a1L%$*})w-42XEE5PKLD5f>>A#-s? ze(xQ3e7x;YKQz*JP$2AfX~`G4tS73A6eC;sB)x%~liO64-oBfEO|c0A^~76%VS5N6 z4ao1>9SS{egWaysQycFb!$L$Eg#`dO8cVwkL>mHxBwl)VAE01(rSitLDj)Ja~B-kv(C(tn6hw<|7tcdy=p6gt{2v<-wsB&eD0{ojB8$#QQFs*ofF zFVN-eq4#SeBy2j|{?j1$;N~gp9m#1P-SH}fk<2MGxs_x8E)-T-cjFrWk@A*-38;_h z4IQCJ+4a_koQX#`!p1c#P(ZlIfo#)m{RkZ5eJ+zj(L!3}RmYLqiq`vrcr}@!Hotlx zIi9-xWY=Tr{_$V`7P0((fX*u!xtqTlk#DFd@{=PRc^%@^(k*v>-T(ALvMZa#G@UE` zv}B(yhr$0xC_m73a3~aY^K-0uV_J6ZWlfBaA?2vowq{+aW*u@1Xg?q50M>O5W9@5X z*l>aKuwDHF%UU02qs5g+u)n?igPy4Nv zd%Yn3KOb{yc|yx!LFTeF3uTd>a$2Q89t+-mMeK$Gcgn6R$2kt%YtSgL-;}1h zJf?xN=ZN6{;(okHjf0fQMOS1$qGoF9jsX_&oIey)TlW87hxgD8{xB?EBv_kv?Za1F z!Ro!#gS)@<|NKf4N~gYGTx--VH7XuD?YA-av)=p7aNGa#2GL6R5C&i8YO?<%+=xFf zxGCU-;b2RF`~PCIOdi)#djimXq4-#BD{3l^A;i+KlYq zFFnRDbppYCmnZP<-gusS)-)Noh?6VcRVJNI}3Zu%Yx?IvB$; zcWoqp1#drT{B`5)6^WL=KhPS}#f4@YAnF?|f2+2$eaz=ZM3#Xl61Z>4e-?^bJTz!8 z_M++%K~8|G{StA$b9HTZTcdcIb;G~?Xz^3G&^X>$X#_2gcAYb_|Mq=DQ2Ab4x&M3f zTM*M~qzV4%HI6?{0P-(5^Zyk+s|WIFHE141%x!BK%G2kfSWgOg^;r^VcrC``_JwX#$D5r#}}k&ABI| zvHJz?9DS|A2M_rc!z47;HG`LF00h$d_Og|BPxRXq?sjC>dAH8*JCfgdzt5%Qye1`Jw23C``qw*95(hom7rpEw{dtUM+YHjQ zgF`P6^x*?H24Fjww}JdO%(9IsL~W&ch1zd0`_o}1j-#+r`7yXCU7sGPbPa9u`y6}{ zo4dX9U=k_huV7Hqn0e2_%>0GFt@4R1dTL2PPPYv1cm7>7JUrgY!X>B=g4sj68cR;x zuQV3ecqi9e2mroGz&d{g+cynAyv3WRxG z9~iaQ^AB^0a@G!Q%kD8(QAg>OPQ{X8+x|Z#VES3Ii~m)5c}1YWs+$-bmMlI0k%e>r z8fj+FbFbs~0Pt^0(Xtm<{^*^f2icK&VgxDAf<;uXE3H9_yj7aTDT>(;kL>-S(yzNN ze!oVDSM0%<4F84A6Rm*ys}g2(R*<#wU{}Un)uYoJ&kJ-I@5j1WURzAxA^sA4ZY&K< z%!<=!uI6>_@P;YarIMy`!Jm)U)ywdFb6)6&3i%_G@89gQ{IN1{ejcCcOCd6G>Z~-w zd_;ZCcis^_uC)5t3-vdgejW9@WxRI3nyml+=n~6LtoU^73O84flc6pJuZ%uDvJxto zBM5np;*9JFO+dwXGiP4s2@b3b&K{ow|QZwaZ0K0r;&fT^kSPV53U)a!f?&8 zHN6LKt)QR(Ys?!nxyt9B_9k5v#(n<^gFZ%~(bVSqcWMVqdPhB%pyJFqz{Kt^xb~8Q zO(*MJ(Nf_liQxp1Vu#7SYqn(F>b=%|7+*e$^#37Co*PMCPSYq=9|D2ST880sUT$U0 zLM}Dia@0lm@16e?3yqhci{AUFvg2jlt<$EnCrb+)nc9P%_(oQpZA^`m%s%Ic$;KiF zWZ%=bf;^w#`LkvPn9qR~#WtLRlxxu;8S-vc2lSm}9=SxHJDnf4CScw2z=!@X)$Xl#Tt?lsGkq-jV-63#yzuN{^}fkJ zRsQaMB|p`YE3#KssWtd07Q$;N)ywV4$nt2fm7S7Lm)`0azjo?kMqA^W6x@mNqTM1Q z)LJt>a#v!aHI8VUG8tOW^=TVo;iuyH?`!9VoZEMAtTp{OQ;*3dugY$l{gTS(x$k~C zM=n(UgTkw#c9XYZw^WtTvZ##$#hxx zE|chw+a{>D`$s>&wYh^^kDn0Z$|d=qThj%R>a5&jar1g*+WWEpUa3Z}rWAg0acF**P1KXf%x4C28E*mp2b(3#==FB&WaB9l za)(x{T?p3A2)h{W?seqidXMdlD;iL&lP-ga{pl0^y%MkE?=&_DR=tO}(Y0&nwGe?? zFjZ|e5-&d&AZl1{jj4}KyU*ryyIwWq*`5)PEVJRv(@n`iHo%pIbiusX4G|7mpC@N~ zkCt<*{PupnOYCK=#ue(}y=;HGsszjv-k&xp=2l(*jl3*xr5nW~ zWAsVFk=UXYn=ci;sg7lV{P363TCCCBctreSaful06oM|m}Xh0CHv z9eFP|o3mtm?LH!<)O4)7!}!J{7u_gYA+j&{=Zwy+jM3}Ga3LfveF#C?L&!EvK@}6z zGVpQW)tes)2T~3(&ez69K(MH!?J&&wFn@WSy@0>r)61=q!Br2k+XR(k{UfU{zhZb>b-Jm7U*Adg;r**Vi=TPJ-ypgKqne8f3d^v`5JNkV8N$$J z(pB_K*LMOkAab>g2}+y)ikDUK5Pu4XgBfH`8NBZn#@KGG)!_=j)?ns#V}yTEX8Y z`_$9GVi_w~#-yJ3YvStc4kBzM`bU=#Az;{)Da@BB+9^jgeT3A;6`E{-Jl|;eTv&dC9xS9Oi99CkFZ4 z270c9Ct2o`vGdUvF(=30jag+{eEs(AC|*6&V)Q}GtT#TLokZTpuIrH11pw*1QL_FZ zX4q1;E_>O2lGFlBX`k5txQeka+VOivnva991m$e*Bi9 zSB?kiSYPn`*$w?+g2wW%{ctJ^avyh$S92=rn8hqIJ-&EETtgeM`59&_0P*1ay+lL&>Ft!2wnNo zmh{B>E>DbOho?@}?=HS=vnjuFSlEZZgf=1Ywj(pl*I|RgH-?eW7 zgz&`>HAq629-Ac>+vyO;K}-%hhe1FV+d?*r^@hlU&2HLxP4BU9=O|N*<4VhdTandQ z{csNBuojsv7xso$57GtLHY$*{8z?vZ+fv#AbMyT%Q|mxpyo{+0VIB~DAf5~2Vl(Tu zpc}Ji!zydciLYZD89{t+y3?q!IYsTD8b6A_*B7ou?Rgm&(GR*nj&O3X0d{D$5RX!} zCyJ|X^Zn6{@w%!QA~CT}Fi2rnDCD5z@t-?9NcGwKpb~#T=At}PA5M%>0Wy+^ zLkXZKSmZ3D&a_TIaN0ZcPHy5|?J&4Q7!?;V?nYpiV*J-D`yzy+;u90sRoI}jr(~kD z|Mva6-EU6VkQ7p>U7vTv)Iww`H>3q-b5*)rYOX~$LqX<%_Sv&bKL4^9q;`$Wp^{Fs z$Q^40oFiLbcXlz+`t^k${o+;WP^Xrcmy26j!88|K180|H)VVKTzHC{)YUO$kaETFB z1n#D(<&)a(?Hg9vnwBhw{UW4TX=yeoL04;|bxlI%-=|xgYT}%-y*;uz-sXdd)v~P% z18Rw9%+<(+fP(bzyv{1^unvs!{X@2&fWJ?g#mq8yCb#*iZhRk?4wjhT-|Vcg+Yslx zr;=?`Ju2=W#TqWXsW8M~3M#^}o7m2Xo^@uh&^=~_2B;F?FC7o$Jej7^Y#987wUCMc ziOXfTHv#s*7r3yyeb|w(RA9K?@4Hc`7+#A86@gqNHe)PPLl8kflmsqzZ7CnHth9Q0 zph|px{GP$&P&@h3Z3HlW*jDaj*=vmk^qw!)ivuG`20`=K5eQOu7`*4|b0_;r5l{cu%FaIBNDPYQDom$G#Q(x+Y@yLbvOu)?V!L}tPgnV6nIg)Ft`=a zA4yT6Bbn+%bi9sz-;0t4UF^U}mfNEuH?@N6K3UOY5k;~Kc^y^ujW@ct2pZ$@v11v1e!zn~FjNiUY7Lwjz z&)0ZBhL0FsYR2omSF=14x6taXh4dE7l8_PQTqLNId$OyB6!0~5|6nqwly{G22oL^vx2H2yUAGsAtHF*4baUzn!r>G{htt|AN;2Ht zFtJ_#IqyP7e(;N=n_5!$wW3qP8r=2J^^4`@w0W*2)}Z86m|)XAeB&SmJ_+R=Wp_w1 zh=CbgFj}G$#-%tY&dSa+H@Zis*kl~{R&YBDf=w1rBmp15xt&T`m=*!-3Rt!=vt{50 zmFrEOy<5`JmEIF>^5@hkJXObI8~ojP)3H1z|L`Lfq)>=Dc-Jf?KaAWaHp3t5l(c>w6gzNWC@skK z?(6gMID}s@=$SxYAcN&XGzL3DPkq7pZ|VP?S)zanBgitz?k8UdI7JPWBWsUU&1o;i zU@#}oc4)4Z8gW5Sul8zuR5@_}h8)}LR(#B>-S8}qLKw^5VCUeh+%GHN?^?J=-T|9i zn|k5&rj)#qHK@jby=TpsRM_dP@i`Kovf^!lFvm5KW%q1!mO`y*YN|ihMSa@ta}`%? zX;rUBzD5VF@2QLY+eEkavHP|$M;YQdZYTNm>0vJ|db2E-i)w1jK^0CtapC0AB}hMb zfM@(t90v0z?kn${`pGX}3CqrRU~S;;SLvwAzTTcIXkUs?>SXz@i#5He&vJ>ks4r?G z8lP<}#oca7%N?|^spf7uWJdK}NF5m}VLY#^dj_=NaN`|z4)pak9!i+mz%O2@>evzn zsozg^_tXC&*-!^NW7I-FA^DrDsKxYcyMhdFb5Ujq z>kcyPzjs_SCU&Np_LL)k96cZgAnq7Vz*JW~8_G|NcqfBoxeIX~7r^arFS5Mq2VFm( z@t3^{X&m8x!l)M6Jd`{z(Gf+Bjl_P-xz<)m6_6Hjh~P0p3>S=uF(gT<+Cv>A4z4gJ z)9iK6T9;dh&1jr$5{qD=ZGL9Z1X*RMs&QP$Onow$BxZZ|K_uj5607T^cx1n|NfRci z#Kam}>l3S1dU35u(~72&=Px}yT}P@0?}#dyP<3oN%lqy7RNO{bpn-HpAE%wtRChSr zxS9jlr`b?lYhD6+15wP{>ldQs-Q_ULlaDxXm01s=MpH2hQ#@D~4VP}L$9;h=ieXUW zT^0_ZVmx9O!S=)9pej%bqW3$T;k#h?pP?QF^%P66wul84^H&350(W5-rB z=s4))HcaA*RlCnMxc86bV-csBe&I#)Qi5$TNL-;x1;yoE_Wiyq*0S1OyZV!G?})XA zxW$ieu>(0_XI?|C|GZ`9t!;lk6?8L))yEu&U)M^nBo7T4ZmUr@?8l~a3qo(wP>8~4 zgj6hqB1pW2(81cLcz#T7e0!BeDNL}b%bB>n=`Boe&T6sWLOfq6G6OJwYa3^k7B5CtM1i)=Y4`0c4&eNpKqF03MviG& zxZ+YkCIjGr&2YLjMmxl{#x5<7+tbMCTkVtD$Fixd!3YIF(F5ts&UZBG-oG^2E2iF zD00-*PXIeZuLi>;&WfIp4Hb4R^);!ap|)tP$n38-3U;0`NsJp!#7Mn51x;Ligy|0t z)hqnvw=7s*z1sTDK&Uq*pFKYWTwl zvYP2=HK=w)Ku(2e^W>06fNh7C+wB|7fkX)9DzNfL>-6QEZ(RcpNP!NQGG9#|Y2g)+W9S z&hAe$_(}C0A!@iXK`rUeCTZo&Jn^-xf{mSXM8iZ1F!B%ClumPF4Fta-dMpUVQo^RR zWV_f313OI*9tnxcpO}CM z(DU2lVEh7&b)_GHH$0wN)rds!{}s^t=BQ!2Yh!TW~!Q>F6VPDlDt^ z&;$g}aql`7L#7jzPbmyiiV2D4{I0Y_-Ta(t3O$-MR4tCUCR#lFMKC9J$hAUOh{J`% zPv*9WgC!t`at%n)w>>!ya8w{k%kbWG?$bB3Ay&!cA1(_)QmkS4PqL?Ujx^2DBr=!r zIu|Zp6h+_LGVnEhhqYDCQVYs2`29>4^(Jeid6NAMLIWVk{X^<%br*E1f27RbYIkTk z+7%kZyHJz+aGzu%!@wWp!2|wD5h(f-kK`fTL~5t2F9X+)*a%&c5Q+-NV*T{(GK1cA ziJ2tD5AMXtb_3^>1itKBH9v=@tzOI7Su0rwdN$+F5NSnnNm}&hbW1Q4LVY;-Encn+ z#brj71!1s~qg*3Z|8UBxRGcO#r7yu)9MT8fWA<8k-!wK5O-wkFp^ z@@xjZB`T>?f%HS`d2UY>ol;J7n3V>hSRTlQR4z}C6D zN_L{TgwVV|;BYH+4{zg*Iz!ZzzifcOU5!fG6jVXUQ&HMrgZr21YAqr7m!IFqM2rqI$>4E0J$qr?63f>^!!s4wO)q4x5iu z*gzrz4s8E-x(UcU3@G9#Y`l-e>ex@4ec7j1**i8+$F*_Qa#&pIqoE`CZ7!EXDboq- za(0uUIwg^ecPz0$WOBE{m#E94J_`gNam(iHhIZvDvAUiEn=e@}0rq1)Dmu0jG&emx z6(AHLiiksiv-H0l-OSd(zh6~o4K7j-T_U^58M5D`ra49Dq)>wt47Ywn6=q!T`j{`L z_xeHy!X)EkW80SvQtFx-)DK?S(1g@O13v}8q5tVUI`ykMOR_Ikdi6cI+s%I*9uL0Y zDx53G6*aIo$GIgc9R(}V@_^<^lwt4ikp9S{ zW)+MHf$nv}(6Cdu<$zFe8G2VremSGt&@wuJCibrpoetOLnA#htF815^HHrthk5(Tf zwoDAysSg}wYQV6a9M39jiR~N*0t!MU0qKaG>svzu6tX_G-FOr{aZVEdBcCG#1WIw~ z+S4!W$_e(ZTT)B9AbRH|#1^f7U=9af^UZ~P$!;thIxUm*jIoQly7&T^*hzh~OXG}G zHR5}hMA3AeI%xVtYV(4Bi^B#?Nii+pA-5jZ1+>ztf8HQQamSB7+iNQDuY<87O)p2u zyhprra5r!o633*XWE~Nq+?53wC-v97mg-G>lZ_!5P)}^j7@rU%6(tcGO`6A%+hn`F znF}gJk3h!dsM+-Qet^crOxJbnI|Em)JeC=flCsgok&>A-8<>g^vf8z4S~1;WZ38%2 zuO2MA)?+}~tYvJ5)*fR!B?}9S-uqvW`RMJ%D3@K`NrHUu^C^u>IUXoag;wgRWS{w9 zLY!|{&0(erkhOT)R^L9td-xvg<~(W74?R|aQ&=HUR7VC^?d2V*MENf6Zu@66%CRjFFWGH@@0b7SRc+0;FtkRqG{LA2}PXt?t=@fq-$3N6yp9JLN}o@(C>jyq zq@7`|33@K(Qp7DlCHfPvPP~oq)soxTO+KZ$~V&eqwki1_Y9N6>)E|`u{!6-kSC+3 zd-~X|uCbdSKk^bJ94urZoHj5K^@Ra;*Smv4+cdyb#b^qVYELjZwLzt}_sWOh0f9o5 z(VO`)!=)@qRdua{*ahfFujp0_e}{X=r+|^vI26vb2saD?2ER+NMwDxLx>n&e(1gNC z5^X!QdQhV4B&Q@`3IQvkm5`3vgx4S|LR&8=Sx%*e@RkUp7ibV_objfoV^Qwokfx)v zKgd+EIUu#OCtPDDZqV?yaDf-&`;C<7+{NiX*R=AjjI5Rmdee2`q&*=R0}gyZ&A2-8 zo`RH2ZTiEETv87~qV*+@_FYcNbZxVN+vA@8VU}Sv_R(*}_WYi!jYWEv;PF`1Hgu_H zBfHq7shObav|KynTcMk#<{XS?bs?10wD z!p5|;C1*di=Es(3ZUAbtZt8BCN^#6Vvg2$(yM94<%paooc0hH?4aPu{=6A{rW-R2Q zKOEA(w7F`KUqkmyiD#B$cj3;IculH#b|9F4Ft$gLf6lZd+uNIZ-qh)-ns2y8KbS&S-0j z(XMuI2oma}ShWMi2-9P2pKI`WJw3+H(;OL>+^urF?usVmo;(9yGrHYS;%El6cwksm zVKmT-TtxmTTV{ggq8qoUe{w3${&h-RG8rq@Qoc-CVXG0uti)VGd65B;uA+f= z%D*Y0j8f=9<#S_M{WlIxao$^NvJ{mqpmVh8fEFq!V zG&|HG!GH=c58MLSBD6>u1Hh6*20LMkmqp2WWLazpswlx2<}?q{?@A^bYR;HY?Oe`o=wWu)Qk=>tnjnN z8JUXtow#(YmekO*F9KM&ma_GO6AzSkl24l4J1{&YM#j_VLdlVv@inn)8ihZ~3*!{2 zG_7mb%+1Ypen=R9Vyltr6(p%WzU$bJz^ujFj_ETd5v_cE$$)Cs@w z9;%ABN>4Wj9EE$tTJ$}waRqQaBEAur(AYaAIT&lQ;vV9_0UX=gkYWN&Vv@Ydup?(m zLvDqU7yduMkMMrQ^uJ%%Oa=WTPBK7suq_L5Elw|DyPlEZ?aTAY|AgDop~meWk~P-G zF`NDy>2p`=@(>ONhFocBA^U42ya<4b(Oh~-H;CdyWI%vM)D}#W6C!^jhbpB2Az)l!XDU!)l7B(`2 zG>u%l{+>qEqUMy=&RziSp%&i(;@huYGjY7i?8monZ>!9#Pz!v1Gnygy`yHHBU^9%l zM`Ttgu)1@4N{^bp9763&SaF;tDY{uv3w;h3H8q>KrSp%zSSy$+7;*ebHP6 z^31l;yI?*8I?EOS8~9I?m^2=XRV~7tZ@@pE>$B8LzSL{04YYDTAlu17t?tlw=AEoG zWu%!yL`CP98+^Pop1VwqVKU;UCDv-WhLAZ0GBKzF>571Y zBEMF)6wWfu?KhHia>IzVB$3ZRcTNm{$SH1nE#M2P)DJ=KvxcO%z@Gz;`#no%M+T7} z(k*URZuEJ{SyC{wiD7m+^ngX9@~(*TI%Zf2;}p&-*rcBU{f4=?l2p`7^aQAqBJilE zo$sC|Cn*_d;DD5J>BIDgHcP|up|`cHgb+f}-9S=2?#g2q;i_N}y_#Sim(U{@g~}e^ z6bxFV(DghlVAn4$G+CR`C+zrsHNQ0`gu{TFZpP?IV-q3-9&$WG0-4XDhzZp`RWQVM zJ&4=&zBH?+2C5QR=9m7CL zUmD&~^Cf*xbE`0y3mkmNQSXR&QPMuBse#v-lMEO`i_NQRv}1VE)WuA)$;XOCe&#}+ z*KPr^9mSb9a~6p)+9R%+%X;VRb=6EM;_A9id`N{{3*cswJE+R|4X%Hl?jZNz1P1t` zz?)j#W-OjMsqbH*j@#(0ui2J!;QROXltlf~K{sWv=PCixS7jcSq9EnZUzBNW@N&zY^p78(X zz6FF-hC7IM?WL;NWI|TOL1nYxyxxlUaNqOz_Lpz6Pp=THE+ezuknyoW3@O7m`IcOU zAME_>lngp!G!y8E{W>LxBlplXSZTNrg-w{YC6PyA^YAQwDn)K>PKooju*%J^TrF0r zoewFUGV#y`$1t+nfFQa4eaQ>!Y!&+X@>MFK~HsB_Hvhso7tu?lR^6xwAy`1ocnqk>XtAg z_=MoFqeESHf3eTRCXOq6SM*N~;Yx>_Z~6K#epi!X$6Ha(=>$ru*Aj3*|1qEj4-PF& zWECoD1Z4uJ9SDWh+2oI6KoAbUq{G#|ozbv#q19)w&Fe!_OJm*>Rl`MCuBm7}QH#9T z>}VC>e*X0O`HyRk%eWjYW(j(E^}FvcIwk3i1gl-OLrmx*e(z?WsQx;S!=XPD%rwTD ztb(6Ng@ecEVR4X3W4kYlCPZ$g9-EgxJ9rMP$_h4_v&#y8A|6x};%6}9$|f|7Rl>wR z^p9ss+*FEbH&r?8$HD|JtN8E@6~A+<4@R0r-=Qs;WoLD11i`=D1HpIQ6|FKtx=GV2m+|H&$bZLkHWno&dx6pn|SVgh3KHp1?KRqM( z_(xyR(-hGmtrd1@vvNxVmW!p-=(mV1-0QLdSvYa=)#w&=I{6Po+a#7(eY~oX?LDR! z>1`yvJdiDL*E@Jf;+3u}28Z+Jhl}cKFaP-Q>La=Ei!oDD5m{=?oK6Cbga?i_x#Y;= z=eHEvrgm&aPnPa*aMeWdW-s}j$43RTs zEDS7>*1O|uSDxZag|QFu06RK%mqXQcou;!N>s ze^qE2pcg@+EBV=qcISL66s51|= zk@qOUyz^g%C1UB~d><};g?YXd2L~+WI{t|JclbGqc>+`WCsfj=-%y{XCi&vd>Ys}H z_vvy%7C+n@U|cI^aa9xx#>5lk-Iqo1C9L9fTlMlq%W5(qnqIUMtjl6w7Iw_~^VSiu zjKutrosa7+cQ}5#%+_F0K;v#sAE42#>qH)%3pixNS9am{_n1PDzj=JigSfxs?T=mj zd~&B3FY%UgyWvF)n*7#u_e*9DF=lDb(v4!9$)x{9N}aGb`5J|6Ui{3l4^N$6nB55C z@0YI?`t-{l-e0_}FBm^+qu~AX8VeN`Su~#ayGvoW8QuLA-0h^x+16+$q{^K6$Jurk zc^$Ns+%>&@am@A-M_(o0{c-TuNX@~4qSY&h*0U#ek$2>Ey}Ni>3P~)ohT8GD-WwXD zWmbkGD`x!|kjFwk)uO+2$b5hPhAKUDL3w3~^UVhzq*UML+r-3c?Cbuip9O4u4?hOJc`-wiUMDHrm9o&QKVUMEGBxJ!|<$ literal 0 HcmV?d00001 From 2654f30eca802c963058028473c18043b4dea40c Mon Sep 17 00:00:00 2001 From: vergil Date: Mon, 3 Jul 2023 16:17:10 +0200 Subject: [PATCH 056/440] Adds complete package metadata Signed-off-by: vergilfromadyen Signed-off-by: vergil --- packages/app/package.json | 6 ++++++ packages/backend-openapi-utils/package.json | 6 ++++++ packages/cli-node/package.json | 6 ++++++ packages/integration-react/package.json | 6 ++++++ packages/techdocs-cli-embedded-app/package.json | 6 ++++++ plugins/adr/package.json | 6 ++++++ plugins/airbrake-backend/package.json | 6 ++++++ plugins/airbrake/package.json | 6 ++++++ plugins/allure/package.json | 6 ++++++ plugins/analytics-module-ga/package.json | 6 ++++++ plugins/analytics-module-ga4/package.json | 6 ++++++ plugins/apache-airflow/package.json | 6 ++++++ plugins/apollo-explorer/package.json | 6 ++++++ plugins/auth-node/package.json | 6 ++++++ plugins/azure-devops-backend/package.json | 6 ++++++ plugins/bazaar-backend/package.json | 6 ++++++ plugins/bazaar/package.json | 6 ++++++ plugins/bitbucket-cloud-common/package.json | 6 ++++++ plugins/bitrise/package.json | 6 ++++++ plugins/catalog-backend-module-unprocessed/package.json | 6 ++++++ plugins/catalog-graph/package.json | 6 ++++++ plugins/catalog-node/package.json | 6 ++++++ plugins/cicd-statistics-module-gitlab/package.json | 6 ++++++ plugins/code-climate/package.json | 6 ++++++ plugins/code-coverage-backend/package.json | 6 ++++++ plugins/code-coverage/package.json | 6 ++++++ plugins/codescene/package.json | 6 ++++++ plugins/config-schema/package.json | 6 ++++++ plugins/devtools-backend/package.json | 6 ++++++ plugins/devtools-common/package.json | 6 ++++++ plugins/dynatrace/package.json | 1 + plugins/entity-feedback-backend/package.json | 6 ++++++ plugins/entity-feedback-common/package.json | 6 ++++++ plugins/entity-feedback/package.json | 1 + plugins/entity-validation/package.json | 1 + plugins/events-backend-module-aws-sqs/package.json | 6 ++++++ plugins/events-backend-module-azure/package.json | 6 ++++++ plugins/events-backend-module-bitbucket-cloud/package.json | 6 ++++++ plugins/events-backend-module-gerrit/package.json | 6 ++++++ plugins/events-backend-module-github/package.json | 6 ++++++ plugins/events-backend-module-gitlab/package.json | 6 ++++++ plugins/events-backend-test-utils/package.json | 6 ++++++ plugins/events-backend/package.json | 6 ++++++ plugins/events-node/package.json | 6 ++++++ plugins/example-todo-list-backend/package.json | 6 ++++++ plugins/example-todo-list-common/package.json | 6 ++++++ plugins/example-todo-list/package.json | 6 ++++++ plugins/explore-backend/package.json | 6 ++++++ plugins/firehydrant/package.json | 6 ++++++ plugins/gcalendar/package.json | 6 ++++++ plugins/git-release-manager/package.json | 6 ++++++ plugins/github-deployments/package.json | 6 ++++++ plugins/github-issues/package.json | 6 ++++++ plugins/graphql-voyager/package.json | 6 ++++++ plugins/ilert/package.json | 6 ++++++ plugins/jenkins-backend/package.json | 6 ++++++ plugins/jenkins-common/package.json | 6 ++++++ plugins/kafka/package.json | 6 ++++++ plugins/linguist-backend/package.json | 6 ++++++ plugins/linguist-common/package.json | 6 ++++++ plugins/microsoft-calendar/package.json | 6 ++++++ plugins/newrelic-dashboard/package.json | 6 ++++++ plugins/nomad-backend/package.json | 6 ++++++ plugins/nomad/package.json | 6 ++++++ plugins/octopus-deploy/package.json | 6 ++++++ plugins/org-react/package.json | 1 + plugins/org/package.json | 1 + plugins/periskop-backend/package.json | 5 +++++ plugins/periskop/package.json | 5 +++++ plugins/permission-backend/package.json | 6 ++++++ plugins/playlist-backend/package.json | 6 ++++++ plugins/playlist-common/package.json | 6 ++++++ plugins/playlist/package.json | 1 + .../package.json | 6 ++++++ plugins/scaffolder-backend-module-cookiecutter/package.json | 6 ++++++ plugins/scaffolder-backend-module-rails/package.json | 6 ++++++ plugins/scaffolder-backend-module-sentry/package.json | 6 ++++++ plugins/scaffolder-backend-module-yeoman/package.json | 6 ++++++ plugins/scaffolder-node/package.json | 6 ++++++ plugins/search-backend-module-catalog/package.json | 6 ++++++ plugins/search-backend-module-elasticsearch/package.json | 6 ++++++ plugins/search-backend-module-explore/package.json | 6 ++++++ plugins/search-backend-module-pg/package.json | 6 ++++++ plugins/search-backend-module-techdocs/package.json | 6 ++++++ plugins/search-backend-node/package.json | 6 ++++++ plugins/search-backend/package.json | 6 ++++++ plugins/shortcuts/package.json | 6 ++++++ plugins/sonarqube-backend/package.json | 6 ++++++ plugins/stack-overflow/package.json | 6 ++++++ plugins/tech-insights/package.json | 1 + plugins/user-settings-backend/package.json | 1 + plugins/xcmetrics/package.json | 6 ++++++ 92 files changed, 510 insertions(+) diff --git a/packages/app/package.json b/packages/app/package.json index 3163995632..96cbf0c1c5 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -6,6 +6,12 @@ "role": "frontend" }, "bundled": true, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/app" + }, "dependencies": { "@backstage/app-defaults": "workspace:^", "@backstage/catalog-model": "workspace:^", diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index 85a1677adb..9c83356c83 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -11,6 +11,12 @@ "module": "dist/index.esm.js", "types": "dist/index.d.ts" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/backend-openapi-utils" + }, "backstage": { "role": "node-library" }, diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index c59a8930c0..b5ba1855a8 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/cli-node" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 616826b430..b39d4fcb0c 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "web-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/integration-react" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 3bbef65e68..1b6af7f9e9 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -6,6 +6,12 @@ "role": "frontend" }, "bundled": true, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/techdocs-cli-embedded-app" + }, "dependencies": { "@backstage/app-defaults": "workspace:^", "@backstage/catalog-model": "workspace:^", diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 486ea800a2..b032ccad7b 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/adr" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 06e5183a44..226126531b 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/airbrake-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 48a825f93b..8a156c775d 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/airbrake" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/allure/package.json b/plugins/allure/package.json index f4809128ff..7a65d9f707 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/allure" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 302ee1cd86..8fb8d42a9e 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/analytics-module-ga" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index 85f34468b1..09e7240142 100644 --- a/plugins/analytics-module-ga4/package.json +++ b/plugins/analytics-module-ga4/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/plugins/analytics-module-ga4" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index b30abb3bc9..60afaa9a24 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/apache-airflow" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 0b43fd63ba..b9eba3278d 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/apollo-explorer" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 07b9adacb4..c5846d60b4 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/auth-node" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 0a34ab449b..706274df6d 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/azure-devops-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index 6e960f384c..d41127a9fa 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/bazaar-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build --experimental-type-build", diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 0536367512..3181e99833 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/bazaar" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index ffbe670094..38ba256c35 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -14,6 +14,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/bitbucket-cloud-common" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index fe7f1f1591..5388bb3542 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/bitrise" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 9f3f2f0b11..e9ca4662ac 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/catalog-backend-module-unprocessed" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 73cdb47d07..2e2b3c2402 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/catalog-graph" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 426f8e3297..8aef496418 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/catalog-node" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 89da579bf4..2f9064b580 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/cicd-statistics-module-gitlab" + }, "keywords": [ "backstage", "cicd statistics", diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 1c0576bbdc..935e56e355 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/code-climate" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index a4910c6093..9174122f38 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/code-coverage-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 8fbda2ff48..936db59fb4 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/code-coverage" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 1bf5dedf87..aef649c213 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/codescene" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index f8a83aa177..ea4f55ef3c 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/config-schema" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 239f7f5328..158bc00a8d 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/devtools-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index e3424e1b68..2c8b382727 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -14,6 +14,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/devtools-common" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 6d4b10418c..852ce144b5 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -12,6 +12,7 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 36c0f85be7..1d9aae90a8 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/entity-feedback-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/entity-feedback-common/package.json b/plugins/entity-feedback-common/package.json index 6abb002aa4..642988730e 100644 --- a/plugins/entity-feedback-common/package.json +++ b/plugins/entity-feedback-common/package.json @@ -14,6 +14,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/entity-feedback-common" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index de9eff5420..1ba7a035b7 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -12,6 +12,7 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index 46455d3a4c..e9221c6695 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -12,6 +12,7 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index e509058b69..77edb71673 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-module-aws-sqs" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 59d397352b..573d3368c4 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-module-azure" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index f867348a3c..e4c1508a34 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-module-bitbucket-cloud" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index f7f9471dfd..55676bce46 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-module-gerrit" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 5fd37cf134..71a4d33d42 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-module-github" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 1734ecf5b0..087e1efd55 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-module-gitlab" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 342bbf6483..bc54d17858 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend-test-utils" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 591c0c2381..cbf1dc8af5 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -25,6 +25,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 906d2681fc..4d2169ac20 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/events-node" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 8b75149cae..9747356461 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -8,6 +8,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/plugins/example-todo-list-backend" + }, "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 902ea03c9a..03d39bb49f 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/plugins/example-todo-list-common" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index e1cc5178fa..da11b3cf24 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -8,6 +8,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/example-todo-list" + }, "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index fedc9b2600..16174f7a51 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/explore-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 0bde3e81ed..960cf01fba 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/firehydrant" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index c44f6d30c6..8a2311065d 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/gcalendar" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index a407737cde..d7214d86da 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/git-release-manager" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 7147f0e53c..7fe0efd865 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/github-deployments" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index c975f3687f..89c5d19ba0 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/github-issues" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 5bb3c253c0..5bcf02d73e 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/graphql-voyager" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 39674cbb19..e283ffa24a 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/ilert" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 7998932341..4ab3a59853 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/jenkins-backend" + }, "configSchema": "config.d.ts", "scripts": { "start": "backstage-cli package start", diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index 4a3eff8e81..dd00527cee 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/jenkins-common" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 68fc955734..617290f5b8 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/kafka" + }, "configSchema": "config.d.ts", "scripts": { "build": "backstage-cli package build", diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index ae92da2492..5110021ab2 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/linguist-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/linguist-common/package.json b/plugins/linguist-common/package.json index c13f40dee2..f28a721021 100644 --- a/plugins/linguist-common/package.json +++ b/plugins/linguist-common/package.json @@ -14,6 +14,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/linguist-common" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 09bed7ec07..1cdb50898a 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/microsoft-calendar" + }, "author": { "name": "Statusneo", "email": "reach@statusneo.com", diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index b134d94dbb..fd18e44217 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/newrelic-dashboard" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/nomad-backend/package.json b/plugins/nomad-backend/package.json index 27ee1325f1..03d0b137ee 100644 --- a/plugins/nomad-backend/package.json +++ b/plugins/nomad-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/nomad-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/nomad/package.json b/plugins/nomad/package.json index c34db7374d..8db5ed7690 100644 --- a/plugins/nomad/package.json +++ b/plugins/nomad/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/nomad" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index 8f8bf98a56..46ec2cff08 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/octopus-deploy" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 220c237345..49765ba6d5 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -12,6 +12,7 @@ "backstage": { "role": "web-library" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/org/package.json b/plugins/org/package.json index 6f09955e7d..23af90d2b8 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -13,6 +13,7 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 4567470c5a..f515fd4088 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -8,6 +8,11 @@ "backstage": { "role": "backend-plugin" }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/periskop-backend" + }, "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 1ed2e39707..2f9f23d592 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -8,6 +8,11 @@ "backstage": { "role": "frontend-plugin" }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/periskop" + }, "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 8c77dbba97..964a7ed5ac 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -27,6 +27,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/permission-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 9ca2c3acfe..24686f93e6 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/playlist-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index bea2af8660..4303113910 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -14,6 +14,12 @@ "backstage": { "role": "common-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/playlist-common" + }, "scripts": { "build": "backstage-cli package build", "lint": "backstage-cli package lint", diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index a4fb704fa2..33f1a94a3c 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -12,6 +12,7 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 9d9efdb5e1..b8ce9ea8d9 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-confluence-to-markdown" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 22cb5b66a6..f95771822b 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-cookiecutter" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index d19c0a7f91..9bc7bbf06f 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-rails" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index db02c35513..0193427ec1 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-sentry" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 4e812f801d..12e05629db 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-backend-module-yeoman" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 856bac50b2..59e80f1c1c 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -14,6 +14,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/scaffolder-node" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build --experimental-type-build", diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index a552ba7600..c1f46b7a3a 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend-module-catalog" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index d7831f70de..47abe5e3b2 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend-module-elasticsearch" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index abf7d1a49f..46c11a2e62 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend-module-explore" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 5a1d5de17b..2f37f90681 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend-module-pg" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 44115b5cf1..5a5e933523 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "backend-plugin-module" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend-module-techdocs" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 445ba72f0d..b799d07d62 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "node-library" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend-node" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 9ad4f55f40..f2d4d0a74c 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -26,6 +26,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/search-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 5572036823..1c1699c67c 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/shortcuts" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 79762943fd..41aec6ecc9 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/sonarqube-backend" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 768e8f2b54..030255ec62 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -12,6 +12,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/stack-overflow" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 4721e0dd30..67df31cf47 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -12,6 +12,7 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 8b93f7f723..caaa31faa8 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -14,6 +14,7 @@ "types": "dist/index.d.ts", "alphaTypes": "dist/index.alpha.d.ts" }, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 57ab0ad3f2..0a3ca50ca8 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -13,6 +13,12 @@ "backstage": { "role": "frontend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/xcmetrics" + }, "scripts": { "build": "backstage-cli package build", "start": "backstage-cli package start", From 12a8c94eda8de58210e483db51fa03ae30357a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 28 Jul 2023 15:24:00 +0200 Subject: [PATCH 057/440] add changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/hungry-shrimps-care.md | 91 +++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 .changeset/hungry-shrimps-care.md diff --git a/.changeset/hungry-shrimps-care.md b/.changeset/hungry-shrimps-care.md new file mode 100644 index 0000000000..665a7bfc82 --- /dev/null +++ b/.changeset/hungry-shrimps-care.md @@ -0,0 +1,91 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-events-backend-module-bitbucket-cloud': patch +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-catalog-backend-module-unprocessed': patch +'@backstage/plugin-scaffolder-backend-module-sentry': patch +'@backstage/plugin-scaffolder-backend-module-yeoman': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@backstage/plugin-search-backend-module-techdocs': patch +'@backstage/plugin-cicd-statistics-module-gitlab': patch +'@backstage/plugin-events-backend-module-aws-sqs': patch +'@backstage/plugin-search-backend-module-catalog': patch +'@backstage/plugin-search-backend-module-explore': patch +'@backstage/plugin-events-backend-module-gerrit': patch +'@backstage/plugin-events-backend-module-github': patch +'@backstage/plugin-events-backend-module-gitlab': patch +'@backstage/plugin-events-backend-module-azure': patch +'@backstage/plugin-events-backend-test-utils': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/plugin-entity-feedback-backend': patch +'@backstage/backend-openapi-utils': patch +'@backstage/plugin-bitbucket-cloud-common': patch +'@backstage/plugin-entity-feedback-common': patch +'@backstage/plugin-code-coverage-backend': patch +'@backstage/plugin-user-settings-backend': patch +'@backstage/plugin-analytics-module-ga4': patch +'@backstage/plugin-azure-devops-backend': patch +'@backstage/plugin-analytics-module-ga': patch +'@backstage/plugin-git-release-manager': patch +'@backstage/plugin-search-backend-node': patch +'@backstage/integration-react': patch +'@backstage/plugin-github-deployments': patch +'@backstage/plugin-microsoft-calendar': patch +'@backstage/plugin-newrelic-dashboard': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-entity-validation': patch +'@backstage/plugin-sonarqube-backend': patch +'@backstage/plugin-airbrake-backend': patch +'@backstage/plugin-devtools-backend': patch +'@backstage/plugin-linguist-backend': patch +'@backstage/plugin-periskop-backend': patch +'@backstage/plugin-playlist-backend': patch +'@backstage/plugin-apollo-explorer': patch +'@backstage/plugin-devtools-common': patch +'@backstage/plugin-entity-feedback': patch +'@backstage/plugin-explore-backend': patch +'@backstage/plugin-graphql-voyager': patch +'@backstage/plugin-jenkins-backend': patch +'@backstage/plugin-linguist-common': patch +'@backstage/plugin-playlist-common': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-apache-airflow': patch +'@backstage/plugin-bazaar-backend': patch +'@backstage/plugin-events-backend': patch +'@backstage/plugin-jenkins-common': patch +'@backstage/plugin-octopus-deploy': patch +'@backstage/plugin-search-backend': patch +'@backstage/plugin-stack-overflow': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-code-coverage': patch +'@backstage/plugin-config-schema': patch +'@backstage/plugin-github-issues': patch +'@backstage/plugin-nomad-backend': patch +'@backstage/plugin-tech-insights': patch +'@backstage/plugin-catalog-node': patch +'@backstage/plugin-code-climate': patch +'@backstage/plugin-events-node': patch +'@backstage/plugin-firehydrant': patch +'@backstage/cli-node': patch +'@backstage/plugin-auth-node': patch +'@backstage/plugin-codescene': patch +'@backstage/plugin-dynatrace': patch +'@backstage/plugin-gcalendar': patch +'@backstage/plugin-org-react': patch +'@backstage/plugin-shortcuts': patch +'@backstage/plugin-xcmetrics': patch +'@backstage/plugin-airbrake': patch +'@backstage/plugin-periskop': patch +'@backstage/plugin-playlist': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-allure': patch +'@backstage/plugin-bazaar': patch +'@backstage/plugin-ilert': patch +'@backstage/plugin-kafka': patch +'@backstage/plugin-nomad': patch +'@backstage/plugin-adr': patch +'@backstage/plugin-org': patch +--- + +Add package repository and homepage metadata From e66544d53a7d315e874bed051bb3b656daa29c5d Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 28 Jul 2023 15:37:01 +0200 Subject: [PATCH 058/440] Remove unneeded test Signed-off-by: Philipp Hugenroth --- .../src/CreateBackend.test.ts | 56 ------------------- 1 file changed, 56 deletions(-) diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 88e6bddd97..28276dbae1 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -84,60 +84,4 @@ describe('createBackend', () => { }), ).toThrow('The core.pluginMetadata service cannot be overridden'); }); - - it('should prioritize services correctly', async () => { - const backend = createBackend({ - services: [ - createServiceFactory({ - service: coreServices.rootHttpRouter, - deps: {}, - async factory() { - return { - use() {}, - }; - }, - }), - mockServices.config.factory({ - data: { root: 'root-backend' }, - }), - createServiceFactory({ - service: fooServiceRef, - deps: {}, - async factory() { - return 'foo-backend'; - }, - }), - createServiceFactory({ - service: barServiceRef, - deps: {}, - async factory() { - return 'bar-backend'; - }, - }), - ], - }); - - expect.assertions(3); - backend.add( - createBackendPlugin({ - pluginId: 'test', - register(reg) { - reg.registerInit({ - deps: { - config: coreServices.config, - foo: fooServiceRef, - bar: barServiceRef, - }, - async init({ config, foo, bar }) { - expect(config.get('root')).toBe('root-backend'); - expect(foo).toBe('foo-backend'); - expect(bar).toBe('bar-backend'); - }, - }); - }, - })(), - ); - - await backend.start(); - }); }); From 041e02e2ba8d66b6900b6e7b75528f56c825c7b3 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 28 Jul 2023 15:40:52 +0200 Subject: [PATCH 059/440] Remove unused imports & vars Signed-off-by: Philipp Hugenroth --- packages/backend-defaults/src/CreateBackend.test.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/backend-defaults/src/CreateBackend.test.ts b/packages/backend-defaults/src/CreateBackend.test.ts index 28276dbae1..de04d4e350 100644 --- a/packages/backend-defaults/src/CreateBackend.test.ts +++ b/packages/backend-defaults/src/CreateBackend.test.ts @@ -16,15 +16,9 @@ import { coreServices, - createBackendPlugin, createServiceFactory, - createServiceRef, } from '@backstage/backend-plugin-api'; import { createBackend } from './CreateBackend'; -import { mockServices } from '@backstage/backend-test-utils'; - -const fooServiceRef = createServiceRef({ id: 'foo', scope: 'root' }); -const barServiceRef = createServiceRef({ id: 'bar', scope: 'root' }); describe('createBackend', () => { it('should not throw when overriding a default service implementation', () => { From 80f78e85b7653ab52990866cc779c37f437265fc Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 28 Jul 2023 15:42:54 +0200 Subject: [PATCH 060/440] Change changeset to indicate breaking change Signed-off-by: Philipp Hugenroth --- .changeset/rich-zoos-occur.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/rich-zoos-occur.md b/.changeset/rich-zoos-occur.md index 65d21710d1..979acb93c6 100644 --- a/.changeset/rich-zoos-occur.md +++ b/.changeset/rich-zoos-occur.md @@ -3,4 +3,4 @@ '@backstage/backend-defaults': minor --- -Removing shared environments concept from the new experimental backend system. +**BREAKING**: Removing shared environments concept from the new experimental backend system. From 2f185958599854e64f7591e0c1d3bb4471e1bb2e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 28 Jul 2023 15:53:27 +0200 Subject: [PATCH 061/440] config-loader: throw error rather than silently ignore invalid config Signed-off-by: Patrik Oldsberg --- .changeset/dirty-chefs-listen.md | 7 +++++ packages/config-loader/src/schema/collect.ts | 29 ++++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 .changeset/dirty-chefs-listen.md diff --git a/.changeset/dirty-chefs-listen.md b/.changeset/dirty-chefs-listen.md new file mode 100644 index 0000000000..84b684b977 --- /dev/null +++ b/.changeset/dirty-chefs-listen.md @@ -0,0 +1,7 @@ +--- +'@backstage/config-loader': minor +--- + +Loading invalid TypeScript configuration schemas will now throw an error rather than silently being ignored. + +In particular this includes defining any additional types other than `Config` in the schema file, or use of unsupported types such as `Record` or `Partial`. diff --git a/packages/config-loader/src/schema/collect.ts b/packages/config-loader/src/schema/collect.ts index ac3e4af341..6c9737f7b7 100644 --- a/packages/config-loader/src/schema/collect.ts +++ b/packages/config-loader/src/schema/collect.ts @@ -15,6 +15,7 @@ */ import fs from 'fs-extra'; +import { EOL } from 'os'; import { resolve as resolvePath, relative as relativePath, @@ -163,7 +164,7 @@ async function compileTsSchemas(paths: string[]) { // Lazy loaded, because this brings up all of TypeScript and we don't // want that eagerly loaded in tests - const { getProgramFromFiles, generateSchema } = await import( + const { getProgramFromFiles, buildGenerator } = await import( 'typescript-json-schema' ); @@ -183,17 +184,35 @@ async function compileTsSchemas(paths: string[]) { const tsSchemas = paths.map(path => { let value; try { - value = generateSchema( + const generator = buildGenerator( program, - // All schemas should export a `Config` symbol - 'Config', // This enables the use of these tags in TSDoc comments { required: true, validationKeywords: ['visibility', 'deepVisibility', 'deprecated'], }, [path.split(sep).join('/')], // Unix paths are expected for all OSes here - ) as JsonObject | null; + ); + + const userSymbols = new Set(generator?.getUserSymbols()); + userSymbols.delete('Config'); + if (userSymbols.size !== 0) { + const names = Array.from(userSymbols).join("', '"); + throw new Error( + `Invalid configuration schema in ${path}, additional symbol definitions are not allowed, found '${names}'`, + ); + } + + // All schemas should export a `Config` symbol + value = generator?.getSchemaForSymbol('Config') as JsonObject | null; + + const reffedDefs = Object.keys(generator?.ReffedDefinitions ?? {}); + if (reffedDefs.length !== 0) { + const lines = reffedDefs.join(`${EOL} `); + throw new Error( + `Invalid configuration schema in ${path}, the following definitions are not supported:${EOL}${EOL} ${lines}`, + ); + } } catch (error) { assertError(error); if (error.message !== 'type Config not found') { From 7245b3e17e6de62177ecd17f7931f5dd950c5e07 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 28 Jul 2023 16:05:56 +0200 Subject: [PATCH 062/440] removed usage of Record and top-level types from configuration schemas Signed-off-by: Patrik Oldsberg --- .../catalog-backend-module-aws/config.d.ts | 9 ++- .../catalog-backend-module-azure/config.d.ts | 60 +++++++++---------- .../config.d.ts | 9 ++- .../config.d.ts | 9 ++- .../catalog-backend-module-gerrit/config.d.ts | 9 ++- .../catalog-backend-module-github/config.d.ts | 9 ++- .../catalog-backend-module-gitlab/config.d.ts | 9 ++- .../config.d.ts | 9 ++- .../config.d.ts | 9 ++- .../events-backend-module-aws-sqs/config.d.ts | 9 ++- 10 files changed, 66 insertions(+), 75 deletions(-) diff --git a/plugins/catalog-backend-module-aws/config.d.ts b/plugins/catalog-backend-module-aws/config.d.ts index b3610ccfc5..f3f80fc7db 100644 --- a/plugins/catalog-backend-module-aws/config.d.ts +++ b/plugins/catalog-backend-module-aws/config.d.ts @@ -59,9 +59,8 @@ export interface Config { */ schedule?: TaskScheduleDefinitionConfig; } - | Record< - string, - { + | { + [name: string]: { /** * (Required) AWS S3 Bucket Name */ @@ -81,8 +80,8 @@ export interface Config { * (Optional) TaskScheduleDefinition for the refresh. */ schedule?: TaskScheduleDefinitionConfig; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-azure/config.d.ts b/plugins/catalog-backend-module-azure/config.d.ts index 940695c8ea..757ed2bfd3 100644 --- a/plugins/catalog-backend-module-azure/config.d.ts +++ b/plugins/catalog-backend-module-azure/config.d.ts @@ -16,35 +16,6 @@ import { TaskScheduleDefinitionConfig } from '@backstage/backend-tasks'; -interface AzureDevOpsConfig { - /** - * (Optional) The DevOps host; leave empty for `dev.azure.com`, otherwise set to your self-hosted instance host. - */ - host: string; - /** - * (Required) Your organization slug. - */ - organization: string; - /** - * (Required) Your project slug. - */ - project: string; - /** - * (Optional) The repository name. Wildcards are supported as show on the examples above. - * If not set, all repositories will be searched. - */ - repository?: string; - /** - * (Optional) Where to find catalog-info.yaml files. Wildcards are supported. - * If not set, defaults to /catalog-info.yaml. - */ - path?: string; - /** - * (Optional) TaskScheduleDefinition for the refresh. - */ - schedule?: TaskScheduleDefinitionConfig; -} - export interface Config { catalog?: { /** @@ -54,7 +25,36 @@ export interface Config { /** * AzureDevopsEntityProvider configuration */ - azureDevOps?: Record; + azureDevOps?: { + [name: string]: { + /** + * (Optional) The DevOps host; leave empty for `dev.azure.com`, otherwise set to your self-hosted instance host. + */ + host: string; + /** + * (Required) Your organization slug. + */ + organization: string; + /** + * (Required) Your project slug. + */ + project: string; + /** + * (Optional) The repository name. Wildcards are supported as show on the examples above. + * If not set, all repositories will be searched. + */ + repository?: string; + /** + * (Optional) Where to find catalog-info.yaml files. Wildcards are supported. + * If not set, defaults to /catalog-info.yaml. + */ + path?: string; + /** + * (Optional) TaskScheduleDefinition for the refresh. + */ + schedule?: TaskScheduleDefinitionConfig; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts b/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts index 8fa58413c0..9e97597724 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts @@ -60,9 +60,8 @@ export interface Config { */ schedule?: TaskScheduleDefinitionConfig; } - | Record< - string, - { + | { + [name: string]: { /** * (Optional) Path to the catalog file. Default to "/catalog-info.yaml". * @visibility frontend @@ -93,8 +92,8 @@ export interface Config { * (Optional) TaskScheduleDefinition for the discovery. */ schedule?: TaskScheduleDefinitionConfig; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-bitbucket-server/config.d.ts b/plugins/catalog-backend-module-bitbucket-server/config.d.ts index 67f694d419..0554d62df3 100644 --- a/plugins/catalog-backend-module-bitbucket-server/config.d.ts +++ b/plugins/catalog-backend-module-bitbucket-server/config.d.ts @@ -52,9 +52,8 @@ export interface Config { */ schedule?: TaskScheduleDefinitionConfig; } - | Record< - string, - { + | { + [name: string]: { /** * (Optional) Path to the catalog file. Default to "/catalog-info.yaml". * @visibility frontend @@ -80,8 +79,8 @@ export interface Config { * (Optional) TaskScheduleDefinition for the refresh. */ schedule?: TaskScheduleDefinitionConfig; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-gerrit/config.d.ts b/plugins/catalog-backend-module-gerrit/config.d.ts index d8b48d2967..a246662b0a 100644 --- a/plugins/catalog-backend-module-gerrit/config.d.ts +++ b/plugins/catalog-backend-module-gerrit/config.d.ts @@ -25,9 +25,8 @@ export interface Config { * * Maps provider id with configuration. */ - gerrit?: Record< - string, - { + gerrit?: { + [name: string]: { /** * (Required) The host of the Gerrit integration to use. */ @@ -42,8 +41,8 @@ export interface Config { * The branch where the provider will try to find entities. Defaults to "master". */ branch?: string; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-github/config.d.ts b/plugins/catalog-backend-module-github/config.d.ts index 5a699e745f..9755504ee2 100644 --- a/plugins/catalog-backend-module-github/config.d.ts +++ b/plugins/catalog-backend-module-github/config.d.ts @@ -118,9 +118,8 @@ export interface Config { */ schedule?: TaskScheduleDefinitionConfig; } - | Record< - string, - { + | { + [name: string]: { /** * (Optional) The hostname of your GitHub Enterprise instance. * Default: `github.com`. @@ -182,8 +181,8 @@ export interface Config { * (Optional) TaskScheduleDefinition for the refresh. */ schedule?: TaskScheduleDefinitionConfig; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts index f5afc71093..e9732c0642 100644 --- a/plugins/catalog-backend-module-gitlab/config.d.ts +++ b/plugins/catalog-backend-module-gitlab/config.d.ts @@ -22,9 +22,8 @@ export interface Config { /** * GitlabDiscoveryEntityProvider configuration */ - gitlab?: Record< - string, - { + gitlab?: { + [name: string]: { /** * (Required) Gitlab's host name. */ @@ -64,8 +63,8 @@ export interface Config { * (Optional) Skip forked repository */ skipForkedRepos?: boolean; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-msgraph/config.d.ts b/plugins/catalog-backend-module-msgraph/config.d.ts index 904ce1f646..9d341215cd 100644 --- a/plugins/catalog-backend-module-msgraph/config.d.ts +++ b/plugins/catalog-backend-module-msgraph/config.d.ts @@ -209,9 +209,8 @@ export interface Config { */ schedule?: TaskScheduleDefinitionConfig; } - | Record< - string, - { + | { + [name: string]: { /** * The prefix of the target that this matches on, e.g. * "https://graph.microsoft.com/v1.0", with no trailing slash. @@ -296,8 +295,8 @@ export interface Config { * (Optional) TaskScheduleDefinition for the refresh. */ schedule?: TaskScheduleDefinitionConfig; - } - >; + }; + }; }; }; } diff --git a/plugins/catalog-backend-module-puppetdb/config.d.ts b/plugins/catalog-backend-module-puppetdb/config.d.ts index edd7ab3889..8aab239047 100644 --- a/plugins/catalog-backend-module-puppetdb/config.d.ts +++ b/plugins/catalog-backend-module-puppetdb/config.d.ts @@ -46,9 +46,8 @@ export interface Config { */ schedule?: TaskScheduleDefinition; } - | Record< - string, - { + | { + [name: string]: { /** * (Required) The base URL of PuppetDB API instance. */ @@ -61,8 +60,8 @@ export interface Config { * (Optional) Task schedule definition for the refresh. */ schedule?: TaskScheduleDefinition; - } - >; + }; + }; }; }; } diff --git a/plugins/events-backend-module-aws-sqs/config.d.ts b/plugins/events-backend-module-aws-sqs/config.d.ts index dfef35bf22..c2edfeae8e 100644 --- a/plugins/events-backend-module-aws-sqs/config.d.ts +++ b/plugins/events-backend-module-aws-sqs/config.d.ts @@ -31,9 +31,8 @@ export interface Config { * Contains a record per topic for which an AWS SQS queue * should be used as source of events. */ - topics: Record< - string, - { + topics: { + [name: string]: { /** * (Required) Queue-related configuration. */ @@ -69,8 +68,8 @@ export interface Config { * Default: 1 minute. */ waitTimeAfterEmptyReceive: HumanDuration; - } - >; + }; + }; }; }; }; From 8f7b618a490c3f8c067192336e4346c4572c1418 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 28 Jul 2023 16:06:18 +0200 Subject: [PATCH 063/440] removed usage of Partial in configuration schemas Signed-off-by: Patrik Oldsberg --- packages/backend-common/config.d.ts | 6 +++--- plugins/jenkins-backend/config.d.ts | 10 +++++----- plugins/proxy-backend/config.d.ts | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 3fd886874e..e5b193c543 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -77,17 +77,17 @@ export interface Config { */ connection: | string - | Partial<{ + | { /** * Password that belongs to the client User * @visibility secret */ - password: string; + password?: string; /** * Other connection settings */ [key: string]: unknown; - }>; + }; /** Database name prefix override */ prefix?: string; /** diff --git a/plugins/jenkins-backend/config.d.ts b/plugins/jenkins-backend/config.d.ts index 5b725dd801..1773ea7e75 100644 --- a/plugins/jenkins-backend/config.d.ts +++ b/plugins/jenkins-backend/config.d.ts @@ -42,13 +42,13 @@ export interface Config { username: string; /** @visibility secret */ apiKey: string; - extraRequestHeaders?: Partial<{ + extraRequestHeaders?: { /** @visibility secret */ - Authorization: string; + Authorization?: string; /** @visibility secret */ - authorization: string; - [key: string]: string; - }>; + authorization?: string; + [key: string]: string | undefined; + }; }[]; }; } diff --git a/plugins/proxy-backend/config.d.ts b/plugins/proxy-backend/config.d.ts index 410ff86a2e..bc9cf7765a 100644 --- a/plugins/proxy-backend/config.d.ts +++ b/plugins/proxy-backend/config.d.ts @@ -31,17 +31,17 @@ export interface Config { /** * Object with extra headers to be added to target requests. */ - headers?: Partial<{ + headers?: { /** @visibility secret */ - Authorization: string; + Authorization?: string; /** @visibility secret */ - authorization: string; + authorization?: string; /** @visibility secret */ - 'X-Api-Key': string; + 'X-Api-Key'?: string; /** @visibility secret */ - 'x-api-key': string; - [key: string]: string; - }>; + 'x-api-key'?: string; + [key: string]: string | undefined; + }; /** * Changes the origin of the host header to the target URL. Default: true. */ From 787e747d11fd95e1d2d975e6fe0371f863886d24 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 28 Jul 2023 16:06:36 +0200 Subject: [PATCH 064/440] removed usage of RegExp in configuration schemas Signed-off-by: Patrik Oldsberg --- .../config.d.ts | 16 ++++++++-------- .../config.d.ts | 16 ++++++++-------- .../catalog-backend-module-gitlab/config.d.ts | 6 +++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts b/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts index 9e97597724..fa7c070042 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/config.d.ts @@ -45,15 +45,15 @@ export interface Config { */ filters?: { /** - * (Optional) Filter for the repository slug. + * (Optional) Regular expression filter for the repository slug. * @visibility frontend */ - repoSlug?: RegExp; + repoSlug?: string; /** - * (Optional) Filter for the project key. + * (Optional) Regular expression filter for the project key. * @visibility frontend */ - projectKey?: RegExp; + projectKey?: string; }; /** * (Optional) TaskScheduleDefinition for the discovery. @@ -78,15 +78,15 @@ export interface Config { */ filters?: { /** - * (Optional) Filter for the repository slug. + * (Optional) Regular expression filter for the repository slug. * @visibility frontend */ - repoSlug?: RegExp; + repoSlug?: string; /** - * (Optional) Filter for the project key. + * (Optional) Regular expression filter for the project key. * @visibility frontend */ - projectKey?: RegExp; + projectKey?: string; }; /** * (Optional) TaskScheduleDefinition for the discovery. diff --git a/plugins/catalog-backend-module-bitbucket-server/config.d.ts b/plugins/catalog-backend-module-bitbucket-server/config.d.ts index 0554d62df3..57a94550e9 100644 --- a/plugins/catalog-backend-module-bitbucket-server/config.d.ts +++ b/plugins/catalog-backend-module-bitbucket-server/config.d.ts @@ -37,15 +37,15 @@ export interface Config { */ filters?: { /** - * (Optional) Filter for the repository slug. + * (Optional) Regular expression filter for the repository slug. * @visibility frontend */ - repoSlug?: RegExp; + repoSlug?: string; /** - * (Optional) Filter for the project key. + * (Optional) Regular expression filter for the project key. * @visibility frontend */ - projectKey?: RegExp; + projectKey?: string; }; /** * (Optional) TaskScheduleDefinition for the refresh. @@ -65,15 +65,15 @@ export interface Config { */ filters?: { /** - * (Optional) Filter for the repository slug. + * (Optional) Regular expression filter for the repository slug. * @visibility frontend */ - repoSlug?: RegExp; + repoSlug?: string; /** - * (Optional) Filter for the project key. + * (Optional) Regular expression filter for the project key. * @visibility frontend */ - projectKey?: RegExp; + projectKey?: string; }; /** * (Optional) TaskScheduleDefinition for the refresh. diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts index e9732c0642..7d183b6e58 100644 --- a/plugins/catalog-backend-module-gitlab/config.d.ts +++ b/plugins/catalog-backend-module-gitlab/config.d.ts @@ -50,15 +50,15 @@ export interface Config { /** * (Optional) RegExp for the Project Name Pattern */ - projectPattern?: RegExp; + projectPattern?: string; /** * (Optional) RegExp for the User Name Pattern */ - userPattern?: RegExp; + userPattern?: string; /** * (Optional) RegExp for the Group Name Pattern */ - groupPattern?: RegExp; + groupPattern?: string; /** * (Optional) Skip forked repository */ From 4b82382ed8c24f7e7fed5c049ca140607fbdb10c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 28 Jul 2023 16:08:04 +0200 Subject: [PATCH 065/440] added changeset for fixed configuration schemas Signed-off-by: Patrik Oldsberg --- .changeset/neat-coins-raise.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .changeset/neat-coins-raise.md diff --git a/.changeset/neat-coins-raise.md b/.changeset/neat-coins-raise.md new file mode 100644 index 0000000000..c3045634bf --- /dev/null +++ b/.changeset/neat-coins-raise.md @@ -0,0 +1,17 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-events-backend-module-aws-sqs': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/backend-common': patch +'@backstage/plugin-jenkins-backend': patch +'@backstage/plugin-proxy-backend': patch +--- + +Fixed invalid configuration schema. The configuration schema may be more strict as a result. From 7fc676a876aca92ee9b5e082597db3294178a9dd Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 28 Jul 2023 16:18:24 +0200 Subject: [PATCH 066/440] config-loader: bit more explanation around why we reject invalid schema Signed-off-by: Patrik Oldsberg --- packages/config-loader/src/schema/collect.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/config-loader/src/schema/collect.ts b/packages/config-loader/src/schema/collect.ts index 6c9737f7b7..7120c12d90 100644 --- a/packages/config-loader/src/schema/collect.ts +++ b/packages/config-loader/src/schema/collect.ts @@ -194,6 +194,12 @@ async function compileTsSchemas(paths: string[]) { [path.split(sep).join('/')], // Unix paths are expected for all OSes here ); + // All schemas should export a `Config` symbol + value = generator?.getSchemaForSymbol('Config') as JsonObject | null; + + // This makes sure that no additional symbols are defined in the schema. We don't allow + // this because they share a global namespace and will be merged together, leading to + // unpredictable behavior. const userSymbols = new Set(generator?.getUserSymbols()); userSymbols.delete('Config'); if (userSymbols.size !== 0) { @@ -203,9 +209,8 @@ async function compileTsSchemas(paths: string[]) { ); } - // All schemas should export a `Config` symbol - value = generator?.getSchemaForSymbol('Config') as JsonObject | null; - + // This makes sure that no unsupported types are used in the schema, for example `Record<,>`. + // The generator will extract these as a schema reference, which will in turn be broken for our usage. const reffedDefs = Object.keys(generator?.ReffedDefinitions ?? {}); if (reffedDefs.length !== 0) { const lines = reffedDefs.join(`${EOL} `); From 33526cdb9e2ea026eb46103b6d0cbfe995cc3533 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 28 Jul 2023 20:11:22 +0530 Subject: [PATCH 067/440] Limit the use of the same shortcut name when adding a shortcut- error message changed Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index f8a53620ee..f5c5152ff7 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -69,7 +69,7 @@ export const ShortcutForm = ({ const titleIsUnique = async (title: string) => { if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) - return 'This title name is already exist'; + return 'A shortcut with this title already exists'; return true; }; From d2be7f636653341a1ef3e287834e560cd4befb1c Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 28 Jul 2023 20:13:09 +0530 Subject: [PATCH 068/440] Limit the use of the same shortcut name when adding a shortcut- error message changed Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 0e878c1fa4..511c1842c3 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -41,7 +41,7 @@ describe('ShortcutForm', () => { screen.getByText('Must be at least 2 characters'), ).toBeInTheDocument(); expect( - screen.getByText('This title name is already exist'), + screen.getByText('A shortcut with this title already exists'), ).toBeInTheDocument(); }); }); From adff62590f5c4feec2cfad68dbcafc8d6c6241fe Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 28 Jul 2023 20:34:22 +0530 Subject: [PATCH 069/440] Limit the use of the same shortcut name when adding a shortcut- test file changes Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.test.tsx | 5 ++++- plugins/shortcuts/src/EditShortcut.test.tsx | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.test.tsx b/plugins/shortcuts/src/AddShortcut.test.tsx index f8786e2b24..10ed59503b 100644 --- a/plugins/shortcuts/src/AddShortcut.test.tsx +++ b/plugins/shortcuts/src/AddShortcut.test.tsx @@ -26,6 +26,7 @@ import { import { AlertDisplay } from '@backstage/core-components'; import { TestApiProvider } from '@backstage/test-utils'; import { analyticsApiRef } from '@backstage/core-plugin-api'; +import { shortcutsApiRef } from './api'; describe('AddShortcut', () => { const api = new DefaultShortcutsApi(MockStorageApi.create()); @@ -78,7 +79,9 @@ describe('AddShortcut', () => { const spy = jest.spyOn(api, 'add'); await renderInTestApp( - + , ); diff --git a/plugins/shortcuts/src/EditShortcut.test.tsx b/plugins/shortcuts/src/EditShortcut.test.tsx index 72a89c13b6..618e3c784d 100644 --- a/plugins/shortcuts/src/EditShortcut.test.tsx +++ b/plugins/shortcuts/src/EditShortcut.test.tsx @@ -27,6 +27,7 @@ import { } from '@backstage/test-utils'; import { AlertDisplay } from '@backstage/core-components'; import { analyticsApiRef } from '@backstage/core-plugin-api'; +import { shortcutsApiRef } from './api'; describe('EditShortcut', () => { const shortcut: Shortcut = { @@ -86,7 +87,9 @@ describe('EditShortcut', () => { const spy = jest.spyOn(api, 'update'); await renderInTestApp( - + , ); From 831c28e3fcd1a2c8ad66c8b4c1d87a85df16cb69 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 28 Jul 2023 20:52:29 +0530 Subject: [PATCH 070/440] Limit the use of the same shortcut name when adding a shortcut- test file changes added Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.test.tsx | 7 +++++-- plugins/shortcuts/src/EditShortcut.test.tsx | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.test.tsx b/plugins/shortcuts/src/AddShortcut.test.tsx index 10ed59503b..1fcbacb8e6 100644 --- a/plugins/shortcuts/src/AddShortcut.test.tsx +++ b/plugins/shortcuts/src/AddShortcut.test.tsx @@ -26,7 +26,7 @@ import { import { AlertDisplay } from '@backstage/core-components'; import { TestApiProvider } from '@backstage/test-utils'; import { analyticsApiRef } from '@backstage/core-plugin-api'; -import { shortcutsApiRef } from './api'; +import { shortcutsApiRef, shortcutApi } from './api'; describe('AddShortcut', () => { const api = new DefaultShortcutsApi(MockStorageApi.create()); @@ -80,7 +80,10 @@ describe('AddShortcut', () => { await renderInTestApp( , diff --git a/plugins/shortcuts/src/EditShortcut.test.tsx b/plugins/shortcuts/src/EditShortcut.test.tsx index 618e3c784d..fcd20951dc 100644 --- a/plugins/shortcuts/src/EditShortcut.test.tsx +++ b/plugins/shortcuts/src/EditShortcut.test.tsx @@ -27,7 +27,7 @@ import { } from '@backstage/test-utils'; import { AlertDisplay } from '@backstage/core-components'; import { analyticsApiRef } from '@backstage/core-plugin-api'; -import { shortcutsApiRef } from './api'; +import { shortcutsApiRef, shortcutApi } from './api'; describe('EditShortcut', () => { const shortcut: Shortcut = { @@ -88,7 +88,10 @@ describe('EditShortcut', () => { await renderInTestApp( , From caaa5c8a558e975cf70f8b3152f653dc6f222db1 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 28 Jul 2023 21:05:57 +0530 Subject: [PATCH 071/440] Limit the use of the same shortcut name when adding a shortcut- test file changes removed Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.test.tsx | 8 +------- plugins/shortcuts/src/EditShortcut.test.tsx | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.test.tsx b/plugins/shortcuts/src/AddShortcut.test.tsx index 1fcbacb8e6..f8786e2b24 100644 --- a/plugins/shortcuts/src/AddShortcut.test.tsx +++ b/plugins/shortcuts/src/AddShortcut.test.tsx @@ -26,7 +26,6 @@ import { import { AlertDisplay } from '@backstage/core-components'; import { TestApiProvider } from '@backstage/test-utils'; import { analyticsApiRef } from '@backstage/core-plugin-api'; -import { shortcutsApiRef, shortcutApi } from './api'; describe('AddShortcut', () => { const api = new DefaultShortcutsApi(MockStorageApi.create()); @@ -79,12 +78,7 @@ describe('AddShortcut', () => { const spy = jest.spyOn(api, 'add'); await renderInTestApp( - + , ); diff --git a/plugins/shortcuts/src/EditShortcut.test.tsx b/plugins/shortcuts/src/EditShortcut.test.tsx index fcd20951dc..72a89c13b6 100644 --- a/plugins/shortcuts/src/EditShortcut.test.tsx +++ b/plugins/shortcuts/src/EditShortcut.test.tsx @@ -27,7 +27,6 @@ import { } from '@backstage/test-utils'; import { AlertDisplay } from '@backstage/core-components'; import { analyticsApiRef } from '@backstage/core-plugin-api'; -import { shortcutsApiRef, shortcutApi } from './api'; describe('EditShortcut', () => { const shortcut: Shortcut = { @@ -87,12 +86,7 @@ describe('EditShortcut', () => { const spy = jest.spyOn(api, 'update'); await renderInTestApp( - + , ); From bb79b1f85220d29d54c1ca6e3a5b116cda0a1431 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 16:13:47 +0000 Subject: [PATCH 072/440] chore(deps): update dependency @types/dagre to v0.7.49 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 eec689ba6a..e53ad8a96f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16863,9 +16863,9 @@ __metadata: linkType: hard "@types/dagre@npm:^0.7.44": - version: 0.7.48 - resolution: "@types/dagre@npm:0.7.48" - checksum: 9d06fc08219056db7c55041bf2099cea24fe824d8c8741ae11c365c7464502d8c65273153446a5546b4a92bc0833802ac1c6bddb708bfcaa75af3963e7fc84aa + version: 0.7.49 + resolution: "@types/dagre@npm:0.7.49" + checksum: cb27683074f8c89c073d0b7b549692b67ddae7225a2b6f9586d75c11598f7bd32d9246ecb184017a55592e7daaf63e4d33dcbc56ca4c3999cf34352460ddf772 languageName: node linkType: hard From f21842db06dc723f11bb3fe1bb9fa68ad5e17452 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 16:51:57 +0000 Subject: [PATCH 073/440] chore(deps): update dependency @types/lodash to v4.14.196 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 eec689ba6a..8056ee0919 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17379,9 +17379,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.151, @types/lodash@npm:^4.14.173, @types/lodash@npm:^4.14.175": - version: 4.14.195 - resolution: "@types/lodash@npm:4.14.195" - checksum: 39b75ca635b3fa943d17d3d3aabc750babe4c8212485a4df166fe0516e39288e14b0c60afc6e21913cc0e5a84734633c71e617e2bd14eaa1cf51b8d7799c432e + version: 4.14.196 + resolution: "@types/lodash@npm:4.14.196" + checksum: 201d17c3e62ae02a93c99ec78e024b2be9bd75564dd8fd8c26f6ac51a985ab280d28ce2688c3bcdfe785b0991cd9814edff19ee000234c7b45d9a697f09feb6a languageName: node linkType: hard From 83c5750b3486eda7ced778167e8d3a95bbd56544 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 17:10:06 +0000 Subject: [PATCH 074/440] chore(deps): update dependency @types/node to v20.4.5 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 e53ad8a96f..852e42bfcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17538,9 +17538,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 20.4.4 - resolution: "@types/node@npm:20.4.4" - checksum: 43f3c4a8acc38ae753e15a0e79bae0447d255b3742fa87f8e065d7b9d20ecb0e03d6c5b46c00d5d26f4552160381a00255f49205595a8ee48c2423e00263c930 + version: 20.4.5 + resolution: "@types/node@npm:20.4.5" + checksum: 36a0304a8dc346a1b2d2edac4c4633eecf70875793d61a5274d0df052d7a7af7a8e34f29884eac4fbd094c4f0201477dcb39c0ecd3307ca141688806538d1138 languageName: node linkType: hard @@ -17580,9 +17580,9 @@ __metadata: linkType: hard "@types/node@npm:^18.11.17": - version: 18.17.0 - resolution: "@types/node@npm:18.17.0" - checksum: 3a43c5c5541342751b514485144818a515fac5427f663066068eaacbe8a108cbe1207aae75ec89d34c3b32414c334aad84e9083cf7fcf3ebfd970adc871314a4 + version: 18.17.1 + resolution: "@types/node@npm:18.17.1" + checksum: 56201bda9a2d05d68602df63b4e67b0545ac8c6d0280bd5fb31701350a978a577a027501fbf49db99bf177f2242ebd1244896bfd35e89042d5bd7dfebff28d4e languageName: node linkType: hard From 223ff654f4186754874b2dcd84b77ec3f338a527 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 17:10:58 +0000 Subject: [PATCH 075/440] chore(deps): update dependency @types/node-forge to v1.3.4 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 e53ad8a96f..b86d5320cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17529,11 +17529,11 @@ __metadata: linkType: hard "@types/node-forge@npm:^1.3.0": - version: 1.3.3 - resolution: "@types/node-forge@npm:1.3.3" + version: 1.3.4 + resolution: "@types/node-forge@npm:1.3.4" dependencies: "@types/node": "*" - checksum: 36e3b597517ad9007822b0a0c4d44a8bcbdc4e8d8c388839d17bfeb8ff005efc1f8d3e997a1921bc54edf530000675d555f3ccb9aac8ab273285a8677a9dcb0b + checksum: c3c53ee5039a10d724bfc64fe859106baf0e39c4cac90a5d0ddd3480bf044de6ce145f104d4fa0184c365dff59df7ab4b754172c9d87800f751d10ccd7dcd1ad languageName: node linkType: hard From 1e946076d461818b837f9d3aaf108ec1d33e2a77 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 18:08:10 +0000 Subject: [PATCH 076/440] chore(deps): update dependency @types/testing-library__jest-dom to v5.14.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 907c31e02b..e89e43f4a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18217,11 +18217,11 @@ __metadata: linkType: hard "@types/testing-library__jest-dom@npm:^5.9.1": - version: 5.14.8 - resolution: "@types/testing-library__jest-dom@npm:5.14.8" + version: 5.14.9 + resolution: "@types/testing-library__jest-dom@npm:5.14.9" dependencies: "@types/jest": "*" - checksum: 18f5ba7d0db8ebd91667b544537762ce63f11c4fd02b3d57afa92f9457a384d3ecf9bc7b50b6b445af1b3ea38b69862b4f95130720d4dd23621d598ac074d93a + checksum: d364494fc2545316292e88861146146af1e3818792ca63b62a63758b2f737669b687f4aaddfcfbcb7d0e1ed7890a9bd05de23ff97f277d5e68de574497a9ee72 languageName: node linkType: hard From afb6100e6e9b5cf0b4d2438d1d41e61d1e7bf449 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 18:08:56 +0000 Subject: [PATCH 077/440] chore(deps): update dependency esbuild to v0.18.17 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 182 +++++++++++++++++++++++++++--------------------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/yarn.lock b/yarn.lock index 907c31e02b..1cafd976df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10432,9 +10432,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/android-arm64@npm:0.18.16" +"@esbuild/android-arm64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/android-arm64@npm:0.18.17" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -10453,9 +10453,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/android-arm@npm:0.18.16" +"@esbuild/android-arm@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/android-arm@npm:0.18.17" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -10467,9 +10467,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/android-x64@npm:0.18.16" +"@esbuild/android-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/android-x64@npm:0.18.17" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -10481,9 +10481,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/darwin-arm64@npm:0.18.16" +"@esbuild/darwin-arm64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/darwin-arm64@npm:0.18.17" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -10495,9 +10495,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/darwin-x64@npm:0.18.16" +"@esbuild/darwin-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/darwin-x64@npm:0.18.17" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -10509,9 +10509,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/freebsd-arm64@npm:0.18.16" +"@esbuild/freebsd-arm64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/freebsd-arm64@npm:0.18.17" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -10523,9 +10523,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/freebsd-x64@npm:0.18.16" +"@esbuild/freebsd-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/freebsd-x64@npm:0.18.17" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -10537,9 +10537,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-arm64@npm:0.18.16" +"@esbuild/linux-arm64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-arm64@npm:0.18.17" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -10551,9 +10551,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-arm@npm:0.18.16" +"@esbuild/linux-arm@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-arm@npm:0.18.17" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -10565,9 +10565,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-ia32@npm:0.18.16" +"@esbuild/linux-ia32@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-ia32@npm:0.18.17" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -10586,9 +10586,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-loong64@npm:0.18.16" +"@esbuild/linux-loong64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-loong64@npm:0.18.17" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -10600,9 +10600,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-mips64el@npm:0.18.16" +"@esbuild/linux-mips64el@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-mips64el@npm:0.18.17" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -10614,9 +10614,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-ppc64@npm:0.18.16" +"@esbuild/linux-ppc64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-ppc64@npm:0.18.17" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -10628,9 +10628,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-riscv64@npm:0.18.16" +"@esbuild/linux-riscv64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-riscv64@npm:0.18.17" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -10642,9 +10642,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-s390x@npm:0.18.16" +"@esbuild/linux-s390x@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-s390x@npm:0.18.17" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -10656,9 +10656,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/linux-x64@npm:0.18.16" +"@esbuild/linux-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/linux-x64@npm:0.18.17" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -10670,9 +10670,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/netbsd-x64@npm:0.18.16" +"@esbuild/netbsd-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/netbsd-x64@npm:0.18.17" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -10684,9 +10684,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/openbsd-x64@npm:0.18.16" +"@esbuild/openbsd-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/openbsd-x64@npm:0.18.17" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -10698,9 +10698,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/sunos-x64@npm:0.18.16" +"@esbuild/sunos-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/sunos-x64@npm:0.18.17" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -10712,9 +10712,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/win32-arm64@npm:0.18.16" +"@esbuild/win32-arm64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/win32-arm64@npm:0.18.17" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -10726,9 +10726,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/win32-ia32@npm:0.18.16" +"@esbuild/win32-ia32@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/win32-ia32@npm:0.18.17" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -10740,9 +10740,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.18.16": - version: 0.18.16 - resolution: "@esbuild/win32-x64@npm:0.18.16" +"@esbuild/win32-x64@npm:0.18.17": + version: 0.18.17 + resolution: "@esbuild/win32-x64@npm:0.18.17" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -24327,31 +24327,31 @@ __metadata: linkType: hard "esbuild@npm:^0.18.0": - version: 0.18.16 - resolution: "esbuild@npm:0.18.16" + version: 0.18.17 + resolution: "esbuild@npm:0.18.17" dependencies: - "@esbuild/android-arm": 0.18.16 - "@esbuild/android-arm64": 0.18.16 - "@esbuild/android-x64": 0.18.16 - "@esbuild/darwin-arm64": 0.18.16 - "@esbuild/darwin-x64": 0.18.16 - "@esbuild/freebsd-arm64": 0.18.16 - "@esbuild/freebsd-x64": 0.18.16 - "@esbuild/linux-arm": 0.18.16 - "@esbuild/linux-arm64": 0.18.16 - "@esbuild/linux-ia32": 0.18.16 - "@esbuild/linux-loong64": 0.18.16 - "@esbuild/linux-mips64el": 0.18.16 - "@esbuild/linux-ppc64": 0.18.16 - "@esbuild/linux-riscv64": 0.18.16 - "@esbuild/linux-s390x": 0.18.16 - "@esbuild/linux-x64": 0.18.16 - "@esbuild/netbsd-x64": 0.18.16 - "@esbuild/openbsd-x64": 0.18.16 - "@esbuild/sunos-x64": 0.18.16 - "@esbuild/win32-arm64": 0.18.16 - "@esbuild/win32-ia32": 0.18.16 - "@esbuild/win32-x64": 0.18.16 + "@esbuild/android-arm": 0.18.17 + "@esbuild/android-arm64": 0.18.17 + "@esbuild/android-x64": 0.18.17 + "@esbuild/darwin-arm64": 0.18.17 + "@esbuild/darwin-x64": 0.18.17 + "@esbuild/freebsd-arm64": 0.18.17 + "@esbuild/freebsd-x64": 0.18.17 + "@esbuild/linux-arm": 0.18.17 + "@esbuild/linux-arm64": 0.18.17 + "@esbuild/linux-ia32": 0.18.17 + "@esbuild/linux-loong64": 0.18.17 + "@esbuild/linux-mips64el": 0.18.17 + "@esbuild/linux-ppc64": 0.18.17 + "@esbuild/linux-riscv64": 0.18.17 + "@esbuild/linux-s390x": 0.18.17 + "@esbuild/linux-x64": 0.18.17 + "@esbuild/netbsd-x64": 0.18.17 + "@esbuild/openbsd-x64": 0.18.17 + "@esbuild/sunos-x64": 0.18.17 + "@esbuild/win32-arm64": 0.18.17 + "@esbuild/win32-ia32": 0.18.17 + "@esbuild/win32-x64": 0.18.17 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -24399,7 +24399,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 8b04f7087d4e95cffd43c37663c57a9f42e183cd3d02fe3cefee7e1534a84d5cec181f42187715471b4b3f5478e2e110530df7d3a8b12053cbc8cc35145363ab + checksum: c6e1ffa776978a45697763a07ec9b16411db3d3b3997b2c4a0165a211727fce8b63b87165a28d8ef60d3a28b98197bbbc2833e51b89888a4437e0a483dffc8ff languageName: node linkType: hard From 7b95d42ac3045e7f11d0d47362829023293876f9 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Fri, 28 Jul 2023 13:15:02 -0500 Subject: [PATCH 078/440] Added alternatives to linguistResultMock Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- plugins/linguist-backend/src/api/LinguistBackendClient.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts b/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts index 1b0a4f4673..55c74df424 100644 --- a/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts +++ b/plugins/linguist-backend/src/api/LinguistBackendClient.test.ts @@ -38,6 +38,9 @@ const linguistResultMock = Promise.resolve({ '/readme.md': 'Markdown', '/no-lang': null, }, + alternatives: { + '~/alternatives.asc': ['AsciiDoc', 'Public Key'], + }, }, languages: { count: 3, From 789c6d9b901f2db65beb41e1a860457122e4c656 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 19:21:30 +0000 Subject: [PATCH 079/440] chore(deps): update dependency xml2js to v0.6.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 e89e43f4a9..70785fc251 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42711,12 +42711,12 @@ __metadata: linkType: hard "xml2js@npm:^0.6.0": - version: 0.6.0 - resolution: "xml2js@npm:0.6.0" + version: 0.6.2 + resolution: "xml2js@npm:0.6.2" dependencies: sax: ">=0.6.0" xmlbuilder: ~11.0.0 - checksum: 437f353fd66d367bf158e9555a0625df9965d944e499728a5c6bc92a54a2763179b144f14b7e1c725040f56bbd22b0fa6cfcb09ec4faf39c45ce01efe631f40b + checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2 languageName: node linkType: hard From 544ecda62faa112e75403addccb863a064012092 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 19:21:59 +0000 Subject: [PATCH 080/440] fix(deps): update dependency @roadiehq/backstage-plugin-travis-ci to v2.1.13 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index e89e43f4a9..fb4c774440 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9678,7 +9678,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@^0.4.0, @backstage/theme@^0.4.1, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.4.1, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -14410,14 +14410,14 @@ __metadata: linkType: hard "@roadiehq/backstage-plugin-travis-ci@npm:^2.0.5": - version: 2.1.12 - resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.12" + version: 2.1.13 + resolution: "@roadiehq/backstage-plugin-travis-ci@npm:2.1.13" dependencies: - "@backstage/catalog-model": ^1.4.0 - "@backstage/core-components": ^0.13.2 - "@backstage/core-plugin-api": ^1.5.2 - "@backstage/plugin-catalog-react": ^1.7.0 - "@backstage/theme": ^0.4.0 + "@backstage/catalog-model": ^1.4.1 + "@backstage/core-components": ^0.13.3 + "@backstage/core-plugin-api": ^1.5.3 + "@backstage/plugin-catalog-react": ^1.8.0 + "@backstage/theme": ^0.4.1 "@material-ui/core": ^4.11.3 "@material-ui/icons": ^4.11.2 "@material-ui/lab": 4.0.0-alpha.57 @@ -14431,7 +14431,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: e4e5b91323104ea7fe6608333960d92f7670fc1f6372c5942ca35cbaeb48f542dc7162f7e7a81f859a353124e6b94e0be776f43e690c8f9fa66f66986dca97f6 + checksum: c8ddeadcc5edec0b25276b65ddf7971943939eb2c82d363919c748b8a740ed53c2642bda6cb509d7fc8c02f002166abf8fc4cb7a2cfa83577e1139c5ba31841b languageName: node linkType: hard From 9dad4b0e61bd4b0e5080b8b5af8842977512cc21 Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Fri, 28 Jul 2023 14:52:35 -0500 Subject: [PATCH 081/440] Config validation clean up Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> --- .changeset/popular-fans-camp.md | 5 +++++ app-config.yaml | 8 ++++---- plugins/auth-backend/config.d.ts | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 .changeset/popular-fans-camp.md diff --git a/.changeset/popular-fans-camp.md b/.changeset/popular-fans-camp.md new file mode 100644 index 0000000000..47fc095ef8 --- /dev/null +++ b/.changeset/popular-fans-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Updated config schema to match what was being used in code diff --git a/app-config.yaml b/app-config.yaml index 2b562ee689..8dcd052e61 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -211,7 +211,7 @@ integrations: # clientEmail: 'example@example.com' # privateKey: ${GCS_PRIVATE_KEY} awsS3: - - host: amazonaws.com + - endpoint: ${AWS_S3_ENDPOINT} accessKeyId: ${AWS_ACCESS_KEY_ID} secretAccessKey: ${AWS_SECRET_ACCESS_KEY} @@ -352,8 +352,6 @@ auth: metadataUrl: ${AUTH_OIDC_METADATA_URL} clientId: ${AUTH_OIDC_CLIENT_ID} clientSecret: ${AUTH_OIDC_CLIENT_SECRET} - authorizationUrl: ${AUTH_OIDC_AUTH_URL} - tokenUrl: ${AUTH_OIDC_TOKEN_URL} tokenEndpointAuthMethod: ${AUTH_OIDC_TOKEN_ENDPOINT_AUTH_METHOD} # default='client_secret_basic' tokenSignedResponseAlg: ${AUTH_OIDC_TOKEN_SIGNED_RESPONSE_ALG} # default='RS256' scope: ${AUTH_OIDC_SCOPE} # default='openid profile email' @@ -434,8 +432,10 @@ costInsights: kind: 'PINTS_OF_ICE_CREAM' unit: 'ice cream pint' rate: 5.5 -pagerduty: + +pagerDuty: eventsBaseUrl: 'https://events.pagerduty.com/v2' + jenkins: instances: - name: default diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts index c6579e08f8..d059f2ec04 100644 --- a/plugins/auth-backend/config.d.ts +++ b/plugins/auth-backend/config.d.ts @@ -152,6 +152,8 @@ export interface Config { clientSecret: string; callbackUrl?: string; metadataUrl: string; + tokenEndpointAuthMethod?: string; + tokenSignedResponseAlg?: string; scope?: string; prompt?: string; }; From b4222908b0c38ccff0dba6df2b7197f3659b99de Mon Sep 17 00:00:00 2001 From: Diego Bardari Date: Thu, 27 Jul 2023 15:55:46 +0200 Subject: [PATCH 082/440] Added option to configure AWS accountId in AwsS3EntityProvider Signed-off-by: Diego Bardari --- .changeset/stale-wombats-talk.md | 5 +++++ plugins/catalog-backend-module-aws/config.d.ts | 12 ++++++++++++ .../src/providers/AwsS3EntityProvider.ts | 10 ++++++---- .../src/providers/config.ts | 2 ++ .../src/providers/types.ts | 1 + 5 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 .changeset/stale-wombats-talk.md diff --git a/.changeset/stale-wombats-talk.md b/.changeset/stale-wombats-talk.md new file mode 100644 index 0000000000..f4e0b852f8 --- /dev/null +++ b/.changeset/stale-wombats-talk.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-aws': patch +--- + +Added option to configure AWS `accountId` in `AwsS3EntityProvider` diff --git a/plugins/catalog-backend-module-aws/config.d.ts b/plugins/catalog-backend-module-aws/config.d.ts index b3610ccfc5..6a45b6636f 100644 --- a/plugins/catalog-backend-module-aws/config.d.ts +++ b/plugins/catalog-backend-module-aws/config.d.ts @@ -54,6 +54,12 @@ export interface Config { * @see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html */ region?: string; + /** + * (Optional) AWS Account id. + * If not set, main account is used. + * @see https://github.com/backstage/backstage/blob/master/packages/integration-aws-node/README.md + */ + accountId?: string; /** * (Optional) TaskScheduleDefinition for the refresh. */ @@ -77,6 +83,12 @@ export interface Config { * @see https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html */ region?: string; + /** + * (Optional) AWS Account id. + * If not set, main account is used. + * @see https://github.com/backstage/backstage/blob/master/packages/integration-aws-node/README.md + */ + accountId?: string; /** * (Optional) TaskScheduleDefinition for the refresh. */ diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts index 4a87a42e75..4df92b58c2 100644 --- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts +++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts @@ -146,20 +146,22 @@ export class AwsS3EntityProvider implements EntityProvider { /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.connect} */ async connect(connection: EntityProviderConnection): Promise { this.connection = connection; - const credProvider = - await this.awsCredentialsManager.getCredentialProvider(); + const { accountId, region, bucketName } = this.config; + const credProvider = await this.awsCredentialsManager.getCredentialProvider( + accountId ? { accountId } : undefined, + ); this.s3 = new S3({ apiVersion: '2006-03-01', credentialDefaultProvider: () => credProvider.sdkCredentialProvider, endpoint: this.integration.config.endpoint, - region: this.config.region, + region, forcePathStyle: this.integration.config.s3ForcePathStyle, }); // https://github.com/aws/aws-sdk-js-v3/issues/4122#issuecomment-1298968804 const endpoint = await getEndpointFromInstructions( { - Bucket: this.config.bucketName, + Bucket: bucketName, }, ListObjectsV2Command, this.s3.config as unknown as Record, diff --git a/plugins/catalog-backend-module-aws/src/providers/config.ts b/plugins/catalog-backend-module-aws/src/providers/config.ts index 5ef2729bf0..1ab52f9fd4 100644 --- a/plugins/catalog-backend-module-aws/src/providers/config.ts +++ b/plugins/catalog-backend-module-aws/src/providers/config.ts @@ -46,6 +46,7 @@ function readAwsS3Config(id: string, config: Config): AwsS3Config { const bucketName = config.getString('bucketName'); const region = config.getOptionalString('region'); const prefix = config.getOptionalString('prefix'); + const accountId = config.getOptionalString('accountId'); const schedule = config.has('schedule') ? readTaskScheduleDefinitionFromConfig(config.getConfig('schedule')) @@ -57,5 +58,6 @@ function readAwsS3Config(id: string, config: Config): AwsS3Config { region, prefix, schedule, + accountId, }; } diff --git a/plugins/catalog-backend-module-aws/src/providers/types.ts b/plugins/catalog-backend-module-aws/src/providers/types.ts index 204fa154c6..8e12b5f096 100644 --- a/plugins/catalog-backend-module-aws/src/providers/types.ts +++ b/plugins/catalog-backend-module-aws/src/providers/types.ts @@ -22,4 +22,5 @@ export type AwsS3Config = { prefix?: string; region?: string; schedule?: TaskScheduleDefinition; + accountId?: string; }; From d9922197f10f6105578d5619f10c345379233eae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 20:13:05 +0000 Subject: [PATCH 083/440] fix(deps): update dependency @stoplight/spectral-core to v1.18.3 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 4990ea8856..c20e33f57d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15293,7 +15293,7 @@ __metadata: languageName: node linkType: hard -"@stoplight/json@npm:^3.17.0, @stoplight/json@npm:^3.17.1": +"@stoplight/json@npm:^3.17.0, @stoplight/json@npm:^3.17.1, @stoplight/json@npm:~3.21.0": version: 3.21.0 resolution: "@stoplight/json@npm:3.21.0" dependencies: @@ -15336,11 +15336,11 @@ __metadata: linkType: hard "@stoplight/spectral-core@npm:^1.15.1, @stoplight/spectral-core@npm:^1.18.0, @stoplight/spectral-core@npm:^1.7.0, @stoplight/spectral-core@npm:^1.8.0, @stoplight/spectral-core@npm:^1.8.1": - version: 1.18.0 - resolution: "@stoplight/spectral-core@npm:1.18.0" + version: 1.18.3 + resolution: "@stoplight/spectral-core@npm:1.18.3" dependencies: "@stoplight/better-ajv-errors": 1.0.3 - "@stoplight/json": ~3.20.1 + "@stoplight/json": ~3.21.0 "@stoplight/path": 1.3.2 "@stoplight/spectral-parsers": ^1.0.0 "@stoplight/spectral-ref-resolver": ^1.0.0 @@ -15360,7 +15360,7 @@ __metadata: pony-cause: ^1.0.0 simple-eval: 1.0.0 tslib: ^2.3.0 - checksum: 76ff9e2349c035fa2b98556c8bd67bb531f2b9c29e19e33484270d62f30900d36ceb51ef0075255479cc5071b45bcb7249088f568fff9d44cd159b5ee8f07cec + checksum: 321d868a6c1e3d5f009d87d02651b423b5b6f5ef75a2ad1937b52b8ddc6e83dc3fe9618b00d7d92407e2eb3380b8409dc6ce98a8628d50ebd60d15dc8c15a7b8 languageName: node linkType: hard From 09678cbfc1c56711528253c6a16323196fd38121 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 20:13:36 +0000 Subject: [PATCH 084/440] fix(deps): update dependency @stoplight/spectral-parsers to v1.0.3 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 4990ea8856..89b1853460 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15293,7 +15293,7 @@ __metadata: languageName: node linkType: hard -"@stoplight/json@npm:^3.17.0, @stoplight/json@npm:^3.17.1": +"@stoplight/json@npm:^3.17.0, @stoplight/json@npm:^3.17.1, @stoplight/json@npm:~3.21.0": version: 3.21.0 resolution: "@stoplight/json@npm:3.21.0" dependencies: @@ -15414,14 +15414,14 @@ __metadata: linkType: hard "@stoplight/spectral-parsers@npm:^1.0.0, @stoplight/spectral-parsers@npm:^1.0.2": - version: 1.0.2 - resolution: "@stoplight/spectral-parsers@npm:1.0.2" + version: 1.0.3 + resolution: "@stoplight/spectral-parsers@npm:1.0.3" dependencies: - "@stoplight/json": ~3.20.1 + "@stoplight/json": ~3.21.0 "@stoplight/types": ^13.6.0 "@stoplight/yaml": ~4.2.3 tslib: ^2.3.1 - checksum: 89bc5c77ebeedca0abf9ffa9e074beed57d47b71814f23a1d65c03469aa6ea923007b42e7cb18ca7bcc4ff9fd399d604d32a41aa4c4c57a9cc3bebb4b24c3e34 + checksum: e1120e9ffc3db7f50573db08768c1206f5adc5fc503e77d3696e86e0765ce247c3c513ed12e53318b6aef0de33fc730aa78ccd542142d17d6bae01e23cba5879 languageName: node linkType: hard From 611317b5b469e87ee4cc9d2956e96bf9549e1dac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 23:03:38 +0000 Subject: [PATCH 085/440] fix(deps): update dependency @uiw/react-codemirror to v4.21.9 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/yarn.lock b/yarn.lock index e1ffe2c19b..6af0a07b2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15307,20 +15307,6 @@ __metadata: languageName: node linkType: hard -"@stoplight/json@npm:~3.20.1": - version: 3.20.3 - resolution: "@stoplight/json@npm:3.20.3" - dependencies: - "@stoplight/ordered-object-literal": ^1.0.3 - "@stoplight/path": ^1.3.2 - "@stoplight/types": ^13.6.0 - jsonc-parser: ~2.2.1 - lodash: ^4.17.21 - safe-stable-stringify: ^1.1 - checksum: 52a4251deca0be91c98172287def5cb004ff2ab801c3b7bb24f02abe14ad0890ee453588f235401fa048c5fefe1a750d7f68857f681d57afb62dd5310f50d71a - languageName: node - linkType: hard - "@stoplight/ordered-object-literal@npm:^1.0.1, @stoplight/ordered-object-literal@npm:^1.0.3": version: 1.0.4 resolution: "@stoplight/ordered-object-literal@npm:1.0.4" @@ -18584,9 +18570,9 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.21.7": - version: 4.21.7 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.7" +"@uiw/codemirror-extensions-basic-setup@npm:4.21.9": + version: 4.21.9 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.9" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -18603,19 +18589,19 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: c81ccef43396c92049a7bd05fecf6e4f7e1adfaed330892ca472b0d65e1ab919dbdd28475baea833a387547fedbe9c7dcc19b92577e1e8bba42084ee86ab3944 + checksum: e7f2a78dd26a919b00247ad85211a09b8242d57585c7689cc44ea9de99e02e8fd8dd281ebf48e61c4126704b031babb5a596307299015bb0aa8e561a0ad2d9b1 languageName: node linkType: hard "@uiw/react-codemirror@npm:^4.9.3": - version: 4.21.7 - resolution: "@uiw/react-codemirror@npm:4.21.7" + version: 4.21.9 + resolution: "@uiw/react-codemirror@npm:4.21.9" 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.7 + "@uiw/codemirror-extensions-basic-setup": 4.21.9 codemirror: ^6.0.0 peerDependencies: "@babel/runtime": ">=7.11.0" @@ -18625,7 +18611,7 @@ __metadata: codemirror: ">=6.0.0" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: c4650957d77556f8c2c5b1b072d7b381c7cbec068ff2c744d2891a88d6fb425d520b7b70addc6c82e809326467dcfa913171d62977009faf41be733b079d3e1e + checksum: c09a121e0c37f0dfb720e05f080b5f420eaec9bf1502cad38a100f2cefc731f50e854d682898163ad23aaefefcb505b57f4621b9724eca39d334258e0f25fddb languageName: node linkType: hard From a931290fc3ae9ba126e1e392debb216893b19122 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 23:04:12 +0000 Subject: [PATCH 086/440] fix(deps): update dependency dompurify to v2.4.7 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index e1ffe2c19b..4fefea383a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15307,20 +15307,6 @@ __metadata: languageName: node linkType: hard -"@stoplight/json@npm:~3.20.1": - version: 3.20.3 - resolution: "@stoplight/json@npm:3.20.3" - dependencies: - "@stoplight/ordered-object-literal": ^1.0.3 - "@stoplight/path": ^1.3.2 - "@stoplight/types": ^13.6.0 - jsonc-parser: ~2.2.1 - lodash: ^4.17.21 - safe-stable-stringify: ^1.1 - checksum: 52a4251deca0be91c98172287def5cb004ff2ab801c3b7bb24f02abe14ad0890ee453588f235401fa048c5fefe1a750d7f68857f681d57afb62dd5310f50d71a - languageName: node - linkType: hard - "@stoplight/ordered-object-literal@npm:^1.0.1, @stoplight/ordered-object-literal@npm:^1.0.3": version: 1.0.4 resolution: "@stoplight/ordered-object-literal@npm:1.0.4" @@ -23606,9 +23592,9 @@ __metadata: linkType: hard "dompurify@npm:^2.2.7, dompurify@npm:^2.2.9, dompurify@npm:^2.3.6": - version: 2.4.5 - resolution: "dompurify@npm:2.4.5" - checksum: d6d3c3b320f15cdb5b26aa1902c3275a3ab2c3705a9df4420bb94691d7c4df67959ec7b91e486c308320791b0ee000456f042734c45d76721e61c2768eac706e + version: 2.4.7 + resolution: "dompurify@npm:2.4.7" + checksum: 13c047e772a1998348191554dda403950d45ef2ec75fa0b9915cc179ccea0a39ef780d283109bd72cf83a2a085af6c77664281d4d0106a737bc5f39906364efe languageName: node linkType: hard From e3463e4d404a643a360d464b20185e9c50c31769 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 29 Jul 2023 01:17:06 +0000 Subject: [PATCH 087/440] fix(deps): update dependency eslint-plugin-jest to v27.2.3 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 6af0a07b2e..d50fd04b14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24644,12 +24644,12 @@ __metadata: linkType: hard "eslint-plugin-jest@npm:^27.0.0": - version: 27.2.2 - resolution: "eslint-plugin-jest@npm:27.2.2" + version: 27.2.3 + resolution: "eslint-plugin-jest@npm:27.2.3" dependencies: "@typescript-eslint/utils": ^5.10.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 + "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 eslint: ^7.0.0 || ^8.0.0 jest: "*" peerDependenciesMeta: @@ -24657,7 +24657,7 @@ __metadata: optional: true jest: optional: true - checksum: 98b63252d985f5dedf36ce9587dd4a0d24daf71ca8a997258343402c0d33ddd5070502378dafd9ac7fc0ef2e0d557b5c77f18e09ad73c71a52de8061db88293f + checksum: 4c7e07f52f17749ac6fd0ff5fcd5ce30b88983ba31eeee322e4d48859f55eaa112f06172e586ad2031c00ff28bb2dfdc3d35c83895251b9c0e860fa47dfc5ff4 languageName: node linkType: hard From f9c5e56a35053184906724adbc3f16f9ca6bf4f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 29 Jul 2023 01:17:48 +0000 Subject: [PATCH 088/440] fix(deps): update dependency isomorphic-git to v1.24.5 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 6af0a07b2e..658927de2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28920,8 +28920,8 @@ __metadata: linkType: hard "isomorphic-git@npm:^1.23.0": - version: 1.24.2 - resolution: "isomorphic-git@npm:1.24.2" + version: 1.24.5 + resolution: "isomorphic-git@npm:1.24.5" dependencies: async-lock: ^1.1.0 clean-git-ref: ^2.0.1 @@ -28936,7 +28936,7 @@ __metadata: simple-get: ^4.0.1 bin: isogit: cli.cjs - checksum: 5c69ebf32624ac175fda11b49970e235dd380f18d5ebb80580e1c1b9649bb95aa5f02dc9d2967acf99f485e40f558659c0d14f1ee87bbcc06330a1fcfa5ffb93 + checksum: d9d13d76ec3a7d7cc8afd70d07ea920f07806b74810fe414559d460cbef8d49c7e0f6dfba0e1773c7856b1d3dd1bf98e17a09ae6aa4a8fd2d759a2f54989491a languageName: node linkType: hard From f2a0fe664747ad9cf06d81267794016dc1f25385 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 29 Jul 2023 02:16:14 +0000 Subject: [PATCH 089/440] fix(deps): update dependency keyv to v4.5.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 d50fd04b14..fea9629198 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30539,11 +30539,11 @@ __metadata: linkType: hard "keyv@npm:^4.0.0, keyv@npm:^4.5.2": - version: 4.5.2 - resolution: "keyv@npm:4.5.2" + version: 4.5.3 + resolution: "keyv@npm:4.5.3" dependencies: json-buffer: 3.0.1 - checksum: 13ad58303acd2261c0d4831b4658451603fd159e61daea2121fcb15feb623e75ee328cded0572da9ca76b7b3ceaf8e614f1806c6b3af5db73c9c35a345259651 + checksum: 3ffb4d5b72b6b4b4af443bbb75ca2526b23c750fccb5ac4c267c6116888b4b65681015c2833cb20d26cf3e6e32dac6b988c77f7f022e1a571b7d90f1442257da languageName: node linkType: hard From 6cd88c35e86ef1b3ed80902cc266532c9a6e50b4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 29 Jul 2023 02:36:06 +0000 Subject: [PATCH 090/440] fix(deps): update dependency openid-client to v5.4.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 4022b09061..a1d4977377 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29668,10 +29668,10 @@ __metadata: languageName: node linkType: hard -"jose@npm:^4.14.1, jose@npm:^4.6.0": - version: 4.14.3 - resolution: "jose@npm:4.14.3" - checksum: b766d65a60c0407f891003aae053fb500be0edb7e0745e6702bce39199d9f06fda5eb74a90df10611cb7bd7daf2636cbe3726341fef388b51cb4e43b64200f4f +"jose@npm:^4.14.4, jose@npm:^4.6.0": + version: 4.14.4 + resolution: "jose@npm:4.14.4" + checksum: 2d820a91a8fd97c05d8bc8eedc373b944a0cd7f5fe41063086da233d0473c73fb523912a9f026ea870782bd221f4a515f441a2d3af4de48c6f2c76dac5082377 languageName: node linkType: hard @@ -33921,14 +33921,14 @@ __metadata: linkType: hard "openid-client@npm:^5.2.1, openid-client@npm:^5.3.0": - version: 5.4.2 - resolution: "openid-client@npm:5.4.2" + version: 5.4.3 + resolution: "openid-client@npm:5.4.3" dependencies: - jose: ^4.14.1 + jose: ^4.14.4 lru-cache: ^6.0.0 object-hash: ^2.2.0 oidc-token-hash: ^5.0.3 - checksum: 0f3570990a4979aff8581de35078c82d21d45baed9805e0e385dfc62c24fa295ee82d86386846a33bc33ed3b524a5406d8564f9f927420027719f84bf1d8b741 + checksum: 0e5a126b77dad0320e8f7023ac7ad7f5f1f82ad5f985f7ab0b42a7cf36700dfb78f0bef9b59c1fae915dce0148ef191b49921cd0a01443b64c04f862d9dc03e0 languageName: node linkType: hard From c6e220a3aba5cd52fbfe0c2747237e9c49faab80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 29 Jul 2023 03:09:44 +0000 Subject: [PATCH 091/440] fix(deps): update dependency postcss to v8.4.27 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 a8a8edc7ce..0cf971d206 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35544,13 +35544,13 @@ __metadata: linkType: hard "postcss@npm:^8.1.0, postcss@npm:^8.4.21": - version: 8.4.24 - resolution: "postcss@npm:8.4.24" + version: 8.4.27 + resolution: "postcss@npm:8.4.27" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d + checksum: 1cdd0c298849df6cd65f7e646a3ba36870a37b65f55fd59d1a165539c263e9b4872a402bf4ed1ca1bc31f58b68b2835545e33ea1a23b161a1f8aa6d5ded81e78 languageName: node linkType: hard From c03129e54d0e21fdbe01d55e09f7c74c0ac97366 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 29 Jul 2023 03:51:28 +0000 Subject: [PATCH 092/440] fix(deps): update dependency semver to v7.5.4 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0cf971d206..fde6e19c43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38456,11 +38456,11 @@ __metadata: linkType: hard "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0, semver@npm:^5.7.1": - version: 5.7.1 - resolution: "semver@npm:5.7.1" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 languageName: node linkType: hard @@ -38474,22 +38474,22 @@ __metadata: linkType: hard "semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 languageName: node linkType: hard "semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.0, semver@npm:^7.5.3": - version: 7.5.3 - resolution: "semver@npm:7.5.3" + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard From fab2acc5c393bffb6d6be5f992a74de778540d95 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Sun, 30 Jul 2023 20:26:28 +0530 Subject: [PATCH 093/440] Limit the use of the same shortcut name and url when adding a shortcut with test cases Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.test.tsx | 66 +++++++++++++++++---- plugins/shortcuts/src/EditShortcut.test.tsx | 59 +++++++++++++++--- plugins/shortcuts/src/ShortcutForm.test.tsx | 62 ++++++++++++++++--- plugins/shortcuts/src/ShortcutForm.tsx | 7 +++ 4 files changed, 167 insertions(+), 27 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.test.tsx b/plugins/shortcuts/src/AddShortcut.test.tsx index f8786e2b24..958e963a3e 100644 --- a/plugins/shortcuts/src/AddShortcut.test.tsx +++ b/plugins/shortcuts/src/AddShortcut.test.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { screen, fireEvent, waitFor } from '@testing-library/react'; import { AddShortcut } from './AddShortcut'; -import { DefaultShortcutsApi } from './api'; +import { DefaultShortcutsApi, shortcutsApiRef } from './api'; import { MockAnalyticsApi, MockStorageApi, @@ -42,13 +42,29 @@ describe('AddShortcut', () => { }); it('displays the title', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); expect(screen.getByText('Add Shortcut')).toBeInTheDocument(); }); it('closes the popup', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); fireEvent.click(screen.getByText('Cancel')); expect(props.onClose).toHaveBeenCalledTimes(1); @@ -57,7 +73,17 @@ describe('AddShortcut', () => { it('saves the input', async () => { const spy = jest.spyOn(api, 'add'); - await renderInTestApp(); + await renderInTestApp( + await renderInTestApp( + + + , + ), + ); const urlInput = screen.getByPlaceholderText('Enter a URL'); const titleInput = screen.getByPlaceholderText('Enter a display name'); @@ -78,7 +104,12 @@ describe('AddShortcut', () => { const spy = jest.spyOn(api, 'add'); await renderInTestApp( - + , ); @@ -106,9 +137,18 @@ describe('AddShortcut', () => { it('pastes the values', async () => { const spy = jest.spyOn(api, 'add'); - await renderInTestApp(, { - routeEntries: ['/some-initial-url'], - }); + await renderInTestApp( + + , + , + { + routeEntries: ['/some-initial-url'], + }, + ); fireEvent.click(screen.getByText('Use current page')); fireEvent.click(screen.getByText('Save')); @@ -125,8 +165,14 @@ describe('AddShortcut', () => { await renderInTestApp( <> - - + + + + , ); diff --git a/plugins/shortcuts/src/EditShortcut.test.tsx b/plugins/shortcuts/src/EditShortcut.test.tsx index 72a89c13b6..3077168193 100644 --- a/plugins/shortcuts/src/EditShortcut.test.tsx +++ b/plugins/shortcuts/src/EditShortcut.test.tsx @@ -18,7 +18,7 @@ import React from 'react'; import { screen, fireEvent, waitFor } from '@testing-library/react'; import { EditShortcut } from './EditShortcut'; import { Shortcut } from './types'; -import { DefaultShortcutsApi } from './api'; +import { DefaultShortcutsApi, shortcutsApiRef } from './api'; import { MockAnalyticsApi, MockStorageApi, @@ -48,13 +48,29 @@ describe('EditShortcut', () => { }); it('displays the title', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); expect(screen.getByText('Edit Shortcut')).toBeInTheDocument(); }); it('closes the popup', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); fireEvent.click(screen.getByText('Cancel')); expect(props.onClose).toHaveBeenCalledTimes(1); @@ -63,7 +79,15 @@ describe('EditShortcut', () => { it('updates the shortcut', async () => { const spy = jest.spyOn(api, 'update'); - await renderInTestApp(); + await renderInTestApp( + + + , + ); const urlInput = screen.getByPlaceholderText('Enter a URL'); const titleInput = screen.getByPlaceholderText('Enter a display name'); @@ -86,7 +110,12 @@ describe('EditShortcut', () => { const spy = jest.spyOn(api, 'update'); await renderInTestApp( - + , ); @@ -115,7 +144,15 @@ describe('EditShortcut', () => { it('removes the shortcut', async () => { const spy = jest.spyOn(api, 'remove'); - await renderInTestApp(); + await renderInTestApp( + + + , + ); fireEvent.click(screen.getByText('Remove')); expect(spy).toHaveBeenCalledWith('id'); @@ -132,8 +169,14 @@ describe('EditShortcut', () => { await renderInTestApp( <> - - + + + + , ); diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 511c1842c3..748f1ad022 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -16,7 +16,12 @@ import React from 'react'; import { screen, fireEvent, waitFor } from '@testing-library/react'; import { ShortcutForm } from './ShortcutForm'; -import { renderInTestApp } from '@backstage/test-utils'; +import { DefaultShortcutsApi, shortcutsApiRef } from './api'; +import { + renderInTestApp, + TestApiProvider, + MockStorageApi, +} from '@backstage/test-utils'; describe('ShortcutForm', () => { const props = { @@ -25,7 +30,15 @@ describe('ShortcutForm', () => { }; it('displays validation messages', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); const urlInput = screen.getByPlaceholderText('Enter a URL'); const titleInput = screen.getByPlaceholderText('Enter a display name'); @@ -47,7 +60,15 @@ describe('ShortcutForm', () => { }); it('allows external links', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); const urlInput = screen.getByPlaceholderText('Enter a URL'); const titleInput = screen.getByPlaceholderText('Enter a display name'); @@ -69,7 +90,15 @@ describe('ShortcutForm', () => { }); it('allows relative links when external links are enabled', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); const urlInput = screen.getByPlaceholderText('Enter a URL'); const titleInput = screen.getByPlaceholderText('Enter a display name'); @@ -92,10 +121,17 @@ describe('ShortcutForm', () => { it('calls the save handler', async () => { await renderInTestApp( - , + + + , + , ); fireEvent.click(screen.getByText('Save')); @@ -108,7 +144,15 @@ describe('ShortcutForm', () => { }); it('calls the close handler', async () => { - await renderInTestApp(); + await renderInTestApp( + + + , + ); fireEvent.click(screen.getByText('Cancel')); await waitFor(() => { diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index f5c5152ff7..388d22596e 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -73,6 +73,12 @@ export const ShortcutForm = ({ return true; }; + const urlIsUnique = async (url: string) => { + if (shortcutApi.get().some(shortcutUrl => shortcutUrl.url === url)) + return 'A shortcut with this url already exists'; + return true; + }; + useEffect(() => { reset(formValues); }, [reset, formValues]); @@ -85,6 +91,7 @@ export const ShortcutForm = ({ control={control} rules={{ required: true, + validate: urlIsUnique, ...(allowExternalLinks ? { pattern: { From 3fec69363ba58c98df276a37bd082c2247790d73 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Sun, 30 Jul 2023 20:38:25 +0530 Subject: [PATCH 094/440] Limit the use of the same shortcut name and url when adding a shortcut with test cases Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.test.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 748f1ad022..773c5491da 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -53,9 +53,6 @@ describe('ShortcutForm', () => { expect( screen.getByText('Must be at least 2 characters'), ).toBeInTheDocument(); - expect( - screen.getByText('A shortcut with this title already exists'), - ).toBeInTheDocument(); }); }); From 38b272d1f4d494dacf12df38e7a354f221924277 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 31 Jul 2023 09:58:08 +0530 Subject: [PATCH 095/440] Limit the use of the same shortcut name and url when adding a shortcut with test cases Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 388d22596e..a23951c939 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -74,7 +74,7 @@ export const ShortcutForm = ({ }; const urlIsUnique = async (url: string) => { - if (shortcutApi.get().some(shortcutUrl => shortcutUrl.url === url)) + if (shortcutData.get().some(shortcutUrl => shortcutUrl.url === url)) return 'A shortcut with this url already exists'; return true; }; From 900dbea7f7181cd1dddd724e7a68c1b6721ab8a8 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 31 Jul 2023 10:05:31 +0530 Subject: [PATCH 096/440] Limit the use of the same shortcut name and url when adding a shortcut with test cases Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index a23951c939..4384f1c061 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -74,7 +74,7 @@ export const ShortcutForm = ({ }; const urlIsUnique = async (url: string) => { - if (shortcutData.get().some(shortcutUrl => shortcutUrl.url === url)) + if (shortcutData.some(shortcutUrl => shortcutUrl.url === url)) return 'A shortcut with this url already exists'; return true; }; From 433288347d60d8703994f8da3d2b60a39c1715e7 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 31 Jul 2023 10:12:05 +0530 Subject: [PATCH 097/440] Limit the use of the same shortcut name and url when adding a shortcut with test case error message added Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/AddShortcut.test.tsx | 16 +++++++--------- plugins/shortcuts/src/ShortcutForm.test.tsx | 6 ++++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/plugins/shortcuts/src/AddShortcut.test.tsx b/plugins/shortcuts/src/AddShortcut.test.tsx index 958e963a3e..35f37bc265 100644 --- a/plugins/shortcuts/src/AddShortcut.test.tsx +++ b/plugins/shortcuts/src/AddShortcut.test.tsx @@ -74,15 +74,13 @@ describe('AddShortcut', () => { const spy = jest.spyOn(api, 'add'); await renderInTestApp( - await renderInTestApp( - - - , - ), + + + , ); const urlInput = screen.getByPlaceholderText('Enter a URL'); diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 773c5491da..8eda30e1ae 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -53,6 +53,12 @@ describe('ShortcutForm', () => { expect( screen.getByText('Must be at least 2 characters'), ).toBeInTheDocument(); + expect( + screen.getByText('A shortcut with this title already exists'), + ).toBeInTheDocument(); + expect( + screen.getByText('A shortcut with this url already exists'), + ).toBeInTheDocument(); }); }); From eea2922e749ab0c6b66b3cae9231d5f468c062a5 Mon Sep 17 00:00:00 2001 From: Alexandr Puzeyev <1099257+Tirex@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:48:27 +0600 Subject: [PATCH 098/440] README update - adding example of apiRef definition and fixed component name Signed-off-by: Alexandr Puzeyev <1099257+Tirex@users.noreply.github.com> --- .changeset/wild-timers-sparkle.md | 5 +++++ plugins/microsoft-calendar/README.md | 27 +++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 .changeset/wild-timers-sparkle.md diff --git a/.changeset/wild-timers-sparkle.md b/.changeset/wild-timers-sparkle.md new file mode 100644 index 0000000000..3df14f3a69 --- /dev/null +++ b/.changeset/wild-timers-sparkle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-microsoft-calendar': patch +--- + +README update - example of apiRef definition and fixed component name diff --git a/plugins/microsoft-calendar/README.md b/plugins/microsoft-calendar/README.md index 92421046e2..3dcf58c418 100644 --- a/plugins/microsoft-calendar/README.md +++ b/plugins/microsoft-calendar/README.md @@ -32,15 +32,38 @@ yarn add --cwd packages/app @backstage/plugin-microsoft-calendar 3. You can then use the provided React component `MicrosoftCalendar` in the backstage frontend where ever you want ```tsx -import { MicrosoftCalendar } from '@backstage/plugin-microsoft-calendar'; +import { MicrosoftCalendarCard } from '@backstage/plugin-microsoft-calendar'; // ... - + ; // ... ``` +If your homepage is not static JSX add `microsoftCalendarApiRef` to the App's `apis.ts`: + +```ts +import { + MicrosoftCalendarApiClient, + microsoftCalendarApiRef, +} from '@backstage/plugin-microsoft-calendar'; +import { + // ... + fetchApiRef, + // ... +} from '@backstage/core-plugin-api'; + +export const apis = [ + // ... + createApiFactory({ + api: microsoftCalendarApiRef, + deps: { authApi: microsoftAuthApiRef, fetchApi: fetchApiRef }, + factory: deps => new MicrosoftCalendarApiClient(deps), + }), +]; +``` + ![Microsoft Calendar plugin demo](https://user-images.githubusercontent.com/23618736/215717491-25db5fa6-b237-487f-8c00-28f572e8da05.mp4) ![Sample](./docs/microsoft-calendar-plugin.png) From b5321414b2045833387a308a381b3522e8bc7635 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Mon, 31 Jul 2023 11:44:53 +0530 Subject: [PATCH 099/440] Limit the use of the same shortcut name and url when adding a shortcut with test case error message removed Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.test.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/shortcuts/src/ShortcutForm.test.tsx b/plugins/shortcuts/src/ShortcutForm.test.tsx index 8eda30e1ae..773c5491da 100644 --- a/plugins/shortcuts/src/ShortcutForm.test.tsx +++ b/plugins/shortcuts/src/ShortcutForm.test.tsx @@ -53,12 +53,6 @@ describe('ShortcutForm', () => { expect( screen.getByText('Must be at least 2 characters'), ).toBeInTheDocument(); - expect( - screen.getByText('A shortcut with this title already exists'), - ).toBeInTheDocument(); - expect( - screen.getByText('A shortcut with this url already exists'), - ).toBeInTheDocument(); }); }); From ae930481813670cef06c54cd8ec6d76ad0db5bbc Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Mon, 31 Jul 2023 11:34:13 +0200 Subject: [PATCH 100/440] Add needed constants and constructs to support PostgreSQL14 for tests Signed-off-by: Jussi Hallila --- .changeset/strong-bobcats-unite.md | 5 +++ .../src/database/TestDatabases.test.ts | 31 +++++++++++++++++++ .../backend-test-utils/src/database/types.ts | 8 +++++ 3 files changed, 44 insertions(+) create mode 100644 .changeset/strong-bobcats-unite.md diff --git a/.changeset/strong-bobcats-unite.md b/.changeset/strong-bobcats-unite.md new file mode 100644 index 0000000000..ef86023d58 --- /dev/null +++ b/.changeset/strong-bobcats-unite.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Add needed constants and constructs to support PostgreSQL version 14 as test database diff --git a/packages/backend-test-utils/src/database/TestDatabases.test.ts b/packages/backend-test-utils/src/database/TestDatabases.test.ts index be29a42806..d766d38815 100644 --- a/packages/backend-test-utils/src/database/TestDatabases.test.ts +++ b/packages/backend-test-utils/src/database/TestDatabases.test.ts @@ -59,6 +59,37 @@ describe('TestDatabases', () => { describe('each connect', () => { const dbs = TestDatabases.create(); + itIfDocker( + 'obeys a provided connection string for postgres 14', + async () => { + const { host, port, user, password, stop } = + await startPostgresContainer('postgres:14'); + + try { + // Leave a mark + process.env.BACKSTAGE_TEST_DATABASE_POSTGRES14_CONNECTION_STRING = `postgresql://${user}:${password}@${host}:${port}`; + const input = await dbs.init('POSTGRES_14'); + await input.schema.createTable('a', table => + table.string('x').primary(), + ); + await input.insert({ x: 'y' }).into('a'); + + // Look for the mark + const database = input.client.config.connection.database; + const output = knexFactory({ + client: 'pg', + connection: { host, port, user, password, database }, + }); + // eslint-disable-next-line jest/no-standalone-expect + await expect(output.select('x').from('a')).resolves.toEqual([ + { x: 'y' }, + ]); + } finally { + await stop(); + } + }, + ); + itIfDocker( 'obeys a provided connection string for postgres 13', async () => { diff --git a/packages/backend-test-utils/src/database/types.ts b/packages/backend-test-utils/src/database/types.ts index 8c1d6f5193..a7bfdeb12d 100644 --- a/packages/backend-test-utils/src/database/types.ts +++ b/packages/backend-test-utils/src/database/types.ts @@ -24,6 +24,7 @@ import { getDockerImageForName } from '../util/getDockerImageForName'; * @public */ export type TestDatabaseId = + | 'POSTGRES_14' | 'POSTGRES_13' | 'POSTGRES_12' | 'POSTGRES_11' @@ -46,6 +47,13 @@ export type Instance = { export const allDatabases: Record = Object.freeze({ + POSTGRES_14: { + name: 'Postgres 14.x', + driver: 'pg', + dockerImageName: getDockerImageForName('postgres:14'), + connectionStringEnvironmentVariableName: + 'BACKSTAGE_TEST_DATABASE_POSTGRES14_CONNECTION_STRING', + }, POSTGRES_13: { name: 'Postgres 13.x', driver: 'pg', From d045b17215e8299f036e39808c1058f8eef80d57 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:07:54 +0000 Subject: [PATCH 101/440] chore(deps): update dependency @openapitools/openapi-generator-cli to v2.7.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index f2cb969632..4006cb65ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13141,16 +13141,16 @@ __metadata: languageName: node linkType: hard -"@nestjs/axios@npm:0.0.8": - version: 0.0.8 - resolution: "@nestjs/axios@npm:0.0.8" +"@nestjs/axios@npm:0.1.0": + version: 0.1.0 + resolution: "@nestjs/axios@npm:0.1.0" dependencies: axios: 0.27.2 peerDependencies: - "@nestjs/common": ^7.0.0 || ^8.0.0 + "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 - checksum: bc6b18c6e8bcfab1e8e9371a089cbba293a7b1df6d5de7fa15bb80db1966e6f62ba62d2b30c7378674f7d2272a1a1d0c694e1192c767c269c0aae04b7bdfea9b + checksum: 72929b25caacb85517bae962b13d865a31aa3984aa9e55305e0a2306e54338fe51a7eb38ca38cab0fe8b4116fb35219bd02c8b0c4cac70e7b5aeb84d03a1db3f languageName: node linkType: hard @@ -13882,10 +13882,10 @@ __metadata: linkType: hard "@openapitools/openapi-generator-cli@npm:^2.4.26": - version: 2.6.0 - resolution: "@openapitools/openapi-generator-cli@npm:2.6.0" + version: 2.7.0 + resolution: "@openapitools/openapi-generator-cli@npm:2.7.0" dependencies: - "@nestjs/axios": 0.0.8 + "@nestjs/axios": 0.1.0 "@nestjs/common": 9.3.11 "@nestjs/core": 9.3.11 "@nuxtjs/opencollective": 0.3.2 @@ -13903,7 +13903,7 @@ __metadata: tslib: 2.0.3 bin: openapi-generator-cli: main.js - checksum: d60711b0fc018f4834faa28be8990a6d019d87be9cd8c8f7f1a2f5dfb863044b1f80bc0841caceffa76f6eec3e756291e3b8e81a00d42ca883974703b616097f + checksum: 92ca36779b43fe1e4868cd89bde4cb96918868aa62c8a69a9e199711d8e7093bab67f484d266fcbf37ca4ad87e4e91ea5759fb322c7999a299f5bfdc179065b8 languageName: node linkType: hard From 3b8c85aa6ff4ea14c20a9886cd162c73c918113f Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Mon, 31 Jul 2023 12:32:18 +0200 Subject: [PATCH 102/440] Update api report Signed-off-by: Jussi Hallila --- packages/backend-test-utils/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 358b51071f..c0efbe33e3 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -168,6 +168,7 @@ export interface TestBackendOptions< // @public export type TestDatabaseId = + | 'POSTGRES_14' | 'POSTGRES_13' | 'POSTGRES_12' | 'POSTGRES_11' From 62dc7a2b1ad14516723816cab6549557f08a66b4 Mon Sep 17 00:00:00 2001 From: tperehinets Date: Mon, 31 Jul 2023 13:47:54 +0300 Subject: [PATCH 103/440] Added maxDepth to catalogGraphParams Signed-off-by: tperehinets --- .changeset/cuddly-colts-repeat.md | 5 +++++ .../src/components/CatalogGraphCard/CatalogGraphCard.tsx | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/cuddly-colts-repeat.md diff --git a/.changeset/cuddly-colts-repeat.md b/.changeset/cuddly-colts-repeat.md new file mode 100644 index 0000000000..ab2ed260af --- /dev/null +++ b/.changeset/cuddly-colts-repeat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-graph': patch +--- + +Added maxDepth parameter to the catalogGraphParams in CatalogGraphCard. diff --git a/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx b/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx index ae4ad850a4..7976fa66bb 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.tsx @@ -108,6 +108,7 @@ export const CatalogGraphCard = ( const catalogGraphParams = qs.stringify( { rootEntityRefs: [stringifyEntityRef(entity)], + maxDepth: maxDepth, unidirectional, mergeRelations, selectedKinds: kinds, From 55f7f954d8dddaeff9b933ac1e98eb992ac28f4f Mon Sep 17 00:00:00 2001 From: tperehinets <97943593+tperehinets@users.noreply.github.com> Date: Mon, 31 Jul 2023 14:31:10 +0300 Subject: [PATCH 104/440] Update cuddly-colts-repeat.md Signed-off-by: tperehinets <97943593+tperehinets@users.noreply.github.com> --- .changeset/cuddly-colts-repeat.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cuddly-colts-repeat.md b/.changeset/cuddly-colts-repeat.md index ab2ed260af..8266eb7ff0 100644 --- a/.changeset/cuddly-colts-repeat.md +++ b/.changeset/cuddly-colts-repeat.md @@ -2,4 +2,4 @@ '@backstage/plugin-catalog-graph': patch --- -Added maxDepth parameter to the catalogGraphParams in CatalogGraphCard. +Added maximum depth parameter to the catalogGraphParams in CatalogGraphCard. From d452ff59a2430df70081d97b0a1ddc3e77908891 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:13:34 +0000 Subject: [PATCH 105/440] chore(deps): update dependency @testing-library/jest-dom to v5.17.0 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 7233f9e31e..9b3a022451 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16294,8 +16294,8 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^5.10.1, @testing-library/jest-dom@npm:^5.16.4, @testing-library/jest-dom@npm:^5.16.5": - version: 5.16.5 - resolution: "@testing-library/jest-dom@npm:5.16.5" + version: 5.17.0 + resolution: "@testing-library/jest-dom@npm:5.17.0" dependencies: "@adobe/css-tools": ^4.0.1 "@babel/runtime": ^7.9.2 @@ -16306,7 +16306,7 @@ __metadata: dom-accessibility-api: ^0.5.6 lodash: ^4.17.15 redent: ^3.0.0 - checksum: 94911f901a8031f3e489d04ac057cb5373621230f5d92bed80e514e24b069fb58a3166d1dd86963e55f078a1bd999da595e2ab96ed95f452d477e272937d792a + checksum: 9f28dbca8b50d7c306aae40c3aa8e06f0e115f740360004bd87d57f95acf7ab4b4f4122a7399a76dbf2bdaaafb15c99cc137fdcb0ae457a92e2de0f3fbf9b03b languageName: node linkType: hard From d3b31a791eb1568ab5b853b7c280cbbc92d31fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 31 Jul 2023 14:52:03 +0200 Subject: [PATCH 106/440] Expose executeShellCommand, RunCommandOptions, and fetchContents from the node package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/tough-lies-float.md | 6 ++ .../package.json | 1 - .../confluence/confluenceToMarkdown.ts | 7 +- .../package.json | 1 - .../src/actions/fetch/cookiecutter.ts | 4 +- .../package.json | 1 - .../src/actions/fetch/rails/index.ts | 6 +- .../src/actions/fetch/rails/railsNewRunner.ts | 2 +- plugins/scaffolder-backend/api-report.md | 30 +++----- plugins/scaffolder-backend/src/deprecated.ts | 28 +++++++ .../scaffolder/actions/builtin/fetch/index.ts | 1 - .../actions/builtin/fetch/plain.test.ts | 2 +- .../scaffolder/actions/builtin/fetch/plain.ts | 6 +- .../actions/builtin/fetch/plainFile.test.ts | 2 +- .../actions/builtin/fetch/plainFile.ts | 6 +- .../actions/builtin/fetch/template.test.ts | 2 +- .../actions/builtin/fetch/template.ts | 6 +- .../src/scaffolder/actions/builtin/helpers.ts | 52 ------------- .../src/scaffolder/actions/builtin/index.ts | 3 - plugins/scaffolder-node/api-report.md | 34 +++++++++ plugins/scaffolder-node/package.json | 7 +- .../src/actions/executeShellCommand.ts | 75 +++++++++++++++++++ .../src/actions/fetch.test.ts} | 4 +- .../src/actions/fetch.ts} | 2 + plugins/scaffolder-node/src/actions/index.ts | 5 ++ yarn.lock | 8 +- 26 files changed, 199 insertions(+), 102 deletions(-) create mode 100644 .changeset/tough-lies-float.md create mode 100644 plugins/scaffolder-node/src/actions/executeShellCommand.ts rename plugins/{scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts => scaffolder-node/src/actions/fetch.test.ts} (98%) rename plugins/{scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts => scaffolder-node/src/actions/fetch.ts} (99%) diff --git a/.changeset/tough-lies-float.md b/.changeset/tough-lies-float.md new file mode 100644 index 0000000000..2ad3b8623f --- /dev/null +++ b/.changeset/tough-lies-float.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Deprecated `executeShellCommand`, `RunCommandOptions`, and `fetchContents` from `@backstage/plugin-scaffolder-backend`, since they are useful for Scaffolder modules (who should not be importing from the plugin package itself). You should now import these from `@backstage/plugin-scaffolder-backend-node` instead. `RunCommandOptions` was renamed in the Node package as `ExecuteShellCommandOptions`, for consistency. diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index b8ce9ea8d9..676eddfb12 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -34,7 +34,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", "fs-extra": "10.1.0", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts index 428f392555..71a3af11ae 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.ts @@ -13,11 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Config } from '@backstage/config'; import { UrlReader } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; -import { fetchContents } from '@backstage/plugin-scaffolder-backend'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + createTemplateAction, + fetchContents, +} from '@backstage/plugin-scaffolder-node'; import { InputError, ConflictError } from '@backstage/errors'; import { NodeHtmlMarkdown } from 'node-html-markdown'; import fs from 'fs-extra'; diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index f95771822b..446d79e06c 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -33,7 +33,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", "command-exists": "^1.2.9", diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts index b63a044a20..8b084e6377 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts @@ -27,10 +27,10 @@ import fs from 'fs-extra'; import path, { resolve as resolvePath } from 'path'; import { Writable } from 'stream'; import { + createTemplateAction, fetchContents, executeShellCommand, -} from '@backstage/plugin-scaffolder-backend'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +} from '@backstage/plugin-scaffolder-node'; export class CookiecutterRunner { private readonly containerRunner?: ContainerRunner; diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 9bc7bbf06f..3697529c31 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -33,7 +33,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", "@backstage/types": "workspace:^", "command-exists": "^1.2.9", diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts index 2a8a2554a2..2b34f978e3 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts @@ -19,8 +19,10 @@ import { JsonObject } from '@backstage/types'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; import fs from 'fs-extra'; -import { fetchContents } from '@backstage/plugin-scaffolder-backend'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + createTemplateAction, + fetchContents, +} from '@backstage/plugin-scaffolder-node'; import { resolve as resolvePath } from 'path'; import { RailsNewRunner } from './railsNewRunner'; diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts index 0ed02e293c..7e78c25d62 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts @@ -17,7 +17,7 @@ import { ContainerRunner } from '@backstage/backend-common'; import fs from 'fs-extra'; import path from 'path'; -import { executeShellCommand } from '@backstage/plugin-scaffolder-backend'; +import { executeShellCommand } from '@backstage/plugin-scaffolder-node'; import commandExists from 'command-exists'; import { railsArgumentResolver, diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 1957c3b3d2..4fe961056f 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -3,8 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -/// - import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node'; import { CatalogApi } from '@backstage/catalog-client'; import { CatalogProcessor } from '@backstage/plugin-catalog-node'; @@ -13,7 +11,10 @@ import { Config } from '@backstage/config'; import { createPullRequest } from 'octokit-plugin-create-pull-request'; import { Duration } from 'luxon'; import { Entity } from '@backstage/catalog-model'; +import { executeShellCommand as executeShellCommand_2 } from '@backstage/plugin-scaffolder-node'; +import { ExecuteShellCommandOptions } from '@backstage/plugin-scaffolder-node'; import express from 'express'; +import { fetchContents as fetchContents_2 } from '@backstage/plugin-scaffolder-node'; import { GithubCredentialsProvider } from '@backstage/integration'; import { HumanDuration } from '@backstage/types'; import { IdentityApi } from '@backstage/plugin-auth-node'; @@ -34,7 +35,6 @@ import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder- import { Schema } from 'jsonschema'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { ScmIntegrations } from '@backstage/integration'; -import { SpawnOptionsWithoutStdio } from 'child_process'; import { TaskSecrets as TaskSecrets_2 } from '@backstage/plugin-scaffolder-node'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common'; @@ -43,7 +43,6 @@ import { TemplateActionOptions } from '@backstage/plugin-scaffolder-node'; import { TemplateEntityStepV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateParametersV1beta3 } from '@backstage/plugin-scaffolder-common'; import { UrlReader } from '@backstage/backend-common'; -import { Writable } from 'stream'; import { ZodType } from 'zod'; import { ZodTypeDef } from 'zod'; @@ -816,17 +815,11 @@ export type DatabaseTaskStoreOptions = { database: PluginDatabaseManager | Knex; }; -// @public -export const executeShellCommand: (options: RunCommandOptions) => Promise; +// @public @deprecated +export const executeShellCommand: typeof executeShellCommand_2; -// @public -export function fetchContents(options: { - reader: UrlReader; - integrations: ScmIntegrations; - baseUrl?: string; - fetchUrl?: string; - outputPath: string; -}): Promise; +// @public @deprecated +export const fetchContents: typeof fetchContents_2; // @public (undocumented) export type OctokitWithPullRequestPluginClient = Octokit & { @@ -876,13 +869,8 @@ export interface RouterOptions { taskWorkers?: number; } -// @public (undocumented) -export type RunCommandOptions = { - command: string; - args: string[]; - options?: SpawnOptionsWithoutStdio; - logStream?: Writable; -}; +// @public @deprecated +export type RunCommandOptions = ExecuteShellCommandOptions; // @public (undocumented) export class ScaffolderEntitiesProcessor implements CatalogProcessor { diff --git a/plugins/scaffolder-backend/src/deprecated.ts b/plugins/scaffolder-backend/src/deprecated.ts index f8358b9071..d1a0f9ad5b 100644 --- a/plugins/scaffolder-backend/src/deprecated.ts +++ b/plugins/scaffolder-backend/src/deprecated.ts @@ -19,6 +19,9 @@ import { createTemplateAction as createTemplateActionNode, TaskSecrets as TaskSecretsNode, TemplateAction as TemplateActionNode, + executeShellCommand as executeShellCommandNode, + ExecuteShellCommandOptions as ExecuteShellCommandOptionsNode, + fetchContents as fetchContentsNode, } from '@backstage/plugin-scaffolder-node'; import { JsonObject } from '@backstage/types'; @@ -47,3 +50,28 @@ export type TaskSecrets = TaskSecretsNode; */ export type TemplateAction = TemplateActionNode; + +/** + * Options for {@link executeShellCommand}. + * + * @public + * @deprecated Use `ExecuteShellCommandOptions` from `@backstage/plugin-scaffolder-node` instead + */ +export type RunCommandOptions = ExecuteShellCommandOptionsNode; + +/** + * Run a command in a sub-process, normally a shell command. + * + * @public + * @deprecated Use `executeShellCommand` from `@backstage/plugin-scaffolder-node` instead + */ +export const executeShellCommand = executeShellCommandNode; + +/** + * A helper function that reads the contents of a directory from the given URL. + * Can be used in your own actions, and also used behind fetch:template and fetch:plain + * + * @public + * @deprecated Use `fetchContents` from `@backstage/plugin-scaffolder-node` instead + */ +export const fetchContents = fetchContentsNode; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts index 14a40f53c3..67f1bc360f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/index.ts @@ -17,4 +17,3 @@ export { createFetchPlainAction } from './plain'; export { createFetchPlainFileAction } from './plainFile'; export { createFetchTemplateAction } from './template'; -export { fetchContents } from './helpers'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts index ed37a39a98..3a67489eca 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts @@ -21,9 +21,9 @@ import { resolve as resolvePath } from 'path'; import { getVoidLogger, UrlReader } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; +import { fetchContents } from '@backstage/plugin-scaffolder-node'; import { createFetchPlainAction } from './plain'; import { PassThrough } from 'stream'; -import { fetchContents } from './helpers'; describe('fetch:plain', () => { const integrations = ScmIntegrations.fromConfig( diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts index c10f696bb9..e102c5bb74 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts @@ -16,8 +16,10 @@ import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; -import { fetchContents } from './helpers'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + createTemplateAction, + fetchContents, +} from '@backstage/plugin-scaffolder-node'; /** * Downloads content and places it in the workspace, or optionally diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts index 5d9e99fc7d..e6ed858b09 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts @@ -21,9 +21,9 @@ import { resolve as resolvePath } from 'path'; import { getVoidLogger, UrlReader } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; +import { fetchFile } from '@backstage/plugin-scaffolder-node'; import { createFetchPlainFileAction } from './plainFile'; import { PassThrough } from 'stream'; -import { fetchFile } from './helpers'; describe('fetch:plain:file', () => { const integrations = ScmIntegrations.fromConfig( diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts index 7b33ad93b4..96abe773fd 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts @@ -16,8 +16,10 @@ import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; -import { fetchFile } from './helpers'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + createTemplateAction, + fetchFile, +} from '@backstage/plugin-scaffolder-node'; /** * Downloads content and places it in the workspace, or optionally diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 15548ffea7..aee1fdcb32 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -25,9 +25,9 @@ import { } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { PassThrough } from 'stream'; -import { fetchContents } from './helpers'; import { createFetchTemplateAction } from './template'; import { + fetchContents, ActionContext, TemplateAction, } from '@backstage/plugin-scaffolder-node'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index be7b47521c..7f03cb2514 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -18,8 +18,10 @@ import { extname } from 'path'; import { resolveSafeChildPath, UrlReader } from '@backstage/backend-common'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; -import { fetchContents } from './helpers'; -import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { + createTemplateAction, + fetchContents, +} from '@backstage/plugin-scaffolder-node'; import globby from 'globby'; import fs from 'fs-extra'; import { isBinaryFile } from 'isbinaryfile'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts index f51ab47f16..5ac92128ca 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/helpers.ts @@ -17,61 +17,9 @@ import { Git } from '@backstage/backend-common'; import { Config } from '@backstage/config'; import { assertError } from '@backstage/errors'; -import { spawn, SpawnOptionsWithoutStdio } from 'child_process'; import { Octokit } from 'octokit'; -import { PassThrough, Writable } from 'stream'; import { Logger } from 'winston'; -/** @public */ -export type RunCommandOptions = { - /** command to run */ - command: string; - /** arguments to pass the command */ - args: string[]; - /** options to pass to spawn */ - options?: SpawnOptionsWithoutStdio; - /** stream to capture stdout and stderr output */ - logStream?: Writable; -}; - -/** - * Run a command in a sub-process, normally a shell command. - * - * @public - */ -export const executeShellCommand = async (options: RunCommandOptions) => { - const { - command, - args, - options: spawnOptions, - logStream = new PassThrough(), - } = options; - await new Promise((resolve, reject) => { - const process = spawn(command, args, spawnOptions); - - process.stdout.on('data', stream => { - logStream.write(stream); - }); - - process.stderr.on('data', stream => { - logStream.write(stream); - }); - - process.on('error', error => { - return reject(error); - }); - - process.on('close', code => { - if (code !== 0) { - return reject( - new Error(`Command ${command} failed, exit code: ${code}`), - ); - } - return resolve(); - }); - }); -}; - export async function initRepoAndPush({ dir, remoteUrl, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/index.ts index 7846ff96fc..7ab98482ff 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/index.ts @@ -21,6 +21,3 @@ export * from './fetch'; export * from './filesystem'; export * from './publish'; export * from './github'; - -export { executeShellCommand } from './helpers'; -export type { RunCommandOptions } from './helpers'; diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 46aba960d8..8f3a7af3e6 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -9,7 +9,10 @@ import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { Logger } from 'winston'; import { Schema } from 'jsonschema'; +import { ScmIntegrations } from '@backstage/integration'; +import { SpawnOptionsWithoutStdio } from 'child_process'; import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; +import { UrlReader } from '@backstage/backend-common'; import { UserEntity } from '@backstage/catalog-model'; import { Writable } from 'stream'; import { z } from 'zod'; @@ -67,6 +70,37 @@ export const createTemplateAction: < >, ) => TemplateAction; +// @public +export function executeShellCommand( + options: ExecuteShellCommandOptions, +): Promise; + +// @public +export type ExecuteShellCommandOptions = { + command: string; + args: string[]; + options?: SpawnOptionsWithoutStdio; + logStream?: Writable; +}; + +// @public +export function fetchContents(options: { + reader: UrlReader; + integrations: ScmIntegrations; + baseUrl?: string; + fetchUrl?: string; + outputPath: string; +}): Promise; + +// @public +export function fetchFile(options: { + reader: UrlReader; + integrations: ScmIntegrations; + baseUrl?: string; + fetchUrl?: string; + outputPath: string; +}): Promise; + // @alpha export interface ScaffolderActionsExtensionPoint { // (undocumented) diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 59e80f1c1c..053e9a1dec 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -30,17 +30,22 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { + "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/integration": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/types": "workspace:^", + "fs-extra": "10.1.0", "jsonschema": "^1.2.6", "winston": "^3.2.1", "zod": "^3.21.4", "zod-to-json-schema": "^3.20.4" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@backstage/config": "workspace:^" }, "files": [ "alpha", diff --git a/plugins/scaffolder-node/src/actions/executeShellCommand.ts b/plugins/scaffolder-node/src/actions/executeShellCommand.ts new file mode 100644 index 0000000000..ce54989589 --- /dev/null +++ b/plugins/scaffolder-node/src/actions/executeShellCommand.ts @@ -0,0 +1,75 @@ +/* + * 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 { spawn, SpawnOptionsWithoutStdio } from 'child_process'; +import { PassThrough, Writable } from 'stream'; + +/** + * Options for {@link executeShellCommand}. + * + * @public + */ +export type ExecuteShellCommandOptions = { + /** command to run */ + command: string; + /** arguments to pass the command */ + args: string[]; + /** options to pass to spawn */ + options?: SpawnOptionsWithoutStdio; + /** stream to capture stdout and stderr output */ + logStream?: Writable; +}; + +/** + * Run a command in a sub-process, normally a shell command. + * + * @public + */ +export async function executeShellCommand( + options: ExecuteShellCommandOptions, +): Promise { + const { + command, + args, + options: spawnOptions, + logStream = new PassThrough(), + } = options; + + await new Promise((resolve, reject) => { + const process = spawn(command, args, spawnOptions); + + process.stdout.on('data', stream => { + logStream.write(stream); + }); + + process.stderr.on('data', stream => { + logStream.write(stream); + }); + + process.on('error', error => { + return reject(error); + }); + + process.on('close', code => { + if (code !== 0) { + return reject( + new Error(`Command ${command} failed, exit code: ${code}`), + ); + } + return resolve(); + }); + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts b/plugins/scaffolder-node/src/actions/fetch.test.ts similarity index 98% rename from plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts rename to plugins/scaffolder-node/src/actions/fetch.test.ts index 3c4a677d4d..55b949fca7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.test.ts +++ b/plugins/scaffolder-node/src/actions/fetch.test.ts @@ -21,10 +21,10 @@ import { resolve as resolvePath } from 'path'; import { UrlReader } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { fetchContents, fetchFile } from './helpers'; +import { fetchContents, fetchFile } from './fetch'; import os from 'os'; -describe('fetchContent helper', () => { +describe('fetchContents helper', () => { beforeEach(() => { jest.clearAllMocks(); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts b/plugins/scaffolder-node/src/actions/fetch.ts similarity index 99% rename from plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts rename to plugins/scaffolder-node/src/actions/fetch.ts index 301c9991c4..66bbc0a842 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts +++ b/plugins/scaffolder-node/src/actions/fetch.ts @@ -54,6 +54,8 @@ export async function fetchContents(options: { /** * A helper function that reads the content of a single file from the given URL. * Can be used in your own actions, and also used behind `fetch:plain:file` + * + * @public */ export async function fetchFile(options: { reader: UrlReader; diff --git a/plugins/scaffolder-node/src/actions/index.ts b/plugins/scaffolder-node/src/actions/index.ts index e4af098356..751173384b 100644 --- a/plugins/scaffolder-node/src/actions/index.ts +++ b/plugins/scaffolder-node/src/actions/index.ts @@ -18,4 +18,9 @@ export { createTemplateAction, type TemplateActionOptions, } from './createTemplateAction'; +export { + executeShellCommand, + type ExecuteShellCommandOptions, +} from './executeShellCommand'; +export { fetchContents, fetchFile } from './fetch'; export { type ActionContext, type TemplateAction } from './types'; diff --git a/yarn.lock b/yarn.lock index 5d4ddd09d3..45ca2930fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8173,7 +8173,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" fs-extra: 10.1.0 @@ -8195,7 +8194,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" "@types/command-exists": ^1.2.0 @@ -8235,7 +8233,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" "@backstage/types": "workspace:^" "@types/command-exists": ^1.2.0 @@ -8364,11 +8361,16 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-node@workspace:plugins/scaffolder-node" dependencies: + "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/errors": "workspace:^" + "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" "@backstage/types": "workspace:^" + fs-extra: 10.1.0 jsonschema: ^1.2.6 winston: ^3.2.1 zod: ^3.21.4 From c186c631b4299c887f562006463b868dec53e956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 31 Jul 2023 15:14:07 +0200 Subject: [PATCH 107/440] one more changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/tidy-cobras-scream.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/tidy-cobras-scream.md diff --git a/.changeset/tidy-cobras-scream.md b/.changeset/tidy-cobras-scream.md new file mode 100644 index 0000000000..2917f11dfc --- /dev/null +++ b/.changeset/tidy-cobras-scream.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +--- + +Import helpers from the node package instead of the backend package From 63ebab57444adc7acc28d71ec4eb1bc6afafe20e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:20:06 +0000 Subject: [PATCH 108/440] chore(deps): update dependency better-sqlite3 to v8.5.0 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 566651d96a..61b5427c36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20178,13 +20178,13 @@ __metadata: linkType: hard "better-sqlite3@npm:^8.0.0": - version: 8.4.0 - resolution: "better-sqlite3@npm:8.4.0" + version: 8.5.0 + resolution: "better-sqlite3@npm:8.5.0" dependencies: bindings: ^1.5.0 node-gyp: latest prebuild-install: ^7.1.0 - checksum: f8b180c26428a2d381482e83b4519d0d81a918e00f92cafd255f42eb9583f49b2fed1015121ad49ebe1f3f790cc8c6f4697d1e805193d65e70dacf2e8abbd6af + checksum: 98243cb08a410fad0b5c443410428c8ea00376a4eb7d2c9a8a5a695970bc7a2a4007221930460939594d728e7d6bcb1889f46ec11a3bbb2257b996c80fbaacb1 languageName: node linkType: hard From 951ab6c9db5869d2e1167456e626c7485771110c Mon Sep 17 00:00:00 2001 From: Mitchell Hentges Date: Mon, 31 Jul 2023 15:30:20 +0200 Subject: [PATCH 109/440] Adds missing `configSchema` field to `plugin-search-backend` This was causing `loadConfigSchema()` to return the wrong values for this plugin. Signed-off-by: Mitchell Hentges --- .changeset/thin-yaks-hang.md | 5 +++++ plugins/search-backend/package.json | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/thin-yaks-hang.md diff --git a/.changeset/thin-yaks-hang.md b/.changeset/thin-yaks-hang.md new file mode 100644 index 0000000000..1a1bdb4ab7 --- /dev/null +++ b/.changeset/thin-yaks-hang.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-backend': patch +--- + +Add missing `configSchema` to package.json diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index f2d4d0a74c..5342b412f9 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -72,5 +72,6 @@ "files": [ "dist", "config.d.ts" - ] + ], + "configSchema": "config.d.ts" } From a8d7fb6f6f8ce0eed03971fe1595753bf6065a12 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 28 Jul 2023 16:02:11 +0200 Subject: [PATCH 110/440] backend-plugin-api: rename configService to rootConfigService Signed-off-by: Vincenzo Scamporlino --- packages/backend-plugin-api/CHANGELOG.md | 2 +- .../definitions/{ConfigService.ts => RootConfigService.ts} | 2 +- .../src/services/definitions/coreServices.ts | 6 +++--- .../backend-plugin-api/src/services/definitions/index.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename packages/backend-plugin-api/src/services/definitions/{ConfigService.ts => RootConfigService.ts} (92%) diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index a77cdb71eb..98fec63957 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -321,7 +321,7 @@ createServiceFactory({ service: coreServices.cache, deps: { - config: coreServices.config, + config: coreServices.rootConfig, plugin: coreServices.pluginMetadata, }, async createRootContext({ config }) { diff --git a/packages/backend-plugin-api/src/services/definitions/ConfigService.ts b/packages/backend-plugin-api/src/services/definitions/RootConfigService.ts similarity index 92% rename from packages/backend-plugin-api/src/services/definitions/ConfigService.ts rename to packages/backend-plugin-api/src/services/definitions/RootConfigService.ts index db9aa88dda..02343e4ee8 100644 --- a/packages/backend-plugin-api/src/services/definitions/ConfigService.ts +++ b/packages/backend-plugin-api/src/services/definitions/RootConfigService.ts @@ -19,4 +19,4 @@ import { Config } from '@backstage/config'; /** * @public */ -export interface ConfigService extends Config {} +export interface RootConfigService extends Config {} diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index 7dad94cebf..cb96c21d8b 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -36,9 +36,9 @@ export namespace coreServices { * * @public */ - export const config = createServiceRef< - import('./ConfigService').ConfigService - >({ id: 'core.config', scope: 'root' }); + export const rootConfig = createServiceRef< + import('./RootConfigService').RootConfigService + >({ id: 'core.rootConfig', scope: 'root' }); /** * The service reference for the plugin scoped {@link DatabaseService}. diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index ab0f0b84b1..98be8211db 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -20,7 +20,7 @@ export type { CacheServiceOptions, CacheServiceSetOptions, } from './CacheService'; -export type { ConfigService } from './ConfigService'; +export type { RootConfigService } from './RootConfigService'; export type { DatabaseService } from './DatabaseService'; export type { DiscoveryService } from './DiscoveryService'; export type { HttpRouterService } from './HttpRouterService'; From fb50191fa3a289a990e4de1098525da5d6c9f6ae Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 28 Jul 2023 16:06:19 +0200 Subject: [PATCH 111/440] backend-app-api: rename config to rootConfig Signed-off-by: Vincenzo Scamporlino --- packages/backend-app-api/src/http/MiddlewareFactory.ts | 9 ++++++--- .../implementations/cache/cacheServiceFactory.ts | 2 +- .../src/services/implementations/config/index.ts | 4 ++-- ...nfigServiceFactory.ts => rootConfigServiceFactory.ts} | 8 ++++---- .../implementations/database/databaseServiceFactory.ts | 2 +- .../implementations/discovery/discoveryServiceFactory.ts | 2 +- .../permissions/permissionsServiceFactory.ts | 2 +- .../rootHttpRouter/rootHttpRouterServiceFactory.ts | 6 +++--- .../rootLogger/rootLoggerServiceFactory.ts | 2 +- .../tokenManager/tokenManagerServiceFactory.ts | 2 +- .../implementations/urlReader/urlReaderServiceFactory.ts | 2 +- 11 files changed, 22 insertions(+), 19 deletions(-) rename packages/backend-app-api/src/services/implementations/config/{configServiceFactory.ts => rootConfigServiceFactory.ts} (87%) diff --git a/packages/backend-app-api/src/http/MiddlewareFactory.ts b/packages/backend-app-api/src/http/MiddlewareFactory.ts index 774e784d1d..bd78d77045 100644 --- a/packages/backend-app-api/src/http/MiddlewareFactory.ts +++ b/packages/backend-app-api/src/http/MiddlewareFactory.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { ConfigService, LoggerService } from '@backstage/backend-plugin-api'; +import { + RootConfigService, + LoggerService, +} from '@backstage/backend-plugin-api'; import { Request, Response, @@ -47,7 +50,7 @@ import { NotImplementedError } from '@backstage/errors'; * @public */ export interface MiddlewareFactoryOptions { - config: ConfigService; + config: RootConfigService; logger: LoggerService; } @@ -78,7 +81,7 @@ export interface MiddlewareFactoryErrorOptions { * @public */ export class MiddlewareFactory { - #config: ConfigService; + #config: RootConfigService; #logger: LoggerService; /** diff --git a/packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts b/packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts index 2208249280..b91356a13a 100644 --- a/packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/cache/cacheServiceFactory.ts @@ -24,7 +24,7 @@ import { export const cacheServiceFactory = createServiceFactory({ service: coreServices.cache, deps: { - config: coreServices.config, + config: coreServices.rootConfig, plugin: coreServices.pluginMetadata, }, async createRootContext({ config }) { diff --git a/packages/backend-app-api/src/services/implementations/config/index.ts b/packages/backend-app-api/src/services/implementations/config/index.ts index 690f1e2d36..1775ef2efc 100644 --- a/packages/backend-app-api/src/services/implementations/config/index.ts +++ b/packages/backend-app-api/src/services/implementations/config/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { configServiceFactory } from './configServiceFactory'; -export type { ConfigFactoryOptions } from './configServiceFactory'; +export { rootConfigServiceFactory } from './rootConfigServiceFactory'; +export type { RootConfigFactoryOptions } from './rootConfigServiceFactory'; diff --git a/packages/backend-app-api/src/services/implementations/config/configServiceFactory.ts b/packages/backend-app-api/src/services/implementations/config/rootConfigServiceFactory.ts similarity index 87% rename from packages/backend-app-api/src/services/implementations/config/configServiceFactory.ts rename to packages/backend-app-api/src/services/implementations/config/rootConfigServiceFactory.ts index d3b29ce545..1fa8d792ad 100644 --- a/packages/backend-app-api/src/services/implementations/config/configServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/config/rootConfigServiceFactory.ts @@ -24,7 +24,7 @@ import { } from '@backstage/config-loader'; /** @public */ -export interface ConfigFactoryOptions { +export interface RootConfigFactoryOptions { /** * Process arguments to use instead of the default `process.argv()`. */ @@ -37,9 +37,9 @@ export interface ConfigFactoryOptions { } /** @public */ -export const configServiceFactory = createServiceFactory( - (options?: ConfigFactoryOptions) => ({ - service: coreServices.config, +export const rootConfigServiceFactory = createServiceFactory( + (options?: RootConfigFactoryOptions) => ({ + service: coreServices.rootConfig, deps: {}, async factory() { const source = ConfigSources.default({ diff --git a/packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts b/packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts index 05e2f1deb9..139609b6c1 100644 --- a/packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/database/databaseServiceFactory.ts @@ -25,7 +25,7 @@ import { ConfigReader } from '@backstage/config'; export const databaseServiceFactory = createServiceFactory({ service: coreServices.database, deps: { - config: coreServices.config, + config: coreServices.rootConfig, lifecycle: coreServices.lifecycle, pluginMetadata: coreServices.pluginMetadata, }, diff --git a/packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts b/packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts index 7e2bb6b21e..6bdc4b4856 100644 --- a/packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/discovery/discoveryServiceFactory.ts @@ -24,7 +24,7 @@ import { export const discoveryServiceFactory = createServiceFactory({ service: coreServices.discovery, deps: { - config: coreServices.config, + config: coreServices.rootConfig, }, async factory({ config }) { return HostDiscovery.fromConfig(config); diff --git a/packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts b/packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts index 38cba73eda..3e5b7da9dd 100644 --- a/packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/permissions/permissionsServiceFactory.ts @@ -24,7 +24,7 @@ import { ServerPermissionClient } from '@backstage/plugin-permission-node'; export const permissionsServiceFactory = createServiceFactory({ service: coreServices.permissions, deps: { - config: coreServices.config, + config: coreServices.rootConfig, discovery: coreServices.discovery, tokenManager: coreServices.tokenManager, }, diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts index 5eaf8aa152..4c410e25ea 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts @@ -15,7 +15,7 @@ */ import { - ConfigService, + RootConfigService, coreServices, createServiceFactory, LifecycleService, @@ -36,7 +36,7 @@ export interface RootHttpRouterConfigureContext { app: Express; middleware: MiddlewareFactory; routes: RequestHandler; - config: ConfigService; + config: RootConfigService; logger: LoggerService; lifecycle: LifecycleService; } @@ -70,7 +70,7 @@ export const rootHttpRouterServiceFactory = createServiceFactory( (options?: RootHttpRouterFactoryOptions) => ({ service: coreServices.rootHttpRouter, deps: { - config: coreServices.config, + config: coreServices.rootConfig, rootLogger: coreServices.rootLogger, lifecycle: coreServices.rootLifecycle, }, diff --git a/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts b/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts index 11bbd58050..bd45df383f 100644 --- a/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/rootLogger/rootLoggerServiceFactory.ts @@ -26,7 +26,7 @@ import { createConfigSecretEnumerator } from '../../../config'; export const rootLoggerServiceFactory = createServiceFactory({ service: coreServices.rootLogger, deps: { - config: coreServices.config, + config: coreServices.rootConfig, }, async factory({ config }) { const logger = WinstonLogger.create({ diff --git a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts index b3726176b6..7417c18e23 100644 --- a/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/tokenManager/tokenManagerServiceFactory.ts @@ -24,7 +24,7 @@ import { ServerTokenManager } from '@backstage/backend-common'; export const tokenManagerServiceFactory = createServiceFactory({ service: coreServices.tokenManager, deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.rootLogger, }, createRootContext({ config, logger }) { diff --git a/packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts b/packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts index 83e594aa0b..6da71ac0fc 100644 --- a/packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts +++ b/packages/backend-app-api/src/services/implementations/urlReader/urlReaderServiceFactory.ts @@ -24,7 +24,7 @@ import { export const urlReaderServiceFactory = createServiceFactory({ service: coreServices.urlReader, deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, }, async factory({ config, logger }) { From 2cccf58ef189dc1000e3336ad6c40b21af67a0e6 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 28 Jul 2023 16:20:03 +0200 Subject: [PATCH 112/440] chore: config to rootConfig Signed-off-by: Vincenzo Scamporlino --- packages/backend-common/src/legacy.ts | 2 +- packages/backend-defaults/src/CreateBackend.ts | 4 ++-- .../backend-test-utils/src/next/services/mockServices.ts | 6 +++--- .../backend-test-utils/src/next/wiring/TestBackend.test.ts | 2 +- packages/backend-test-utils/src/next/wiring/TestBackend.ts | 2 +- plugins/airbrake-backend/src/plugin.ts | 2 +- plugins/app-backend/src/service/appPlugin.ts | 2 +- plugins/azure-devops-backend/src/plugin.ts | 2 +- plugins/badges-backend/src/plugin.ts | 2 +- plugins/bazaar-backend/src/plugin.ts | 2 +- .../src/module/catalogModuleAwsS3EntityProvider.test.ts | 2 +- .../src/module/catalogModuleAwsS3EntityProvider.ts | 2 +- .../module/catalogModuleAzureDevOpsEntityProvider.test.ts | 2 +- .../src/module/catalogModuleAzureDevOpsEntityProvider.ts | 2 +- .../src/module/catalogModuleBitbucketCloudEntityProvider.ts | 2 +- .../catalogModuleBitbucketServerEntityProvider.test.ts | 2 +- .../module/catalogModuleBitbucketServerEntityProvider.ts | 2 +- .../src/module/catalogModuleGcpGkeEntityProvider.ts | 2 +- .../src/module/catalogModuleGerritEntityProvider.test.ts | 2 +- .../src/module/catalogModuleGerritEntityProvider.ts | 2 +- .../src/module/catalogModuleGithubEntityProvider.test.ts | 2 +- .../src/module/catalogModuleGithubEntityProvider.ts | 2 +- .../catalogModuleGitlabDiscoveryEntityProvider.test.ts | 2 +- .../module/catalogModuleGitlabDiscoveryEntityProvider.ts | 2 +- .../src/module/WrapperProviders.ts | 4 ++-- .../catalogModuleIncrementalIngestionEntityProvider.test.ts | 2 +- .../catalogModuleIncrementalIngestionEntityProvider.ts | 2 +- .../catalog-backend-module-incremental-ingestion/src/run.ts | 2 +- .../catalogModuleMicrosoftGraphOrgEntityProvider.test.ts | 2 +- .../module/catalogModuleMicrosoftGraphOrgEntityProvider.ts | 2 +- .../src/module/catalogModulePuppetDbEntityProvider.test.ts | 2 +- .../src/module/catalogModulePuppetDbEntityProvider.ts | 2 +- plugins/catalog-backend/src/service/CatalogPlugin.ts | 2 +- plugins/devtools-backend/src/plugin.ts | 2 +- .../eventsModuleAwsSqsConsumingEventPublisher.test.ts | 2 +- .../service/eventsModuleAwsSqsConsumingEventPublisher.ts | 2 +- .../src/service/eventsModuleGithubWebhook.test.ts | 2 +- .../src/service/eventsModuleGithubWebhook.ts | 2 +- .../src/service/eventsModuleGitlabWebhook.test.ts | 2 +- .../src/service/eventsModuleGitlabWebhook.ts | 2 +- plugins/events-backend/src/service/EventsPlugin.test.ts | 2 +- plugins/events-backend/src/service/EventsPlugin.ts | 2 +- plugins/kafka-backend/src/plugin.ts | 2 +- plugins/kubernetes-backend/src/plugin.ts | 2 +- plugins/lighthouse-backend/src/plugin.ts | 2 +- plugins/periskop-backend/src/plugin.ts | 2 +- plugins/permission-backend/src/plugin.ts | 2 +- plugins/proxy-backend/src/plugin.ts | 2 +- plugins/scaffolder-backend/src/ScaffolderPlugin.ts | 2 +- plugins/search-backend-module-catalog/src/alpha.ts | 2 +- plugins/search-backend-module-elasticsearch/src/alpha.ts | 2 +- plugins/search-backend-module-explore/src/alpha.ts | 2 +- plugins/search-backend-module-pg/src/alpha.ts | 2 +- plugins/search-backend-module-techdocs/src/alpha.ts | 2 +- plugins/search-backend/src/alpha.ts | 2 +- plugins/techdocs-backend/src/plugin.ts | 2 +- plugins/todo-backend/src/lib/TodoReader/TodoScmReader.ts | 2 +- 57 files changed, 61 insertions(+), 61 deletions(-) diff --git a/packages/backend-common/src/legacy.ts b/packages/backend-common/src/legacy.ts index 408966f3bc..df1030e6b6 100644 --- a/packages/backend-common/src/legacy.ts +++ b/packages/backend-common/src/legacy.ts @@ -108,7 +108,7 @@ export function makeLegacyPlugin< export const legacyPlugin = makeLegacyPlugin( { cache: coreServices.cache, - config: coreServices.config, + config: coreServices.rootConfig, database: coreServices.database, discovery: coreServices.discovery, logger: coreServices.logger, diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 7051b58ae5..3db013a290 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -17,7 +17,7 @@ import { Backend, cacheServiceFactory, - configServiceFactory, + rootConfigServiceFactory, createSpecializedBackend, databaseServiceFactory, discoveryServiceFactory, @@ -40,7 +40,7 @@ import { export const defaultServiceFactories = [ cacheServiceFactory(), - configServiceFactory(), + rootConfigServiceFactory(), databaseServiceFactory(), discoveryServiceFactory(), httpRouterServiceFactory(), diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 8a3125214c..71e0a6556d 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -15,7 +15,7 @@ */ import { - ConfigService, + RootConfigService, coreServices, createServiceFactory, IdentityService, @@ -61,13 +61,13 @@ function simpleFactory< * @public */ export namespace mockServices { - export function config(options?: config.Options): ConfigService { + export function config(options?: config.Options): RootConfigService { return new ConfigReader(options?.data, 'mock-config'); } export namespace config { export type Options = { data?: JsonObject }; - export const factory = simpleFactory(coreServices.config, config); + export const factory = simpleFactory(coreServices.rootConfig, config); } export function rootLogger(options?: rootLogger.Options): LoggerService { diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index aa93a7dae1..cc916d4309 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -168,7 +168,7 @@ describe('TestBackend', () => { env.registerInit({ deps: { cache: coreServices.cache, - config: coreServices.config, + config: coreServices.rootConfig, database: coreServices.database, discovery: coreServices.discovery, httpRouter: coreServices.httpRouter, diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index e8df15862f..e62de5b5de 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -108,7 +108,7 @@ export async function startTestBackend< const rootHttpRouterFactory = createServiceFactory({ service: coreServices.rootHttpRouter, deps: { - config: coreServices.config, + config: coreServices.rootConfig, lifecycle: coreServices.rootLifecycle, rootLogger: coreServices.rootLogger, }, diff --git a/plugins/airbrake-backend/src/plugin.ts b/plugins/airbrake-backend/src/plugin.ts index 79850c1272..90e790c05f 100644 --- a/plugins/airbrake-backend/src/plugin.ts +++ b/plugins/airbrake-backend/src/plugin.ts @@ -32,7 +32,7 @@ export const airbrakePlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, httpRouter: coreServices.httpRouter, }, diff --git a/plugins/app-backend/src/service/appPlugin.ts b/plugins/app-backend/src/service/appPlugin.ts index a29f8fd5a8..a223d3ffb5 100644 --- a/plugins/app-backend/src/service/appPlugin.ts +++ b/plugins/app-backend/src/service/appPlugin.ts @@ -76,7 +76,7 @@ export const appPlugin = createBackendPlugin((options: AppPluginOptions) => ({ env.registerInit({ deps: { logger: coreServices.logger, - config: coreServices.config, + config: coreServices.rootConfig, database: coreServices.database, httpRouter: coreServices.httpRouter, }, diff --git a/plugins/azure-devops-backend/src/plugin.ts b/plugins/azure-devops-backend/src/plugin.ts index 808bdfa248..ea0976a1f2 100644 --- a/plugins/azure-devops-backend/src/plugin.ts +++ b/plugins/azure-devops-backend/src/plugin.ts @@ -31,7 +31,7 @@ export const azureDevOpsPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, reader: coreServices.urlReader, httpRouter: coreServices.httpRouter, diff --git a/plugins/badges-backend/src/plugin.ts b/plugins/badges-backend/src/plugin.ts index ecc03f0c15..3e462e88e9 100644 --- a/plugins/badges-backend/src/plugin.ts +++ b/plugins/badges-backend/src/plugin.ts @@ -31,7 +31,7 @@ export const badgesPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, discovery: coreServices.discovery, tokenManager: coreServices.tokenManager, diff --git a/plugins/bazaar-backend/src/plugin.ts b/plugins/bazaar-backend/src/plugin.ts index 62622717c8..1c06bda705 100644 --- a/plugins/bazaar-backend/src/plugin.ts +++ b/plugins/bazaar-backend/src/plugin.ts @@ -31,7 +31,7 @@ export const bazaarPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, database: coreServices.database, identity: coreServices.identity, logger: coreServices.logger, diff --git a/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts index 1475da9e79..7599f8446f 100644 --- a/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts +++ b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts @@ -62,7 +62,7 @@ describe('catalogModuleAwsS3EntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts index 452284e526..521d61d3d8 100644 --- a/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts +++ b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts @@ -33,7 +33,7 @@ export const catalogModuleAwsS3EntityProvider = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, catalog: catalogProcessingExtensionPoint, logger: coreServices.logger, scheduler: coreServices.scheduler, diff --git a/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts index fa3b3d865e..e3140f4583 100644 --- a/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts +++ b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts @@ -65,7 +65,7 @@ describe('catalogModuleAzureDevOpsEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts index ec8b6441ba..804c0d4712 100644 --- a/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts @@ -33,7 +33,7 @@ export const catalogModuleAzureDevOpsEntityProvider = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, catalog: catalogProcessingExtensionPoint, logger: coreServices.logger, scheduler: coreServices.scheduler, diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts index 7c4f4a30b2..e5e1ad1609 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts @@ -37,7 +37,7 @@ export const catalogModuleBitbucketCloudEntityProvider = createBackendModule({ deps: { catalog: catalogProcessingExtensionPoint, catalogApi: catalogServiceRef, - config: coreServices.config, + config: coreServices.rootConfig, // TODO(pjungermann): How to make this optional for those which only want the provider without event support? // Do we even want to support this? events: eventsExtensionPoint, diff --git a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts index d17b4a4c96..f072823052 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts @@ -69,7 +69,7 @@ describe('catalogModuleBitbucketServerEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts index 354bce7d6d..ef71df9b06 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts @@ -32,7 +32,7 @@ export const catalogModuleBitbucketServerEntityProvider = createBackendModule({ env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, }, diff --git a/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts b/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts index c13c6cbe0e..7f93bddbfe 100644 --- a/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts +++ b/plugins/catalog-backend-module-gcp/src/module/catalogModuleGcpGkeEntityProvider.ts @@ -33,7 +33,7 @@ export const catalogModuleGcpGkeEntityProvider = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, catalog: catalogProcessingExtensionPoint, logger: coreServices.logger, scheduler: coreServices.scheduler, diff --git a/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts index 0511aa7b4c..464837124f 100644 --- a/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts @@ -75,7 +75,7 @@ describe('catalogModuleGerritEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts index 814259fb40..bb29ce6eef 100644 --- a/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts +++ b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts @@ -32,7 +32,7 @@ export const catalogModuleGerritEntityProvider = createBackendModule({ env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, }, diff --git a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts index 82a5552dba..ca82e58e26 100644 --- a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts @@ -62,7 +62,7 @@ describe('catalogModuleGithubEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts index 997da3023b..8e052bd0a0 100644 --- a/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts @@ -34,7 +34,7 @@ export const catalogModuleGithubEntityProvider = createBackendModule({ env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, }, diff --git a/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts index 7a3d0a0e0d..da11601f09 100644 --- a/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts @@ -74,7 +74,7 @@ describe('catalogModuleGitlabDiscoveryEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts index ffae233319..d192e8f3a5 100644 --- a/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts @@ -33,7 +33,7 @@ export const catalogModuleGitlabDiscoveryEntityProvider = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, catalog: catalogProcessingExtensionPoint, logger: coreServices.logger, scheduler: coreServices.scheduler, diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts index 4738893c95..cc2954ea05 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/WrapperProviders.ts @@ -15,7 +15,7 @@ */ import { - ConfigService, + RootConfigService, LoggerService, SchedulerService, } from '@backstage/backend-plugin-api'; @@ -49,7 +49,7 @@ export class WrapperProviders { constructor( private readonly options: { - config: ConfigService; + config: RootConfigService; logger: LoggerService; client: Knex; scheduler: SchedulerService; diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts index ef07b4cb10..ae480048d1 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts @@ -50,7 +50,7 @@ describe('catalogModuleIncrementalIngestionEntityProvider', () => { [catalogProcessingExtensionPoint, { addEntityProvider }], ], services: [ - [coreServices.config, new ConfigReader({})], + [coreServices.rootConfig, new ConfigReader({})], [coreServices.database, database], [coreServices.httpRouter, httpRouter], [coreServices.logger, getVoidLogger()], diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts index 19d5742b46..78d28d7b07 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts @@ -44,7 +44,7 @@ export const catalogModuleIncrementalIngestionEntityProvider = env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, - config: coreServices.config, + config: coreServices.rootConfig, database: coreServices.database, httpRouter: coreServices.httpRouter, logger: coreServices.logger, diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts index f94c988237..e7e7a900b9 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts @@ -54,7 +54,7 @@ async function main() { const backend = createBackend({ services: [ createServiceFactory({ - service: coreServices.config, + service: coreServices.rootConfig, deps: {}, factory: () => new ConfigReader(config), }), diff --git a/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts index 3362c75c95..9f1a4ead8b 100644 --- a/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts +++ b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts @@ -67,7 +67,7 @@ describe('catalogModuleMicrosoftGraphOrgEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts index 7cd8b65f0b..2d3e1dd4d4 100644 --- a/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts @@ -70,7 +70,7 @@ export const catalogModuleMicrosoftGraphOrgEntityProvider = createBackendModule( env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, }, diff --git a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts index e2745e9268..c167035917 100644 --- a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts +++ b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts @@ -61,7 +61,7 @@ describe('catalogModulePuppetDbEntityProvider', () => { await startTestBackend({ extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts index 9a7d279cd3..5546b5283b 100644 --- a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts +++ b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts @@ -34,7 +34,7 @@ export const catalogModulePuppetDbEntityProvider = createBackendModule({ env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, }, diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index d77b034517..b8d5bdbeda 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -84,7 +84,7 @@ export const catalogPlugin = createBackendPlugin({ env.registerInit({ deps: { logger: coreServices.logger, - config: coreServices.config, + config: coreServices.rootConfig, reader: coreServices.urlReader, permissions: coreServices.permissions, database: coreServices.database, diff --git a/plugins/devtools-backend/src/plugin.ts b/plugins/devtools-backend/src/plugin.ts index 01e03e3609..685522557e 100644 --- a/plugins/devtools-backend/src/plugin.ts +++ b/plugins/devtools-backend/src/plugin.ts @@ -31,7 +31,7 @@ export const devtoolsPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, permissions: coreServices.permissions, httpRouter: coreServices.httpRouter, diff --git a/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts index 921dc38552..849ad733de 100644 --- a/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts +++ b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts @@ -64,7 +64,7 @@ describe('eventsModuleAwsSqsConsumingEventPublisher', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], diff --git a/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts index 41ae2d80d7..9045047094 100644 --- a/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts +++ b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts @@ -33,7 +33,7 @@ export const eventsModuleAwsSqsConsumingEventPublisher = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, events: eventsExtensionPoint, logger: coreServices.logger, scheduler: coreServices.scheduler, diff --git a/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts index b8a252aaba..f5bb07f0d6 100644 --- a/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts +++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts @@ -59,7 +59,7 @@ describe('eventsModuleGithubWebhook', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], - services: [[coreServices.config, config]], + services: [[coreServices.rootConfig, config]], features: [eventsModuleGithubWebhook()], }); diff --git a/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts index 7e89ceead7..b4bd666036 100644 --- a/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts +++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts @@ -34,7 +34,7 @@ export const eventsModuleGithubWebhook = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, events: eventsExtensionPoint, }, async init({ config, events }) { diff --git a/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts index c38233ecfd..92e803c439 100644 --- a/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts +++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts @@ -54,7 +54,7 @@ describe('gitlabWebhookEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], - services: [[coreServices.config, config]], + services: [[coreServices.rootConfig, config]], features: [eventsModuleGitlabWebhook()], }); diff --git a/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts index 0933ef342a..bd596b4baf 100644 --- a/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts +++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts @@ -36,7 +36,7 @@ export const eventsModuleGitlabWebhook = createBackendModule({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, events: eventsExtensionPoint, }, async init({ config, events }) { diff --git a/plugins/events-backend/src/service/EventsPlugin.test.ts b/plugins/events-backend/src/service/EventsPlugin.test.ts index 73578ae222..bce45c9ef3 100644 --- a/plugins/events-backend/src/service/EventsPlugin.test.ts +++ b/plugins/events-backend/src/service/EventsPlugin.test.ts @@ -71,7 +71,7 @@ describe('eventPlugin', () => { await startTestBackend({ extensionPoints: [], services: [ - [coreServices.config, config], + [coreServices.rootConfig, config], [coreServices.httpRouter, httpRouter], [coreServices.logger, getVoidLogger()], ], diff --git a/plugins/events-backend/src/service/EventsPlugin.ts b/plugins/events-backend/src/service/EventsPlugin.ts index 07f2b11731..27456b5b2a 100644 --- a/plugins/events-backend/src/service/EventsPlugin.ts +++ b/plugins/events-backend/src/service/EventsPlugin.ts @@ -89,7 +89,7 @@ export const eventsPlugin = createBackendPlugin({ env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, router: coreServices.httpRouter, }, diff --git a/plugins/kafka-backend/src/plugin.ts b/plugins/kafka-backend/src/plugin.ts index 2442eddbaa..0548a5f128 100644 --- a/plugins/kafka-backend/src/plugin.ts +++ b/plugins/kafka-backend/src/plugin.ts @@ -31,7 +31,7 @@ export const kafkaPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, httpRouter: coreServices.httpRouter, }, diff --git a/plugins/kubernetes-backend/src/plugin.ts b/plugins/kubernetes-backend/src/plugin.ts index 2c98519a5e..e2523b4ecd 100644 --- a/plugins/kubernetes-backend/src/plugin.ts +++ b/plugins/kubernetes-backend/src/plugin.ts @@ -34,7 +34,7 @@ export const kubernetesPlugin = createBackendPlugin({ deps: { http: coreServices.httpRouter, logger: coreServices.logger, - config: coreServices.config, + config: coreServices.rootConfig, catalogApi: catalogServiceRef, permissions: coreServices.permissions, }, diff --git a/plugins/lighthouse-backend/src/plugin.ts b/plugins/lighthouse-backend/src/plugin.ts index 7acbd45634..3d5c8dac72 100644 --- a/plugins/lighthouse-backend/src/plugin.ts +++ b/plugins/lighthouse-backend/src/plugin.ts @@ -34,7 +34,7 @@ export const lighthousePlugin = createBackendPlugin({ env.registerInit({ deps: { catalogClient: catalogServiceRef, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, scheduler: coreServices.scheduler, tokenManager: coreServices.tokenManager, diff --git a/plugins/periskop-backend/src/plugin.ts b/plugins/periskop-backend/src/plugin.ts index 933c864d50..2123dcbece 100644 --- a/plugins/periskop-backend/src/plugin.ts +++ b/plugins/periskop-backend/src/plugin.ts @@ -31,7 +31,7 @@ export const periskopPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, httpRouter: coreServices.httpRouter, }, diff --git a/plugins/permission-backend/src/plugin.ts b/plugins/permission-backend/src/plugin.ts index 5c0a9a87a0..a6b731b120 100644 --- a/plugins/permission-backend/src/plugin.ts +++ b/plugins/permission-backend/src/plugin.ts @@ -90,7 +90,7 @@ export const permissionPlugin = createBackendPlugin(() => ({ env.registerInit({ deps: { http: coreServices.httpRouter, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, discovery: coreServices.discovery, identity: coreServices.identity, diff --git a/plugins/proxy-backend/src/plugin.ts b/plugins/proxy-backend/src/plugin.ts index 66eeb4a7b2..c8dbdb4a08 100644 --- a/plugins/proxy-backend/src/plugin.ts +++ b/plugins/proxy-backend/src/plugin.ts @@ -35,7 +35,7 @@ export const proxyPlugin = createBackendPlugin( register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, discovery: coreServices.discovery, logger: coreServices.logger, httpRouter: coreServices.httpRouter, diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index 90dcc868e2..f361bfcdf9 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -80,7 +80,7 @@ export const scaffolderPlugin = createBackendPlugin( env.registerInit({ deps: { logger: coreServices.logger, - config: coreServices.config, + config: coreServices.rootConfig, reader: coreServices.urlReader, permissions: coreServices.permissions, database: coreServices.database, diff --git a/plugins/search-backend-module-catalog/src/alpha.ts b/plugins/search-backend-module-catalog/src/alpha.ts index c633dc71b2..f79aacab52 100644 --- a/plugins/search-backend-module-catalog/src/alpha.ts +++ b/plugins/search-backend-module-catalog/src/alpha.ts @@ -53,7 +53,7 @@ export const searchModuleCatalogCollator = createBackendModule( register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, discovery: coreServices.discovery, tokenManager: coreServices.tokenManager, scheduler: coreServices.scheduler, diff --git a/plugins/search-backend-module-elasticsearch/src/alpha.ts b/plugins/search-backend-module-elasticsearch/src/alpha.ts index 538124f004..7e1b95279a 100644 --- a/plugins/search-backend-module-elasticsearch/src/alpha.ts +++ b/plugins/search-backend-module-elasticsearch/src/alpha.ts @@ -48,7 +48,7 @@ export const searchModuleElasticsearchEngine = createBackendModule( deps: { searchEngineRegistry: searchEngineRegistryExtensionPoint, logger: coreServices.logger, - config: coreServices.config, + config: coreServices.rootConfig, }, async init({ searchEngineRegistry, logger, config }) { const searchEngine = await ElasticSearchSearchEngine.fromConfig({ diff --git a/plugins/search-backend-module-explore/src/alpha.ts b/plugins/search-backend-module-explore/src/alpha.ts index f13c3c2406..542d6def2b 100644 --- a/plugins/search-backend-module-explore/src/alpha.ts +++ b/plugins/search-backend-module-explore/src/alpha.ts @@ -54,7 +54,7 @@ export const searchModuleExploreCollator = createBackendModule( register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, discovery: coreServices.discovery, scheduler: coreServices.scheduler, diff --git a/plugins/search-backend-module-pg/src/alpha.ts b/plugins/search-backend-module-pg/src/alpha.ts index e3e0087957..71d62e7927 100644 --- a/plugins/search-backend-module-pg/src/alpha.ts +++ b/plugins/search-backend-module-pg/src/alpha.ts @@ -32,7 +32,7 @@ export const searchModulePostgresEngine = createBackendModule({ deps: { searchEngineRegistry: searchEngineRegistryExtensionPoint, database: coreServices.database, - config: coreServices.config, + config: coreServices.rootConfig, }, async init({ searchEngineRegistry, database, config }) { searchEngineRegistry.setSearchEngine( diff --git a/plugins/search-backend-module-techdocs/src/alpha.ts b/plugins/search-backend-module-techdocs/src/alpha.ts index 1432cc88fb..fe34d5241b 100644 --- a/plugins/search-backend-module-techdocs/src/alpha.ts +++ b/plugins/search-backend-module-techdocs/src/alpha.ts @@ -54,7 +54,7 @@ export const searchModuleTechDocsCollator = createBackendModule( register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, discovery: coreServices.discovery, tokenManager: coreServices.tokenManager, diff --git a/plugins/search-backend/src/alpha.ts b/plugins/search-backend/src/alpha.ts index 0c14852875..59394ab7a6 100644 --- a/plugins/search-backend/src/alpha.ts +++ b/plugins/search-backend/src/alpha.ts @@ -93,7 +93,7 @@ export const searchPlugin = createBackendPlugin({ env.registerInit({ deps: { logger: coreServices.logger, - config: coreServices.config, + config: coreServices.rootConfig, permissions: coreServices.permissions, http: coreServices.httpRouter, searchIndexService: searchIndexServiceRef, diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts index 134de2bba6..745370b67a 100644 --- a/plugins/techdocs-backend/src/plugin.ts +++ b/plugins/techdocs-backend/src/plugin.ts @@ -41,7 +41,7 @@ export const techdocsPlugin = createBackendPlugin({ register(env) { env.registerInit({ deps: { - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, urlReader: coreServices.urlReader, http: coreServices.httpRouter, diff --git a/plugins/todo-backend/src/lib/TodoReader/TodoScmReader.ts b/plugins/todo-backend/src/lib/TodoReader/TodoScmReader.ts index 276d176efb..2ce1771ecb 100644 --- a/plugins/todo-backend/src/lib/TodoReader/TodoScmReader.ts +++ b/plugins/todo-backend/src/lib/TodoReader/TodoScmReader.ts @@ -183,7 +183,7 @@ export const todoReaderServiceRef = createServiceRef({ service, deps: { reader: coreServices.urlReader, - config: coreServices.config, + config: coreServices.rootConfig, logger: coreServices.logger, }, factory: async ({ reader, config, logger }) => { From 8fabf2118d9d7b8665193c27b4bd77211a312cb2 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 28 Jul 2023 16:20:58 +0200 Subject: [PATCH 113/440] docs: config to rootConfig Signed-off-by: Vincenzo Scamporlino --- docs/backend-system/building-backends/01-index.md | 4 ++-- docs/backend-system/core-services/01-index.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index 0f23ae0006..d4b463af41 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -61,11 +61,11 @@ All of these services can be replaced with your own implementations if you need For example, let's say we want to customize the core configuration service to enable remote configuration loading. That would look something like this: ```ts -import { configServiceFactory } from '@backstage/backend-app-api'; +import { rootConfigServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - configServiceFactory({ + rootConfigServiceFactory({ remote: { reloadIntervalSeconds: 60 }, }), ], diff --git a/docs/backend-system/core-services/01-index.md b/docs/backend-system/core-services/01-index.md index c688055c96..a51db3c993 100644 --- a/docs/backend-system/core-services/01-index.md +++ b/docs/backend-system/core-services/01-index.md @@ -183,11 +183,11 @@ There's additional configuration that you can optionally pass to setup the `conf You can configure these additional options by adding an override for the core service when calling `createBackend` like follows: ```ts -import { configServiceFactory } from '@backstage/backend-app-api'; +import { rootConfigServiceFactory } from '@backstage/backend-app-api'; const backend = createBackend({ services: [ - configServiceFactory({ + rootConfigServiceFactory({ argv: [ '--config', '/backstage/app-config.development.yaml', From 9c960ca2e9bce76273740cc146c9d8918a32b450 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Fri, 28 Jul 2023 16:21:39 +0200 Subject: [PATCH 114/440] backend-app-api: fix config service types Signed-off-by: Vincenzo Scamporlino --- .../src/config/ObservableConfigProxy.ts | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/backend-app-api/src/config/ObservableConfigProxy.ts b/packages/backend-app-api/src/config/ObservableConfigProxy.ts index dd3334c9a5..8c8d3b553f 100644 --- a/packages/backend-app-api/src/config/ObservableConfigProxy.ts +++ b/packages/backend-app-api/src/config/ObservableConfigProxy.ts @@ -14,12 +14,11 @@ * limitations under the License. */ -import { ConfigService } from '@backstage/backend-plugin-api'; -import { ConfigReader } from '@backstage/config'; +import { Config, ConfigReader } from '@backstage/config'; import { JsonValue } from '@backstage/types'; -export class ObservableConfigProxy implements ConfigService { - private config: ConfigService = new ConfigReader({}); +export class ObservableConfigProxy implements Config { + private config: Config = new ConfigReader({}); private readonly subscribers: (() => void)[] = []; @@ -32,7 +31,7 @@ export class ObservableConfigProxy implements ConfigService { } } - setConfig(config: ConfigService) { + setConfig(config: Config) { if (this.parent) { throw new Error('immutable'); } @@ -62,9 +61,9 @@ export class ObservableConfigProxy implements ConfigService { }; } - private select(required: true): ConfigService; - private select(required: false): ConfigService | undefined; - private select(required: boolean): ConfigService | undefined { + private select(required: true): Config; + private select(required: false): Config | undefined; + private select(required: boolean): Config | undefined { if (this.parent && this.parentKey) { if (required) { return this.parent.select(true).getConfig(this.parentKey); @@ -87,19 +86,19 @@ export class ObservableConfigProxy implements ConfigService { getOptional(key?: string): T | undefined { return this.select(false)?.getOptional(key); } - getConfig(key: string): ConfigService { + getConfig(key: string): Config { return new ObservableConfigProxy(this, key); } - getOptionalConfig(key: string): ConfigService | undefined { + getOptionalConfig(key: string): Config | undefined { if (this.select(false)?.has(key)) { return new ObservableConfigProxy(this, key); } return undefined; } - getConfigArray(key: string): ConfigService[] { + getConfigArray(key: string): Config[] { return this.select(true).getConfigArray(key); } - getOptionalConfigArray(key: string): ConfigService[] | undefined { + getOptionalConfigArray(key: string): Config[] | undefined { return this.select(false)?.getOptionalConfigArray(key); } getNumber(key: string): number { From 26ee0d9484c4d4b0f4fca213c9640328a2387e8a Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 31 Jul 2023 17:18:31 +0200 Subject: [PATCH 115/440] rollback changelog Signed-off-by: Vincenzo Scamporlino --- packages/backend-plugin-api/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 98fec63957..a77cdb71eb 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -321,7 +321,7 @@ createServiceFactory({ service: coreServices.cache, deps: { - config: coreServices.rootConfig, + config: coreServices.config, plugin: coreServices.pluginMetadata, }, async createRootContext({ config }) { From 16eaf51480d8afceab6c6060f6158b0338bb257e Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 31 Jul 2023 17:41:42 +0200 Subject: [PATCH 116/440] api reports Signed-off-by: Vincenzo Scamporlino --- packages/backend-app-api/api-report.md | 28 +++++++++++------------ packages/backend-common/api-report.md | 4 ++-- packages/backend-plugin-api/api-report.md | 8 +++---- packages/backend-test-utils/api-report.md | 6 ++--- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 5f452f9e03..675a7755fc 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -9,7 +9,6 @@ import type { AppConfig } from '@backstage/config'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CacheClient } from '@backstage/backend-common'; import { Config } from '@backstage/config'; -import { ConfigService } from '@backstage/backend-plugin-api'; import { CorsOptions } from 'cors'; import { ErrorRequestHandler } from 'express'; import { Express as Express_2 } from 'express'; @@ -30,6 +29,7 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { RemoteConfigSourceOptions } from '@backstage/config-loader'; import { RequestHandler } from 'express'; import { RequestListener } from 'http'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { RootHttpRouterService } from '@backstage/backend-plugin-api'; import { RootLifecycleService } from '@backstage/backend-plugin-api'; import { RootLoggerService } from '@backstage/backend-plugin-api'; @@ -53,17 +53,6 @@ export interface Backend { // @public (undocumented) export const cacheServiceFactory: () => ServiceFactory; -// @public (undocumented) -export interface ConfigFactoryOptions { - argv?: string[]; - remote?: Pick; -} - -// @public (undocumented) -export const configServiceFactory: ( - options?: ConfigFactoryOptions | undefined, -) => ServiceFactory; - // @public (undocumented) export function createConfigSecretEnumerator(options: { logger: LoggerService; @@ -224,7 +213,7 @@ export interface MiddlewareFactoryErrorOptions { // @public export interface MiddlewareFactoryOptions { // (undocumented) - config: ConfigService; + config: RootConfigService; // (undocumented) logger: LoggerService; } @@ -244,12 +233,23 @@ export function readHelmetOptions(config?: Config): HelmetOptions; // @public export function readHttpServerOptions(config?: Config): HttpServerOptions; +// @public (undocumented) +export interface RootConfigFactoryOptions { + argv?: string[]; + remote?: Pick; +} + +// @public (undocumented) +export const rootConfigServiceFactory: ( + options?: RootConfigFactoryOptions | undefined, +) => ServiceFactory; + // @public (undocumented) export interface RootHttpRouterConfigureContext { // (undocumented) app: Express_2; // (undocumented) - config: ConfigService; + config: RootConfigService; // (undocumented) lifecycle: LifecycleService; // (undocumented) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index d40027cba9..fae3e2117d 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -18,7 +18,6 @@ import { CacheService as CacheClient } from '@backstage/backend-plugin-api'; import { CacheServiceOptions as CacheClientOptions } from '@backstage/backend-plugin-api'; import { CacheServiceSetOptions as CacheClientSetOptions } from '@backstage/backend-plugin-api'; import { Config } from '@backstage/config'; -import { ConfigService } from '@backstage/backend-plugin-api'; import cors from 'cors'; import Docker from 'dockerode'; import { ErrorRequestHandler } from 'express'; @@ -51,6 +50,7 @@ import { ReadTreeResponseFile } from '@backstage/backend-plugin-api'; import { ReadUrlOptions } from '@backstage/backend-plugin-api'; import { ReadUrlResponse } from '@backstage/backend-plugin-api'; import { RequestHandler } from 'express'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { Router } from 'express'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { SearchOptions } from '@backstage/backend-plugin-api'; @@ -525,7 +525,7 @@ export const legacyPlugin: ( TransformedEnv< { cache: CacheClient; - config: ConfigService; + config: RootConfigService; database: PluginDatabaseManager; discovery: PluginEndpointDiscovery; logger: LoggerService; diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 093b4acec4..a1ae6284c6 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -93,13 +93,10 @@ export type CacheServiceSetOptions = { ttl?: number; }; -// @public (undocumented) -export interface ConfigService extends Config {} - // @public export namespace coreServices { const cache: ServiceRef; - const config: ServiceRef; + const rootConfig: ServiceRef; const database: ServiceRef; const discovery: ServiceRef; const httpRouter: ServiceRef; @@ -380,6 +377,9 @@ export type ReadUrlResponse = { lastModifiedAt?: Date; }; +// @public (undocumented) +export interface RootConfigService extends Config {} + // @public (undocumented) export interface RootHttpRouterService { use(path: string, handler: Handler): void; diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 358b51071f..0d643339d8 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -6,7 +6,6 @@ import { Backend } from '@backstage/backend-app-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CacheService } from '@backstage/backend-plugin-api'; -import { ConfigService } from '@backstage/backend-plugin-api'; import { DatabaseService } from '@backstage/backend-plugin-api'; import { ExtendedHttpServer } from '@backstage/backend-app-api'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; @@ -18,6 +17,7 @@ import { Knex } from 'knex'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoggerService } from '@backstage/backend-plugin-api'; import { PermissionsService } from '@backstage/backend-plugin-api'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { RootLifecycleService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; @@ -36,7 +36,7 @@ export namespace mockServices { factory: () => ServiceFactory; } // (undocumented) - export function config(options?: config.Options): ConfigService; + export function config(options?: config.Options): RootConfigService; // (undocumented) export namespace config { // (undocumented) @@ -46,7 +46,7 @@ export namespace mockServices { const // (undocumented) factory: ( options?: Options | undefined, - ) => ServiceFactory; + ) => ServiceFactory; } // (undocumented) export namespace database { From 629cbd194a87aae8e28bc33e13a65fbd3f9bcb3a Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 31 Jul 2023 17:41:58 +0200 Subject: [PATCH 117/440] add changesets Signed-off-by: Vincenzo Scamporlino --- .changeset/angry-beers-relate.md | 46 +++++++++++++++++++++++++++++++ .changeset/mighty-lions-search.md | 8 ++++++ 2 files changed, 54 insertions(+) create mode 100644 .changeset/angry-beers-relate.md create mode 100644 .changeset/mighty-lions-search.md diff --git a/.changeset/angry-beers-relate.md b/.changeset/angry-beers-relate.md new file mode 100644 index 0000000000..52db351879 --- /dev/null +++ b/.changeset/angry-beers-relate.md @@ -0,0 +1,46 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-search-backend-module-elasticsearch': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-search-backend-module-techdocs': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-events-backend-module-aws-sqs': patch +'@backstage/plugin-search-backend-module-catalog': patch +'@backstage/plugin-search-backend-module-explore': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-events-backend-module-github': patch +'@backstage/plugin-events-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-aws': patch +'@backstage/plugin-catalog-backend-module-gcp': patch +'@backstage/plugin-search-backend-module-pg': patch +'@backstage/plugin-azure-devops-backend': patch +'@backstage/backend-plugin-api': patch +'@backstage/backend-test-utils': patch +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-lighthouse-backend': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/backend-defaults': patch +'@backstage/backend-app-api': patch +'@backstage/plugin-airbrake-backend': patch +'@backstage/plugin-devtools-backend': patch +'@backstage/plugin-periskop-backend': patch +'@backstage/plugin-techdocs-backend': patch +'@backstage/backend-common': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-badges-backend': patch +'@backstage/plugin-bazaar-backend': patch +'@backstage/plugin-events-backend': patch +'@backstage/plugin-search-backend': patch +'@backstage/plugin-kafka-backend': patch +'@backstage/plugin-proxy-backend': patch +'@backstage/plugin-todo-backend': patch +'@backstage/plugin-app-backend': patch +--- + +Use `coreServices.rootConfig` instead of `coreService.config` diff --git a/.changeset/mighty-lions-search.md b/.changeset/mighty-lions-search.md new file mode 100644 index 0000000000..a23545b274 --- /dev/null +++ b/.changeset/mighty-lions-search.md @@ -0,0 +1,8 @@ +--- +'@backstage/backend-plugin-api': minor +'@backstage/backend-app-api': minor +'@backstage/backend-common': minor +'@backstage/backend-test-utils': minor +--- + +Renamed `ConfigService` to `RootConfigService` From cbfecda8445435f5f2ec2873b426c5a56b9e0b3f Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 31 Jul 2023 17:42:19 +0200 Subject: [PATCH 118/440] backend-plugin-api: fix link Signed-off-by: Vincenzo Scamporlino --- .../backend-plugin-api/src/services/definitions/coreServices.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-plugin-api/src/services/definitions/coreServices.ts b/packages/backend-plugin-api/src/services/definitions/coreServices.ts index cb96c21d8b..b42795d052 100644 --- a/packages/backend-plugin-api/src/services/definitions/coreServices.ts +++ b/packages/backend-plugin-api/src/services/definitions/coreServices.ts @@ -32,7 +32,7 @@ export namespace coreServices { }); /** - * The service reference for the root scoped {@link ConfigService}. + * The service reference for the root scoped {@link RootConfigService}. * * @public */ From bbf4e9c894b5f2af676f05a4011f764283b189f4 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Mon, 17 Jul 2023 22:38:53 -0500 Subject: [PATCH 119/440] fix: Fix pathRewrite in k8s Proxy for WebSocket requests Signed-off-by: Carlos Esteban Lopez --- .changeset/chatty-seahorses-juggle.md | 5 + plugins/kubernetes-backend/package.json | 4 +- .../src/service/KubernetesProxy.test.ts | 390 +++++++++++------- .../src/service/KubernetesProxy.ts | 2 +- yarn.lock | 2 + 5 files changed, 249 insertions(+), 154 deletions(-) create mode 100644 .changeset/chatty-seahorses-juggle.md diff --git a/.changeset/chatty-seahorses-juggle.md b/.changeset/chatty-seahorses-juggle.md new file mode 100644 index 0000000000..16d0fa7f64 --- /dev/null +++ b/.changeset/chatty-seahorses-juggle.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +WebSocket requests path were not being rewritten by the proxy properly, now they do. diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 7ba6e332fd..2453c8a9d9 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -90,9 +90,11 @@ "@backstage/cli": "workspace:^", "@types/aws4": "^1.5.1", "@types/http-proxy-middleware": "^0.19.3", + "cross-fetch": "^3.1.5", "mock-fs": "^5.2.0", "msw": "^1.0.0", - "supertest": "^6.1.3" + "supertest": "^6.1.3", + "ws": "^8.13.0" }, "files": [ "dist", diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 199ef404ad..f5784de536 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -13,40 +13,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import 'buffer'; + import { errorHandler, getVoidLogger } from '@backstage/backend-common'; -import { NotFoundError } from '@backstage/errors'; -import { getMockReq, getMockRes } from '@jest-mock/express'; -import type { Request } from 'express'; -import express from 'express'; -import request from 'supertest'; -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; -import { ClusterDetails, KubernetesClustersSupplier } from '../types/types'; -import { - APPLICATION_JSON, - HEADER_KUBERNETES_CLUSTER, - HEADER_KUBERNETES_AUTH, - KubernetesProxy, -} from './KubernetesProxy'; +import { NotFoundError } from '@backstage/errors'; import { AuthorizeResult, PermissionEvaluator, } from '@backstage/plugin-permission-common'; +import { getMockReq, getMockRes } from '@jest-mock/express'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Server } from 'http'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import request from 'supertest'; +import { WebSocket, WebSocketServer } from 'ws'; + +import { LocalKubectlProxyClusterLocator } from '../cluster-locator/LocalKubectlProxyLocator'; import { KubernetesAuthTranslator, NoopKubernetesAuthTranslator, } from '../kubernetes-auth-translator'; -import Router from 'express-promise-router'; -import { LocalKubectlProxyClusterLocator } from '../cluster-locator/LocalKubectlProxyLocator'; +import { ClusterDetails, KubernetesClustersSupplier } from '../types/types'; +import { + APPLICATION_JSON, + HEADER_KUBERNETES_AUTH, + HEADER_KUBERNETES_CLUSTER, + KubernetesProxy, +} from './KubernetesProxy'; +import fetch from 'cross-fetch'; + +import type { Request } from 'express'; describe('KubernetesProxy', () => { let proxy: KubernetesProxy; const worker = setupServer(); const logger = getVoidLogger(); + const clusterSupplier: jest.Mocked = { + getClusters: jest.fn(), + }; + + const permissionApi: jest.Mocked = { + authorize: jest.fn(), + authorizeConditional: jest.fn(), + }; + + const authTranslator: jest.Mocked = { + decorateClusterDetailsWithAuth: jest.fn(), + }; + setupRequestMockHandlers(worker); const buildMockRequest = (clusterName: any, path: string): Request => { @@ -76,29 +94,45 @@ describe('KubernetesProxy', () => { return req; }; - const clusterSupplier: jest.Mocked = { - getClusters: jest.fn(), - }; + const setupProxyPromise = ({ + proxyPath, + requestPath, + headers, + }: { + proxyPath: string; + requestPath: string; + headers?: Record; + }) => { + const app = express().use( + Router() + .use(proxyPath, proxy.createRequestHandler({ permissionApi })) + .use(errorHandler()), + ); - const permissionApi: jest.Mocked = { - authorize: jest.fn(), - authorizeConditional: jest.fn(), - }; + const requestPromise = request(app).get(proxyPath + requestPath); - const authTranslator: jest.Mocked = { - decorateClusterDetailsWithAuth: jest.fn(), + if (headers) { + for (const [headerName, headerValue] of Object.entries(headers)) { + requestPromise.set(headerName, headerValue); + } + } + + // Let this request through so it reaches the express router above + worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + + return requestPromise; }; beforeEach(() => { jest.resetAllMocks(); proxy = new KubernetesProxy({ logger, clusterSupplier, authTranslator }); + permissionApi.authorize.mockReturnValue( + Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + ); }); it('should return a ERROR_NOT_FOUND if no clusters are found', async () => { clusterSupplier.getClusters.mockResolvedValue([]); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); const req = buildMockRequest('test', 'api'); const { res, next } = getMockRes(); @@ -124,10 +158,6 @@ describe('KubernetesProxy', () => { } as ClusterDetails, ]); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - const req = buildMockRequest(undefined, 'api'); const { res, next } = getMockRes(); @@ -146,10 +176,6 @@ describe('KubernetesProxy', () => { } as ClusterDetails, ]); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - const req = buildMockRequest('test', 'api'); const { res, next } = getMockRes(); @@ -179,10 +205,6 @@ describe('KubernetesProxy', () => { }, ] as ClusterDetails[]); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ name: 'cluster1', url: 'https://localhost:9999', @@ -190,19 +212,18 @@ describe('KubernetesProxy', () => { 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') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); 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 requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api', + headers: { [HEADER_KUBERNETES_CLUSTER]: 'cluster1' }, + }); + const response = await requestPromise; expect(response.status).toEqual(299); @@ -230,10 +251,6 @@ describe('KubernetesProxy', () => { }, ] as ClusterDetails[]); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ name: 'cluster1', url: 'https://localhost:9999', @@ -241,17 +258,17 @@ describe('KubernetesProxy', () => { 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 requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api', + }); + const response = await requestPromise; expect(response.status).toEqual(299); @@ -270,9 +287,7 @@ describe('KubernetesProxy', () => { }, ), ); - permissionApi.authorize.mockResolvedValue([ - { result: AuthorizeResult.ALLOW }, - ]); + clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -283,14 +298,14 @@ describe('KubernetesProxy', () => { authTranslator.decorateClusterDetailsWithAuth.mockImplementation( async x => x, ); - const app = express().use( - Router().use('/mountpath', proxy.createRequestHandler({ permissionApi })), - ); - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', + + headers: { [HEADER_KUBERNETES_CLUSTER]: 'cluster1' }, + }); + const response = await requestPromise; expect(response.status).toEqual(200); @@ -324,10 +339,6 @@ describe('KubernetesProxy', () => { ), ); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -344,15 +355,12 @@ describe('KubernetesProxy', () => { authProvider: 'serviceAccount', } as ClusterDetails); - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - const app = express().use(router); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + headers: { [HEADER_KUBERNETES_CLUSTER]: 'cluster1' }, + }); const response = await requestPromise; @@ -381,10 +389,6 @@ describe('KubernetesProxy', () => { }), ); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -400,15 +404,12 @@ describe('KubernetesProxy', () => { authProvider: 'googleServiceAccount', } as ClusterDetails); - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - const app = express().use(router); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + headers: { [HEADER_KUBERNETES_CLUSTER]: 'cluster1' }, + }); const response = await requestPromise; @@ -442,10 +443,6 @@ describe('KubernetesProxy', () => { }), ); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -461,16 +458,15 @@ describe('KubernetesProxy', () => { authProvider: 'googleServiceAccount', } as ClusterDetails); - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - const app = express().use(router); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1') - .set(HEADER_KUBERNETES_AUTH, 'tokenB'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + headers: { + [HEADER_KUBERNETES_CLUSTER]: 'cluster1', + [HEADER_KUBERNETES_AUTH]: 'tokenB', + }, + }); const response = await requestPromise; @@ -504,10 +500,6 @@ describe('KubernetesProxy', () => { }), ); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); - clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -516,16 +508,15 @@ describe('KubernetesProxy', () => { }, ] as ClusterDetails[]); - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - const app = express().use(router); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1') - .set(HEADER_KUBERNETES_AUTH, 'tokenB'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + headers: { + [HEADER_KUBERNETES_CLUSTER]: 'cluster1', + [HEADER_KUBERNETES_AUTH]: 'tokenB', + }, + }); const response = await requestPromise; @@ -562,19 +553,14 @@ describe('KubernetesProxy', () => { }), ); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), - ); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - const app = express().use(router); - - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'local'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + headers: { + [HEADER_KUBERNETES_CLUSTER]: 'local', + }, + }); const response = await requestPromise; @@ -608,10 +594,6 @@ describe('KubernetesProxy', () => { }), ); - permissionApi.authorize.mockResolvedValue([ - { result: AuthorizeResult.ALLOW }, - ]); - clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -625,16 +607,14 @@ describe('KubernetesProxy', () => { Error('some internal error'), ); - const router = Router(); - router.use('/mountpath', proxy.createRequestHandler({ permissionApi })); - router.use(errorHandler()); - const app = express().use(router); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); - - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + headers: { + [HEADER_KUBERNETES_CLUSTER]: 'cluster1', + }, + }); const response = await requestPromise; @@ -657,9 +637,7 @@ describe('KubernetesProxy', () => { }, ), ); - permissionApi.authorize.mockResolvedValue([ - { result: AuthorizeResult.ALLOW }, - ]); + clusterSupplier.getClusters.mockResolvedValue([ { name: 'cluster1', @@ -667,19 +645,127 @@ describe('KubernetesProxy', () => { authProvider: '', }, ]); + authTranslator.decorateClusterDetailsWithAuth.mockImplementation( async x => x, ); - const app = express().use( - Router().use('/mountpath', proxy.createRequestHandler({ permissionApi })), - ); - const requestPromise = request(app) - .get('/mountpath/api/v1/namespaces') - .set(HEADER_KUBERNETES_CLUSTER, 'cluster1'); - worker.use(rest.all(requestPromise.url, (req: any) => req.passthrough())); + const requestPromise = setupProxyPromise({ + proxyPath: '/mountpath', + requestPath: '/api/v1/namespaces', + + headers: { + [HEADER_KUBERNETES_CLUSTER]: 'cluster1', + }, + }); + const response = await requestPromise; expect(response.status).toEqual(200); }); + + describe('WebSocket', () => { + const proxyPath = '/proxy'; + const proxyPort = 9000; + const wsPath = '/ws'; + const wsPort = 9999; + + let wsServer: WebSocketServer; + let expressApp: express.Express; + let expressServer: Server; + + const eventPromiseFactory = ( + ws: WebSocket, + event: 'connection' | 'open' | 'close' | 'error' | 'message', + ) => new Promise(resolve => ws.once(event, x => resolve(x?.toString()))); + + beforeAll(async () => { + await new Promise(resolve => { + expressApp = express().use( + Router() + .use(proxyPath, proxy.createRequestHandler({ permissionApi })) + .use(errorHandler()), + ); + + expressServer = expressApp.listen(proxyPort, '0.0.0.0', () => { + resolve(null); + }); + }); + + wsServer = new WebSocketServer({ port: wsPort, path: wsPath }); + + wsServer.on('connection', (ws: WebSocket) => { + // send immediatly a feedback to the incoming connection + ws.send('connected'); + + // Echo message handling + ws.on('message', (message: string) => { + ws.send(message); + }); + }); + + wsServer.on('error', console.error); + }); + + afterAll(() => { + wsServer.close(); + expressServer.close(); + }); + + // eslint-disable-next-line jest/no-done-callback + it('should proxy websocket connections', async () => { + clusterSupplier.getClusters.mockResolvedValue([ + { + name: 'local', + url: `http://localhost:${wsPort}`, + serviceAccountToken: '', + authProvider: 'serviceAccount', + }, + ] as ClusterDetails[]); + + authTranslator.decorateClusterDetailsWithAuth.mockResolvedValue({ + name: 'local', + url: `http://localhost:${wsPort}`, + serviceAccountToken: '', + authProvider: 'serviceAccount', + } as ClusterDetails); + + const wsProxyAddress = `ws://localhost:${proxyPort}${proxyPath}${wsPath}`; + const wsAddress = `ws://localhost:${wsPort}${wsPath}`; + + // Let this request through so it reaches the express router above + worker.use( + rest.all(wsAddress.replace('ws', 'http'), (req: any) => + req.passthrough(), + ), + rest.all(wsProxyAddress.replace('ws', 'http'), (req: any) => + req.passthrough(), + ), + ); + + // Prepopulate the proxy so the WebSocket upgrade can happen, result doesn't actually matter + const result = await fetch(wsProxyAddress.replace('ws', 'http')); + expect(result.ok).toBeFalsy(); + + const webSocket = new WebSocket(wsProxyAddress); + + const connectMessagePromise = eventPromiseFactory(webSocket, 'message'); + + const openPromise = eventPromiseFactory(webSocket, 'open'); + await openPromise; + + const connectMessage = await connectMessagePromise; + expect(connectMessage).toBe('connected'); + + const echoMessagePromise = eventPromiseFactory(webSocket, 'message'); + webSocket.send('echo'); + + const echoMessage = await echoMessagePromise; + expect(echoMessage).toBe('echo'); + + const closePromise = eventPromiseFactory(webSocket, 'close'); + webSocket.close(); + await closePromise; + }); + }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index ec9bbb346e..742d078071 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -145,7 +145,7 @@ export class KubernetesProxy { const cluster = await this.getClusterForRequest(req); const url = new URL(cluster.url); return path.replace( - new RegExp(`^${req.baseUrl}`), + new RegExp(`^${originalReq.baseUrl}`), url.pathname || '', ); }, diff --git a/yarn.lock b/yarn.lock index 566651d96a..86528ba0de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7334,6 +7334,7 @@ __metadata: "@types/luxon": ^3.0.0 compression: ^1.7.4 cors: ^2.8.5 + cross-fetch: ^3.1.5 express: ^4.17.1 express-promise-router: ^4.1.0 fs-extra: 10.1.0 @@ -7348,6 +7349,7 @@ __metadata: stream-buffers: ^3.0.2 supertest: ^6.1.3 winston: ^3.2.1 + ws: ^8.13.0 yn: ^4.0.0 languageName: unknown linkType: soft From f6b6344e7e00a629d20aab37665744ccccecfb64 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 19 Jul 2023 02:17:43 -0500 Subject: [PATCH 120/440] Update plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index f5784de536..75ed57333b 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -712,7 +712,6 @@ describe('KubernetesProxy', () => { expressServer.close(); }); - // eslint-disable-next-line jest/no-done-callback it('should proxy websocket connections', async () => { clusterSupplier.getClusters.mockResolvedValue([ { From 438bf1dfdb515636db7b92f48065b1ac7769f689 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 19 Jul 2023 02:20:11 -0500 Subject: [PATCH 121/440] Update plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 75ed57333b..fc7e557ddc 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -695,7 +695,6 @@ describe('KubernetesProxy', () => { wsServer = new WebSocketServer({ port: wsPort, path: wsPath }); wsServer.on('connection', (ws: WebSocket) => { - // send immediatly a feedback to the incoming connection ws.send('connected'); // Echo message handling From 79519e31fe4f314d32f6fedc88a9fbb8728187fb Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 19 Jul 2023 02:22:45 -0500 Subject: [PATCH 122/440] Update plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index fc7e557ddc..71fe54c7c9 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -749,8 +749,7 @@ describe('KubernetesProxy', () => { const connectMessagePromise = eventPromiseFactory(webSocket, 'message'); - const openPromise = eventPromiseFactory(webSocket, 'open'); - await openPromise; + await eventPromiseFactory(webSocket, 'open'); const connectMessage = await connectMessagePromise; expect(connectMessage).toBe('connected'); From c1d645a487a9fc582c8fb6f2a6ae08306c89034a Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 19 Jul 2023 16:49:33 -0500 Subject: [PATCH 123/440] Update plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- .../kubernetes-backend/src/service/KubernetesProxy.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 71fe54c7c9..7344909818 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -126,8 +126,8 @@ describe('KubernetesProxy', () => { beforeEach(() => { jest.resetAllMocks(); proxy = new KubernetesProxy({ logger, clusterSupplier, authTranslator }); - permissionApi.authorize.mockReturnValue( - Promise.resolve([{ result: AuthorizeResult.ALLOW }]), + permissionApi.authorize.mockResolvedValue( + [{ result: AuthorizeResult.ALLOW }], ); }); From f6fe178c9933f1b6de8a3b56c2b13264ec300fd9 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Wed, 19 Jul 2023 16:52:03 -0500 Subject: [PATCH 124/440] test: Address PR comments on random port for WS and Express Signed-off-by: Carlos Esteban Lopez --- .../src/service/KubernetesProxy.test.ts | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 7344909818..38ec471d4b 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -29,7 +29,7 @@ import { Server } from 'http'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import request from 'supertest'; -import { WebSocket, WebSocketServer } from 'ws'; +import { AddressInfo, WebSocket, WebSocketServer } from 'ws'; import { LocalKubectlProxyClusterLocator } from '../cluster-locator/LocalKubectlProxyLocator'; import { @@ -126,9 +126,9 @@ describe('KubernetesProxy', () => { beforeEach(() => { jest.resetAllMocks(); proxy = new KubernetesProxy({ logger, clusterSupplier, authTranslator }); - permissionApi.authorize.mockResolvedValue( - [{ result: AuthorizeResult.ALLOW }], - ); + permissionApi.authorize.mockResolvedValue([ + { result: AuthorizeResult.ALLOW }, + ]); }); it('should return a ERROR_NOT_FOUND if no clusters are found', async () => { @@ -666,12 +666,11 @@ describe('KubernetesProxy', () => { describe('WebSocket', () => { const proxyPath = '/proxy'; - const proxyPort = 9000; const wsPath = '/ws'; - const wsPort = 9999; - let wsServer: WebSocketServer; - let expressApp: express.Express; + let wsPort: number; + let proxyPort: number; + let wsEchoServer: WebSocketServer; let expressServer: Server; const eventPromiseFactory = ( @@ -681,33 +680,38 @@ describe('KubernetesProxy', () => { beforeAll(async () => { await new Promise(resolve => { - expressApp = express().use( - Router() - .use(proxyPath, proxy.createRequestHandler({ permissionApi })) - .use(errorHandler()), - ); - - expressServer = expressApp.listen(proxyPort, '0.0.0.0', () => { - resolve(null); - }); + expressServer = express() + .use( + Router() + .use(proxyPath, proxy.createRequestHandler({ permissionApi })) + .use(errorHandler()), + ) + .listen(0, '0.0.0.0', () => { + proxyPort = (expressServer.address() as AddressInfo).port; + resolve(null); + }); }); - wsServer = new WebSocketServer({ port: wsPort, path: wsPath }); + wsEchoServer = new WebSocketServer({ + // server: expressServer, + port: 0, + path: wsPath, + }); + wsPort = (wsEchoServer.address() as AddressInfo).port; - wsServer.on('connection', (ws: WebSocket) => { + wsEchoServer.on('connection', (ws: WebSocket) => { ws.send('connected'); - // Echo message handling ws.on('message', (message: string) => { ws.send(message); }); }); - wsServer.on('error', console.error); + wsEchoServer.on('error', console.error); }); afterAll(() => { - wsServer.close(); + wsEchoServer.close(); expressServer.close(); }); @@ -730,6 +734,7 @@ describe('KubernetesProxy', () => { const wsProxyAddress = `ws://localhost:${proxyPort}${proxyPath}${wsPath}`; const wsAddress = `ws://localhost:${wsPort}${wsPath}`; + console.log('Ports: ', wsProxyAddress, wsAddress); // Let this request through so it reaches the express router above worker.use( From 48f18116919594835d3d6616c9fe0ee66db9219d Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 19 Jul 2023 19:13:20 -0500 Subject: [PATCH 125/440] Update plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 38ec471d4b..95d5be92cf 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -693,7 +693,6 @@ describe('KubernetesProxy', () => { }); wsEchoServer = new WebSocketServer({ - // server: expressServer, port: 0, path: wsPath, }); From cea15a09d03bdb671d5bf111716b563c21d2224e Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 19 Jul 2023 19:13:31 -0500 Subject: [PATCH 126/440] Update .changeset/chatty-seahorses-juggle.md Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- .changeset/chatty-seahorses-juggle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/chatty-seahorses-juggle.md b/.changeset/chatty-seahorses-juggle.md index 16d0fa7f64..8d699699a7 100644 --- a/.changeset/chatty-seahorses-juggle.md +++ b/.changeset/chatty-seahorses-juggle.md @@ -2,4 +2,4 @@ '@backstage/plugin-kubernetes-backend': patch --- -WebSocket requests path were not being rewritten by the proxy properly, now they do. +Fixed a bug where the proxy was not rewriting WebSocket request paths properly. From a33eed09a0a7c483caa71ab6a3480baa08dfa653 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Jaramillo Date: Wed, 26 Jul 2023 10:25:49 -0500 Subject: [PATCH 127/440] Update plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts Co-authored-by: Jamie Klassen Signed-off-by: Carlos Esteban Lopez Jaramillo --- plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index 95d5be92cf..15bc8ff68e 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -731,7 +731,7 @@ describe('KubernetesProxy', () => { authProvider: 'serviceAccount', } as ClusterDetails); - const wsProxyAddress = `ws://localhost:${proxyPort}${proxyPath}${wsPath}`; + const wsProxyAddress = `ws://127.0.0.1:${proxyPort}${proxyPath}${wsPath}`; const wsAddress = `ws://localhost:${wsPort}${wsPath}`; console.log('Ports: ', wsProxyAddress, wsAddress); From 2167b7eab09bea146fc71816d409883e4465b858 Mon Sep 17 00:00:00 2001 From: Robert Bunning Date: Mon, 31 Jul 2023 12:51:30 -0400 Subject: [PATCH 128/440] Add pagination support to newrelic plugin Signed-off-by: Robert Bunning --- .changeset/khaki-camels-rush.md | 5 + app-config.yaml | 2 + plugins/newrelic/README.md | 4 + plugins/newrelic/src/api/index.test.ts | 312 +++++++++++++++++++++++++ plugins/newrelic/src/api/index.ts | 91 ++++++-- plugins/newrelic/src/plugin.ts | 9 +- 6 files changed, 408 insertions(+), 15 deletions(-) create mode 100644 .changeset/khaki-camels-rush.md create mode 100644 plugins/newrelic/src/api/index.test.ts diff --git a/.changeset/khaki-camels-rush.md b/.changeset/khaki-camels-rush.md new file mode 100644 index 0000000000..a38600abf3 --- /dev/null +++ b/.changeset/khaki-camels-rush.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-newrelic': patch +--- + +The newrelic plugin now supports pagination when retrieving results from newrelic. It will no longer truncate results. To see all applications, the link header will need to be allowed through the proxy (see the newrelic plugin readme). diff --git a/app-config.yaml b/app-config.yaml index 2b562ee689..da505d390b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -70,6 +70,8 @@ proxy: target: https://api.newrelic.com/v2 headers: X-Api-Key: ${NEW_RELIC_REST_API_KEY} + allowedHeaders: + - link '/newrelic/api': target: https://api.newrelic.com diff --git a/plugins/newrelic/README.md b/plugins/newrelic/README.md index 8ac7ed2c72..14049ba39c 100644 --- a/plugins/newrelic/README.md +++ b/plugins/newrelic/README.md @@ -18,6 +18,8 @@ APIs. target: https://api.newrelic.com/v2 headers: X-Api-Key: ${NEW_RELIC_REST_API_KEY} + allowedHeaders: + - link ``` There is some types of api key on new relic, to this use must be `User` type of key, In your production deployment of Backstage, you would also need to ensure that @@ -33,6 +35,8 @@ APIs. '/newrelic/apm/api': headers: X-Api-Key: NRRA-YourActualApiKey + allowedHeaders: + - link ``` Read more about how to find or generate this key in diff --git a/plugins/newrelic/src/api/index.test.ts b/plugins/newrelic/src/api/index.test.ts new file mode 100644 index 0000000000..13d9c5304d --- /dev/null +++ b/plugins/newrelic/src/api/index.test.ts @@ -0,0 +1,312 @@ +/* + * 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 { NewRelicClient } from '.'; +import { FetchApi } from '@backstage/core-plugin-api'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; + +beforeEach(() => { + jest.resetAllMocks(); +}); + +describe('NewRelicClient', () => { + test.each([ + ['https://test.test/BASEPATH/apm/api/applications.json', '/BASEPATH'], + ['https://test.test/BASEPATH2/apm/api/applications.json', '/BASEPATH2'], + ['https://test.testBASEPATH3/apm/api/applications.json', 'BASEPATH3'], + ['https://test.test/newrelic/apm/api/applications.json', undefined], + ])( + 'It correctly forms the request url (%p) when proxyPathBase is %p', + async (expectedUrl, basePathOverride) => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedFetchApi: FetchApi = { + fetch: jest.fn().mockResolvedValueOnce({ + ok: true, + json: async () => [], + headers: new Map(), + }), + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + proxyPathBase: basePathOverride, + }); + await client.getApplications(); + + expect(mockedFetchApi.fetch).toHaveBeenCalledWith(expectedUrl); + }, + ); + + it('Correctly reads all pages of results and returns the expected results', async () => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedApplicationOne = { + id: 1, + application_summary: { + apdex_score: 0, + error_rate: 100, + host_count: 500, + instance_count: 5000, + response_time: 20, + throughput: 500000, + }, + name: 'Testing Application #1', + language: 'en-us', + health_status: 'Failing', + reporting: true, + settings: { + app_apdex_threshold: 0, + end_user_apdex_threshold: 0, + enable_real_user_monitoring: true, + use_server_side_config: true, + }, + }; + + const mockedApplicationTwo = { + id: 2, + name: 'Testing Application #2', + language: 'en-us', + health_status: 'Working', + reporting: true, + settings: { + app_apdex_threshold: 0, + end_user_apdex_threshold: 0, + enable_real_user_monitoring: true, + use_server_side_config: true, + }, + }; + + const mockedApplicationThree = { + id: 3, + application_summary: { + apdex_score: -900, + error_rate: 0, + host_count: 0, + instance_count: 0, + response_time: 0, + throughput: 0, + }, + name: 'Testing Application #3', + language: 'en-us', + health_status: 'Waiting', + reporting: false, + settings: { + app_apdex_threshold: 1000, + end_user_apdex_threshold: 500, + enable_real_user_monitoring: false, + use_server_side_config: false, + }, + }; + + const mockedFetchApi: FetchApi = { + fetch: jest + .fn() + .mockResolvedValueOnce({ + ok: true, + json: async () => ({ applications: [mockedApplicationOne] }), + headers: new Map([ + [ + 'link', + '; rel="next", ; rel="next"', + ], + ['otherheader', 'otherValue'], + ]), + }) + .mockResolvedValueOnce({ + ok: true, + json: async () => ({ applications: [] }), + headers: new Map([ + ['Link', '; rel="next",'], + ]), + }) + .mockResolvedValueOnce({ + ok: true, + json: async () => ({ + applications: [mockedApplicationTwo, mockedApplicationThree], + }), + headers: new Map([ + [ + 'link', + '; rel="first", ; rel="next"', + ], + ]), + }), + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + }); + const actual = await client.getApplications(); + const expected = { + applications: [ + mockedApplicationOne, + mockedApplicationTwo, + mockedApplicationThree, + ], + }; + + expect(mockedFetchApi.fetch).toHaveBeenCalledTimes(3); + expect(mockedFetchApi.fetch).toHaveBeenCalledWith( + 'https://test.test/newrelic/apm/api/applications.json', + ); + expect(mockedFetchApi.fetch).toHaveBeenCalledWith( + 'https://next.page/page2', + ); + expect(mockedFetchApi.fetch).toHaveBeenCalledWith( + 'https://next.page/page3', + ); + expect(actual).toStrictEqual(expected); + }); + + test.each([['LINK'], ['lINK']])( + 'It does not attempt pagination when the link header name is invalid (%p)', + async linkHeaderName => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedFetchApi: FetchApi = { + fetch: jest.fn().mockResolvedValueOnce({ + ok: true, + json: async () => ({ applications: [] }), + headers: new Map([ + [ + linkHeaderName, + '; rel="next", ; rel="next"', + ], + ['otherheader', 'otherValue'], + ]), + }), + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + }); + await client.getApplications(); + + expect(mockedFetchApi.fetch).toHaveBeenCalledTimes(1); + expect(mockedFetchApi.fetch).toHaveBeenCalledWith( + 'https://test.test/newrelic/apm/api/applications.json', + ); + }, + ); + + test.each([ + [''], + ['<> rel=""'], + ['<>; rel=""'], + ['; rel=""'], + ['<>; rel:"value"'], + ['; rel: "next"'], + ['ABCDE'], + ])( + 'It does not attempt pagination when the link header value is invalid (%p)', + async linkHeaderValue => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedFetchApi: FetchApi = { + fetch: jest.fn().mockResolvedValueOnce({ + ok: true, + json: async () => ({ applications: [] }), + headers: new Map([ + ['Link', linkHeaderValue], + ['otherheader', 'otherValue'], + ]), + }), + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + }); + await client.getApplications(); + + expect(mockedFetchApi.fetch).toHaveBeenCalledTimes(1); + expect(mockedFetchApi.fetch).toHaveBeenCalledWith( + 'https://test.test/newrelic/apm/api/applications.json', + ); + }, + ); + + test.each([ + [ + { + ok: false, + statusText: 'statusText', + json: async () => ({ error: { title: 'TESTING' } }), + }, + ], + [ + { + ok: false, + statusText: 'statusText', + json: async () => ({}), + }, + ], + ])( + 'It returns an empty array of applications when the fetch is not okay', + async fetchResult => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedFetchApi: FetchApi = { + fetch: jest.fn().mockResolvedValueOnce({ + ok: true, + json: async () => fetchResult, + }), + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + }); + const actual = await client.getApplications(); + + expect(actual).toStrictEqual({ applications: [] }); + }, + ); + + it('Returns an empty array when the fetch itself throws an error', async () => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedFetchApi: FetchApi = { + fetch: () => { + throw new Error('TESTING'); + }, + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + }); + const actual = await client.getApplications(); + + expect(actual).toStrictEqual({ applications: [] }); + }); +}); diff --git a/plugins/newrelic/src/api/index.ts b/plugins/newrelic/src/api/index.ts index 2734dd2b4f..9c95f3fe1f 100644 --- a/plugins/newrelic/src/api/index.ts +++ b/plugins/newrelic/src/api/index.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { createApiRef, DiscoveryApi } from '@backstage/core-plugin-api'; +import { + createApiRef, + DiscoveryApi, + FetchApi, +} from '@backstage/core-plugin-api'; export type NewRelicApplication = { id: number; @@ -61,6 +65,7 @@ const DEFAULT_PROXY_PATH_BASE = '/newrelic'; type Options = { discoveryApi: DiscoveryApi; + fetchApi: FetchApi; /** * Path to use for requests via the proxy, defaults to /newrelic */ @@ -71,27 +76,58 @@ export interface NewRelicApi { getApplications(): Promise; } +interface PaginationInformation { + nextPageLink: string; + relation: string; +} + +interface NewRelicPageReadResult { + hasMoreApplications: boolean; + pagination: PaginationInformation | undefined; + applicationsFromReadPage: NewRelicApplication[]; +} + export class NewRelicClient implements NewRelicApi { private readonly discoveryApi: DiscoveryApi; + private readonly fetchApi: FetchApi; private readonly proxyPathBase: string; constructor(options: Options) { this.discoveryApi = options.discoveryApi; + this.fetchApi = options.fetchApi; this.proxyPathBase = options.proxyPathBase ?? DEFAULT_PROXY_PATH_BASE; } async getApplications(): Promise { - const url = await this.getApiUrl('apm', 'applications.json'); - const response = await fetch(url); - let responseJson; + const proxyUrl = await this.discoveryApi.getBaseUrl('proxy'); + let targetUrl = `${proxyUrl}${this.proxyPathBase}/apm/api/applications.json`; + let hasNextPage = true; try { - responseJson = await response.json(); - } catch (e) { - responseJson = { applications: [] }; - } + let applications: NewRelicApplication[] = []; - if (response.status !== 200) { + do { + const { hasMoreApplications, pagination, applicationsFromReadPage } = + await this.fetchNewRelic(targetUrl); + + hasNextPage = hasMoreApplications; + targetUrl = pagination!.nextPageLink; + applications = applications.concat(applicationsFromReadPage); + } while (hasNextPage); + + return { applications }; + } catch (e) { + return { applications: [] }; + } + } + + private async fetchNewRelic( + targetUrl: string, + ): Promise { + const response = await this.fetchApi.fetch(targetUrl); + const responseJson = await response.json(); + + if (!response.ok) { throw new Error( `Error communicating with New Relic: ${ responseJson?.error?.title || response.statusText @@ -99,11 +135,40 @@ export class NewRelicClient implements NewRelicApi { ); } - return responseJson; + const readResponse = responseJson as NewRelicApplications; + const linkHeader = + response.headers.get('Link') || response.headers.get('link'); + const pagination = this.parseLinkHeader(linkHeader); + + return { + hasMoreApplications: !!(pagination && pagination.relation === 'next'), + pagination, + applicationsFromReadPage: readResponse.applications, + }; } - private async getApiUrl(product: string, path: string) { - const proxyUrl = await this.discoveryApi.getBaseUrl('proxy'); - return `${proxyUrl}${this.proxyPathBase}/${product}/api/${path}`; + private parseLinkHeader( + linkHeader: string | null, + ): PaginationInformation | undefined { + if (!linkHeader) { + return undefined; + } + + const nextRelevantLink = linkHeader.replaceAll(' ', '').split(',')[0]; + + // Link should be of the format ;rel="relation" + const linkParts = nextRelevantLink.match(/^<(.+)>;rel="(.+)"$/); + const nextPageLink = linkParts?.[1]; + const relation = linkParts?.[2]; + const isValidLink = !!(!!linkParts && nextPageLink && relation); + + if (!nextRelevantLink || !isValidLink) { + return undefined; + } + + return { + nextPageLink, + relation, + }; } } diff --git a/plugins/newrelic/src/plugin.ts b/plugins/newrelic/src/plugin.ts index 0387c50aa9..da7cae9b93 100644 --- a/plugins/newrelic/src/plugin.ts +++ b/plugins/newrelic/src/plugin.ts @@ -20,6 +20,7 @@ import { createPlugin, createRouteRef, discoveryApiRef, + fetchApiRef, createRoutableExtension, } from '@backstage/core-plugin-api'; @@ -33,8 +34,12 @@ export const newRelicPlugin = createPlugin({ apis: [ createApiFactory({ api: newRelicApiRef, - deps: { discoveryApi: discoveryApiRef }, - factory: ({ discoveryApi }) => new NewRelicClient({ discoveryApi }), + deps: { + discoveryApi: discoveryApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, fetchApi }) => + new NewRelicClient({ discoveryApi, fetchApi }), }), ], routes: { From 38e787a0e8104f3cfe6dc390427ba28839bd52a5 Mon Sep 17 00:00:00 2001 From: Robbert van Markus Date: Mon, 31 Jul 2023 20:04:23 +0200 Subject: [PATCH 129/440] fixed oauth2proxy configuration example Signed-off-by: Robbert van Markus --- docs/auth/oauth2-proxy/provider.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/auth/oauth2-proxy/provider.md b/docs/auth/oauth2-proxy/provider.md index 9c8f681138..3e0d3237a2 100644 --- a/docs/auth/oauth2-proxy/provider.md +++ b/docs/auth/oauth2-proxy/provider.md @@ -20,8 +20,10 @@ The provider configuration can be added to your `app-config.yaml` under the root ```yaml title="app-config.yaml" auth: + environment: development providers: - oauth2Proxy: {} + oauth2Proxy: + development: {} ``` Right now no configuration options are supported, but the empty object is needed From d9b78b24348ca3bb8a69f89718622dce0587d885 Mon Sep 17 00:00:00 2001 From: Robbert van Markus Date: Mon, 31 Jul 2023 20:48:54 +0200 Subject: [PATCH 130/440] add link to full example without a matching user Signed-off-by: Robbert van Markus --- docs/auth/oauth2-proxy/provider.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/auth/oauth2-proxy/provider.md b/docs/auth/oauth2-proxy/provider.md index 3e0d3237a2..5cff655c02 100644 --- a/docs/auth/oauth2-proxy/provider.md +++ b/docs/auth/oauth2-proxy/provider.md @@ -60,6 +60,8 @@ providerFactories: { }, ``` +[An example on how to sign a user in without a matching user](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/auth.ts) + ## Adding the provider to the Backstage frontend It is recommended to use the `ProxiedSignInPage` for this provider, which is From 2b41e9397486c1fb1bcc2b137c605e1282d9487a Mon Sep 17 00:00:00 2001 From: Chris James Date: Mon, 31 Jul 2023 16:43:53 -0700 Subject: [PATCH 131/440] Adding the ability to not render the change events tab for the PD card when viewing an entity Signed-off-by: Chris James --- .../components/EntityPagerDutyCard/index.tsx | 11 +++++++++-- .../src/components/PagerDutyCard/index.tsx | 19 ++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/plugins/pagerduty/src/components/EntityPagerDutyCard/index.tsx b/plugins/pagerduty/src/components/EntityPagerDutyCard/index.tsx index 50e6f3a096..b252069b90 100644 --- a/plugins/pagerduty/src/components/EntityPagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/EntityPagerDutyCard/index.tsx @@ -30,12 +30,19 @@ export const isPluginApplicableToEntity = (entity: Entity) => /** @public */ export type EntityPagerDutyCardProps = { readOnly?: boolean; + disableChangeEvents?: boolean; }; /** @public */ export const EntityPagerDutyCard = (props: EntityPagerDutyCardProps) => { - const { readOnly } = props; + const { readOnly, disableChangeEvents } = props; const { entity } = useEntity(); const pagerDutyEntity = getPagerDutyEntity(entity); - return ; + return ( + + ); }; diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index bb89865c5f..a10dc1984b 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -46,11 +46,12 @@ const BasicCard = ({ children }: { children: ReactNode }) => ( /** @public */ export type PagerDutyCardProps = PagerDutyEntity & { readOnly?: boolean; + disableChangeEvents?: boolean; }; /** @public */ export const PagerDutyCard = (props: PagerDutyCardProps) => { - const { readOnly, integrationKey, name } = props; + const { readOnly, disableChangeEvents, integrationKey, name } = props; const api = useApi(pagerDutyApiRef); const [refreshIncidents, setRefreshIncidents] = useState(false); const [refreshChangeEvents, setRefreshChangeEvents] = @@ -169,12 +170,16 @@ export const PagerDutyCard = (props: PagerDutyCardProps) => { refreshIncidents={refreshIncidents} /> - - - + <> + {disableChangeEvents === true && ( + + + + )} + From e33e07547ec592c5e03970b7dd844b5e53faaa20 Mon Sep 17 00:00:00 2001 From: Chris James Date: Mon, 31 Jul 2023 16:46:06 -0700 Subject: [PATCH 132/440] Fix conditional Signed-off-by: Chris James --- plugins/pagerduty/src/components/PagerDutyCard/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx index a10dc1984b..332d823f1f 100644 --- a/plugins/pagerduty/src/components/PagerDutyCard/index.tsx +++ b/plugins/pagerduty/src/components/PagerDutyCard/index.tsx @@ -171,7 +171,7 @@ export const PagerDutyCard = (props: PagerDutyCardProps) => { /> <> - {disableChangeEvents === true && ( + {disableChangeEvents !== true && ( Date: Mon, 31 Jul 2023 17:00:30 -0700 Subject: [PATCH 133/440] Adding api report Signed-off-by: Chris James --- plugins/pagerduty/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/pagerduty/api-report.md b/plugins/pagerduty/api-report.md index dd24aa9bec..f398a6bee7 100644 --- a/plugins/pagerduty/api-report.md +++ b/plugins/pagerduty/api-report.md @@ -22,6 +22,7 @@ export const EntityPagerDutyCard: ( // @public (undocumented) export type EntityPagerDutyCardProps = { readOnly?: boolean; + disableChangeEvents?: boolean; }; // @public (undocumented) From b0e3b6c074bf81f3ed7ff168b866e68366938f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 31 Jul 2023 15:27:03 +0200 Subject: [PATCH 134/440] fix tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../src/actions/fetch/cookiecutter.test.ts | 4 ++-- .../src/actions/fetch/rails/index.test.ts | 6 +++--- .../src/actions/fetch/rails/railsNewRunner.test.ts | 2 +- .../src/scaffolder/actions/builtin/fetch/plain.test.ts | 5 ++++- .../scaffolder/actions/builtin/fetch/plainFile.test.ts | 5 ++++- .../scaffolder/actions/builtin/fetch/template.test.ts | 9 +++++---- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts index 9d7f06afc8..f944b6e598 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts @@ -33,8 +33,8 @@ const executeShellCommand = jest.fn(); const commandExists = jest.fn(); const fetchContents = jest.fn(); -jest.mock('@backstage/plugin-scaffolder-backend', () => ({ - ...jest.requireActual('@backstage/plugin-scaffolder-backend'), +jest.mock('@backstage/plugin-scaffolder-node', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-node'), fetchContents: (...args: any[]) => fetchContents(...args), executeShellCommand: (...args: any[]) => executeShellCommand(...args), })); diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts index 37d0bcac4a..2a93644f57 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts @@ -15,8 +15,8 @@ */ const mockRailsTemplater = { run: jest.fn() }; -jest.mock('@backstage/plugin-scaffolder-backend', () => ({ - ...jest.requireActual('@backstage/plugin-scaffolder-backend'), +jest.mock('@backstage/plugin-scaffolder-node', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-node'), fetchContents: jest.fn(), })); jest.mock('./railsNewRunner', () => { @@ -39,7 +39,7 @@ import os from 'os'; import { resolve as resolvePath } from 'path'; import { PassThrough } from 'stream'; import { createFetchRailsAction } from './index'; -import { fetchContents } from '@backstage/plugin-scaffolder-backend'; +import { fetchContents } from '@backstage/plugin-scaffolder-node'; describe('fetch:rails', () => { const integrations = ScmIntegrations.fromConfig( diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts index 433a1b7965..d7e7b12158 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts @@ -17,7 +17,7 @@ const executeShellCommand = jest.fn(); const commandExists = jest.fn(); -jest.mock('@backstage/plugin-scaffolder-backend', () => ({ +jest.mock('@backstage/plugin-scaffolder-node', () => ({ executeShellCommand: (...args: any[]) => executeShellCommand(...args), })); jest.mock( diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts index 3a67489eca..249941096d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.test.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -jest.mock('./helpers'); +jest.mock('@backstage/plugin-scaffolder-node', () => { + const actual = jest.requireActual('@backstage/plugin-scaffolder-node'); + return { ...actual, fetchContents: jest.fn() }; +}); import os from 'os'; import { resolve as resolvePath } from 'path'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts index e6ed858b09..084b08d640 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.test.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -jest.mock('./helpers'); +jest.mock('@backstage/plugin-scaffolder-node', () => { + const actual = jest.requireActual('@backstage/plugin-scaffolder-node'); + return { ...actual, fetchFile: jest.fn() }; +}); import os from 'os'; import { resolve as resolvePath } from 'path'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index aee1fdcb32..95f8c7b954 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +jest.mock('@backstage/plugin-scaffolder-node', () => { + const actual = jest.requireActual('@backstage/plugin-scaffolder-node'); + return { ...actual, fetchContents: jest.fn() }; +}); + import os from 'os'; import { join as joinPath, sep as pathSep } from 'path'; import fs from 'fs-extra'; @@ -32,10 +37,6 @@ import { TemplateAction, } from '@backstage/plugin-scaffolder-node'; -jest.mock('./helpers', () => ({ - fetchContents: jest.fn(), -})); - type FetchTemplateInput = ReturnType< typeof createFetchTemplateAction > extends TemplateAction From 870c48f54fdd4dd315f47ce1a5ee942197d1b6e9 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 1 Aug 2023 12:07:07 +0200 Subject: [PATCH 135/440] backend-test-utils: renamed mockServices.config to .rootConfig Signed-off-by: Patrik Oldsberg --- .../02-testing.md | 2 +- packages/backend-test-utils/api-report.md | 26 +++++++++---------- .../src/next/services/mockServices.ts | 6 ++--- .../src/next/wiring/TestBackend.ts | 2 +- ...ModuleBitbucketCloudEntityProvider.test.ts | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/backend-system/building-plugins-and-modules/02-testing.md b/docs/backend-system/building-plugins-and-modules/02-testing.md index 7f93fab45b..fdd8cdb1e3 100644 --- a/docs/backend-system/building-plugins-and-modules/02-testing.md +++ b/docs/backend-system/building-plugins-and-modules/02-testing.md @@ -37,7 +37,7 @@ describe('myPlugin', () => { const { server } = await startTestBackend({ features: [myPlugin()], - services: [mockServices.config.factory({ data: fakeConfig })], + services: [mockServices.rootConfig.factory({ data: fakeConfig })], }); const response = await request(server).get('/api/example/get-value'); diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 0d643339d8..ef5e987191 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -36,19 +36,6 @@ export namespace mockServices { factory: () => ServiceFactory; } // (undocumented) - export function config(options?: config.Options): RootConfigService; - // (undocumented) - export namespace config { - // (undocumented) - export type Options = { - data?: JsonObject; - }; - const // (undocumented) - factory: ( - options?: Options | undefined, - ) => ServiceFactory; - } - // (undocumented) export namespace database { const // (undocumented) factory: () => ServiceFactory; @@ -83,6 +70,19 @@ export namespace mockServices { factory: () => ServiceFactory; } // (undocumented) + export function rootConfig(options?: rootConfig.Options): RootConfigService; + // (undocumented) + export namespace rootConfig { + // (undocumented) + export type Options = { + data?: JsonObject; + }; + const // (undocumented) + factory: ( + options?: Options | undefined, + ) => ServiceFactory; + } + // (undocumented) export namespace rootLifecycle { const // (undocumented) factory: () => ServiceFactory; diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 71e0a6556d..0455b9f1ae 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -61,13 +61,13 @@ function simpleFactory< * @public */ export namespace mockServices { - export function config(options?: config.Options): RootConfigService { + export function rootConfig(options?: rootConfig.Options): RootConfigService { return new ConfigReader(options?.data, 'mock-config'); } - export namespace config { + export namespace rootConfig { export type Options = { data?: JsonObject }; - export const factory = simpleFactory(coreServices.rootConfig, config); + export const factory = simpleFactory(coreServices.rootConfig, rootConfig); } export function rootLogger(options?: rootLogger.Options): LoggerService { diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index e62de5b5de..8a4e1d8471 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -73,7 +73,7 @@ export interface TestBackend extends Backend { const defaultServiceFactories = [ mockServices.cache.factory(), - mockServices.config.factory(), + mockServices.rootConfig.factory(), mockServices.database.factory(), mockServices.httpRouter.factory(), mockServices.identity.factory(), diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts index a34eae3750..b46304d4e3 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts @@ -56,7 +56,7 @@ describe('catalogModuleBitbucketCloudEntityProvider', () => { [eventsExtensionPoint, eventsExtensionPointImpl], ], services: [ - mockServices.config.factory({ + mockServices.rootConfig.factory({ data: { catalog: { providers: { From b9c57a4f857ebb117c328d0f1b84b188d616c09b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 1 Aug 2023 12:07:30 +0200 Subject: [PATCH 136/440] changesets: tweak config service rename changesets Signed-off-by: Patrik Oldsberg --- .changeset/angry-beers-relate.md | 3 --- .changeset/mighty-lions-search-2.md | 5 +++++ .changeset/mighty-lions-search-3.md | 5 +++++ .changeset/mighty-lions-search.md | 5 +---- 4 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 .changeset/mighty-lions-search-2.md create mode 100644 .changeset/mighty-lions-search-3.md diff --git a/.changeset/angry-beers-relate.md b/.changeset/angry-beers-relate.md index 52db351879..4e51de99e4 100644 --- a/.changeset/angry-beers-relate.md +++ b/.changeset/angry-beers-relate.md @@ -19,14 +19,11 @@ '@backstage/plugin-catalog-backend-module-gcp': patch '@backstage/plugin-search-backend-module-pg': patch '@backstage/plugin-azure-devops-backend': patch -'@backstage/backend-plugin-api': patch -'@backstage/backend-test-utils': patch '@backstage/plugin-kubernetes-backend': patch '@backstage/plugin-lighthouse-backend': patch '@backstage/plugin-permission-backend': patch '@backstage/plugin-scaffolder-backend': patch '@backstage/backend-defaults': patch -'@backstage/backend-app-api': patch '@backstage/plugin-airbrake-backend': patch '@backstage/plugin-devtools-backend': patch '@backstage/plugin-periskop-backend': patch diff --git a/.changeset/mighty-lions-search-2.md b/.changeset/mighty-lions-search-2.md new file mode 100644 index 0000000000..a7fb1a4a7d --- /dev/null +++ b/.changeset/mighty-lions-search-2.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': minor +--- + +**BREAKING**: Renamed `mockServices.config` to `mockServices.rootConfig`. diff --git a/.changeset/mighty-lions-search-3.md b/.changeset/mighty-lions-search-3.md new file mode 100644 index 0000000000..6b381ce2b2 --- /dev/null +++ b/.changeset/mighty-lions-search-3.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': minor +--- + +**BREAKING**: Renamed `configServiceFactory` to `rootConfigServiceFactory`. diff --git a/.changeset/mighty-lions-search.md b/.changeset/mighty-lions-search.md index a23545b274..6d2ffd02c0 100644 --- a/.changeset/mighty-lions-search.md +++ b/.changeset/mighty-lions-search.md @@ -1,8 +1,5 @@ --- '@backstage/backend-plugin-api': minor -'@backstage/backend-app-api': minor -'@backstage/backend-common': minor -'@backstage/backend-test-utils': minor --- -Renamed `ConfigService` to `RootConfigService` +**BREAKING**: Renamed `coreServices.config` to `coreServices.rootConfig`. From 48b6a04ad045a8e64403ee03dada5969d45bdfcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Mota?= Date: Tue, 1 Aug 2023 13:59:43 +0200 Subject: [PATCH 137/440] add changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Mota --- .changeset/tender-fireants-cheer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tender-fireants-cheer.md diff --git a/.changeset/tender-fireants-cheer.md b/.changeset/tender-fireants-cheer.md new file mode 100644 index 0000000000..1d829f673b --- /dev/null +++ b/.changeset/tender-fireants-cheer.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools': patch +--- + +Fix readme typo From 572abc7edf555a54d97f38586008b2e3fc528529 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 1 Aug 2023 12:30:00 +0000 Subject: [PATCH 138/440] Version Packages (next) --- .changeset/create-app-1690892926.md | 5 + .changeset/pre.json | 31 +- docs/releases/v1.17.0-next.1-changelog.md | 2208 +++++++++++++++++ package.json | 2 +- packages/app/CHANGELOG.md | 75 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 20 + packages/backend-app-api/package.json | 2 +- packages/backend-common/CHANGELOG.md | 18 + packages/backend-common/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 14 + packages/backend-defaults/package.json | 2 +- packages/backend-next/CHANGELOG.md | 31 + packages/backend-next/package.json | 2 +- packages/backend-openapi-utils/CHANGELOG.md | 8 + packages/backend-openapi-utils/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 16 + packages/backend-plugin-api/package.json | 2 +- packages/backend-tasks/CHANGELOG.md | 10 + packages/backend-tasks/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 17 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 55 + packages/backend/package.json | 2 +- packages/cli-node/CHANGELOG.md | 10 + packages/cli-node/package.json | 2 +- packages/cli/CHANGELOG.md | 16 + packages/cli/package.json | 2 +- packages/config-loader/CHANGELOG.md | 16 + packages/config-loader/package.json | 2 +- packages/create-app/CHANGELOG.md | 8 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 15 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 9 + packages/e2e-test/package.json | 2 +- packages/integration-react/CHANGELOG.md | 12 + packages/integration-react/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 9 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 19 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 11 + packages/techdocs-cli/package.json | 2 +- plugins/adr-backend/CHANGELOG.md | 15 + plugins/adr-backend/package.json | 2 +- plugins/adr/CHANGELOG.md | 16 + plugins/adr/package.json | 2 +- plugins/airbrake-backend/CHANGELOG.md | 11 + plugins/airbrake-backend/package.json | 2 +- plugins/airbrake/CHANGELOG.md | 14 + plugins/airbrake/package.json | 2 +- plugins/allure/CHANGELOG.md | 12 + plugins/allure/package.json | 2 +- plugins/analytics-module-ga/CHANGELOG.md | 11 + plugins/analytics-module-ga/package.json | 2 +- plugins/analytics-module-ga4/CHANGELOG.md | 11 + plugins/analytics-module-ga4/package.json | 2 +- plugins/apache-airflow/CHANGELOG.md | 9 + plugins/apache-airflow/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 12 + plugins/api-docs/package.json | 2 +- plugins/apollo-explorer/CHANGELOG.md | 10 + plugins/apollo-explorer/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 12 + plugins/app-backend/package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 14 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 10 + plugins/auth-node/package.json | 2 +- plugins/azure-devops-backend/CHANGELOG.md | 12 + plugins/azure-devops-backend/package.json | 2 +- plugins/azure-sites-backend/CHANGELOG.md | 9 + plugins/azure-sites-backend/package.json | 2 +- plugins/badges-backend/CHANGELOG.md | 14 + plugins/badges-backend/package.json | 2 +- plugins/bazaar-backend/CHANGELOG.md | 13 + plugins/bazaar-backend/package.json | 2 +- plugins/bazaar/CHANGELOG.md | 16 + plugins/bazaar/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 8 + plugins/bitbucket-cloud-common/package.json | 2 +- plugins/bitrise/CHANGELOG.md | 12 + plugins/bitrise/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 21 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 18 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 19 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 18 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 21 + .../package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- .../CHANGELOG.md | 17 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 13 + .../catalog-backend-module-ldap/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 30 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-customized/CHANGELOG.md | 8 + plugins/catalog-customized/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 14 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 16 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 13 + plugins/catalog-node/package.json | 2 +- plugins/catalog/CHANGELOG.md | 19 + plugins/catalog/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/code-climate/CHANGELOG.md | 12 + plugins/code-climate/package.json | 2 +- plugins/code-coverage-backend/CHANGELOG.md | 13 + plugins/code-coverage-backend/package.json | 2 +- plugins/code-coverage/CHANGELOG.md | 14 + plugins/code-coverage/package.json | 2 +- plugins/codescene/CHANGELOG.md | 12 + plugins/codescene/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 13 + plugins/config-schema/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 30 + plugins/devtools-backend/package.json | 2 +- plugins/devtools-common/CHANGELOG.md | 9 + plugins/devtools-common/package.json | 2 +- plugins/devtools/CHANGELOG.md | 14 + plugins/devtools/package.json | 2 +- plugins/dynatrace/CHANGELOG.md | 12 + plugins/dynatrace/package.json | 2 +- plugins/entity-feedback-backend/CHANGELOG.md | 14 + plugins/entity-feedback-backend/package.json | 2 +- plugins/entity-feedback-common/CHANGELOG.md | 6 + plugins/entity-feedback-common/package.json | 2 +- plugins/entity-feedback/CHANGELOG.md | 14 + plugins/entity-feedback/package.json | 2 +- plugins/entity-validation/CHANGELOG.md | 15 + plugins/entity-validation/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 9 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 9 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 11 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 11 + .../events-backend-module-gitlab/package.json | 2 +- .../events-backend-test-utils/CHANGELOG.md | 8 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 12 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 8 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 11 + .../example-todo-list-backend/package.json | 2 +- plugins/explore-backend/CHANGELOG.md | 13 + plugins/explore-backend/package.json | 2 +- plugins/firehydrant/CHANGELOG.md | 12 + plugins/firehydrant/package.json | 2 +- plugins/gcalendar/CHANGELOG.md | 11 + plugins/gcalendar/package.json | 2 +- plugins/git-release-manager/CHANGELOG.md | 11 + plugins/git-release-manager/package.json | 2 +- plugins/github-actions/CHANGELOG.md | 13 + plugins/github-actions/package.json | 2 +- plugins/github-deployments/CHANGELOG.md | 15 + plugins/github-deployments/package.json | 2 +- plugins/github-issues/CHANGELOG.md | 14 + plugins/github-issues/package.json | 2 +- plugins/graphql-backend/CHANGELOG.md | 9 + plugins/graphql-backend/package.json | 2 +- plugins/graphql-voyager/CHANGELOG.md | 10 + plugins/graphql-voyager/package.json | 2 +- plugins/ilert/CHANGELOG.md | 13 + plugins/ilert/package.json | 2 +- plugins/jenkins-backend/CHANGELOG.md | 17 + plugins/jenkins-backend/package.json | 2 +- plugins/jenkins-common/CHANGELOG.md | 9 + plugins/jenkins-common/package.json | 2 +- plugins/jenkins/CHANGELOG.md | 13 + plugins/jenkins/package.json | 2 +- plugins/kafka-backend/CHANGELOG.md | 12 + plugins/kafka-backend/package.json | 2 +- plugins/kafka/CHANGELOG.md | 13 + plugins/kafka/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 20 + plugins/kubernetes-backend/package.json | 2 +- plugins/lighthouse-backend/CHANGELOG.md | 16 + plugins/lighthouse-backend/package.json | 2 +- plugins/linguist-backend/CHANGELOG.md | 17 + plugins/linguist-backend/package.json | 2 +- plugins/linguist-common/CHANGELOG.md | 6 + plugins/linguist-common/package.json | 2 +- plugins/linguist/CHANGELOG.md | 13 + plugins/linguist/package.json | 2 +- plugins/microsoft-calendar/CHANGELOG.md | 12 + plugins/microsoft-calendar/package.json | 2 +- plugins/newrelic-dashboard/CHANGELOG.md | 12 + plugins/newrelic-dashboard/package.json | 2 +- plugins/nomad-backend/CHANGELOG.md | 10 + plugins/nomad-backend/package.json | 2 +- plugins/nomad/CHANGELOG.md | 13 + plugins/nomad/package.json | 2 +- plugins/octopus-deploy/CHANGELOG.md | 12 + plugins/octopus-deploy/package.json | 2 +- plugins/org-react/CHANGELOG.md | 13 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 12 + plugins/org/package.json | 2 +- plugins/periskop-backend/CHANGELOG.md | 11 + plugins/periskop-backend/package.json | 2 +- plugins/periskop/CHANGELOG.md | 13 + plugins/periskop/package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 15 + plugins/permission-backend/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 12 + plugins/permission-node/package.json | 2 +- plugins/playlist-backend/CHANGELOG.md | 16 + plugins/playlist-backend/package.json | 2 +- plugins/playlist-common/CHANGELOG.md | 8 + plugins/playlist-common/package.json | 2 +- plugins/playlist/CHANGELOG.md | 19 + plugins/playlist/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 11 + plugins/proxy-backend/package.json | 2 +- plugins/rollbar-backend/CHANGELOG.md | 8 + plugins/rollbar-backend/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 25 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 15 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 22 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 13 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 19 + .../package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 14 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 20 + plugins/search-backend/package.json | 2 +- plugins/shortcuts/CHANGELOG.md | 11 + plugins/shortcuts/package.json | 2 +- plugins/sonarqube-backend/CHANGELOG.md | 10 + plugins/sonarqube-backend/package.json | 2 +- plugins/sonarqube/CHANGELOG.md | 13 + plugins/sonarqube/package.json | 2 +- plugins/stack-overflow-backend/CHANGELOG.md | 9 + plugins/stack-overflow-backend/package.json | 2 +- plugins/stack-overflow/CHANGELOG.md | 14 + plugins/stack-overflow/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/tech-insights-backend/CHANGELOG.md | 15 + plugins/tech-insights-backend/package.json | 2 +- plugins/tech-insights-node/CHANGELOG.md | 11 + plugins/tech-insights-node/package.json | 2 +- plugins/tech-insights/CHANGELOG.md | 15 + plugins/tech-insights/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 16 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 19 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 13 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 18 + plugins/techdocs/package.json | 2 +- plugins/todo-backend/CHANGELOG.md | 16 + plugins/todo-backend/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 13 + plugins/user-settings-backend/package.json | 2 +- plugins/vault-backend/CHANGELOG.md | 10 + plugins/vault-backend/package.json | 2 +- plugins/xcmetrics/CHANGELOG.md | 11 + plugins/xcmetrics/package.json | 2 +- 314 files changed, 4604 insertions(+), 158 deletions(-) create mode 100644 .changeset/create-app-1690892926.md create mode 100644 docs/releases/v1.17.0-next.1-changelog.md create mode 100644 plugins/catalog-backend-module-gcp/CHANGELOG.md diff --git a/.changeset/create-app-1690892926.md b/.changeset/create-app-1690892926.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1690892926.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/pre.json b/.changeset/pre.json index 46dfaafe4e..605f1ea771 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -229,26 +229,53 @@ "@backstage/plugin-vault": "0.1.14", "@backstage/plugin-vault-backend": "0.3.3", "@backstage/plugin-xcmetrics": "0.2.40", - "@backstage/plugin-analytics-module-newrelic-browser": "0.0.0" + "@backstage/plugin-analytics-module-newrelic-browser": "0.0.0", + "@backstage/plugin-catalog-backend-module-gcp": "0.0.0" }, "changesets": [ "analytics-millenial-whoop", + "angry-beers-relate", "chatty-foxes-buy", + "chatty-seahorses-juggle", + "chilly-keys-count", + "cold-numbers-sleep", "create-app-1690284535", + "create-app-1690892926", + "dirty-chefs-listen", "gorgeous-months-doubt", + "hungry-shrimps-care", + "khaki-flies-draw", + "kind-cougars-allow", "large-experts-poke", + "large-vans-cross", "loud-garlics-press", "mean-squids-relax", + "mighty-lions-search-2", + "mighty-lions-search-3", + "mighty-lions-search", + "neat-coins-raise", "neat-lamps-press", + "odd-avocados-buy", "pink-squids-nail", + "popular-fans-camp", "quiet-starfishes-kick", "rare-pens-exist", + "rich-zoos-occur", "rude-feet-sparkle", "search-donuts-wash", "selfish-coats-shout", "serious-bats-repair", + "slimy-kids-jam", "smart-pandas-applaud", + "stale-wombats-talk", + "strong-bobcats-unite", "stupid-berries-run", - "ten-otters-appear" + "ten-otters-appear", + "tender-fireants-cheer", + "thin-yaks-hang", + "tidy-cobras-scream", + "tough-dolphins-care", + "tough-lies-float", + "wild-timers-sparkle" ] } diff --git a/docs/releases/v1.17.0-next.1-changelog.md b/docs/releases/v1.17.0-next.1-changelog.md new file mode 100644 index 0000000000..5af9f0398b --- /dev/null +++ b/docs/releases/v1.17.0-next.1-changelog.md @@ -0,0 +1,2208 @@ +# Release v1.17.0-next.1 + +## @backstage/backend-app-api@0.5.0-next.1 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `configServiceFactory` to `rootConfigServiceFactory`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/backend-defaults@0.2.0-next.1 + +### Minor Changes + +- d008aefef808: **BREAKING**: Removing shared environments concept from the new experimental backend system. + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + +## @backstage/backend-plugin-api@0.6.0-next.1 + +### Minor Changes + +- 629cbd194a87: **BREAKING**: Renamed `coreServices.config` to `coreServices.rootConfig`. +- d008aefef808: **BREAKING**: Removing shared environments concept from the new experimental backend system. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/backend-test-utils@0.2.0-next.1 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `mockServices.config` to `mockServices.rootConfig`. + +### Patch Changes + +- ae9304818136: Add needed constants and constructs to support PostgreSQL version 14 as test database +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## @backstage/config-loader@1.4.0-next.1 + +### Minor Changes + +- 2f1859585998: Loading invalid TypeScript configuration schemas will now throw an error rather than silently being ignored. + + In particular this includes defining any additional types other than `Config` in the schema file, or use of unsupported types such as `Record` or `Partial`. + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-catalog-backend@1.12.0-next.1 + +### Minor Changes + +- f32252cdf631: Added OpenTelemetry spans for catalog processing + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-scaffolder-common@1.3.2 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-catalog-backend-module-gcp@0.1.0-next.0 + +### Minor Changes + +- 290eff6692aa: Added GCP catalog plugin with GKE provider + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-kubernetes-common@0.6.5 + +## @backstage/backend-common@0.19.2-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/config-loader@1.4.0-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/backend-openapi-utils@0.0.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/errors@1.2.1 + +## @backstage/backend-tasks@0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/cli@0.22.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.4.0-next.1 + - @backstage/cli-node@0.1.3-next.0 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/eslint-plugin@0.1.3 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.1.0 + +## @backstage/cli-node@0.1.3-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/create-app@0.5.4-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/integration-react@1.1.16-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + +## @backstage/repo-tools@0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-node@0.1.3-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.2.1 + +## @techdocs/cli@1.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-techdocs-node@1.7.4-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + +## @backstage/plugin-adr@0.6.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-adr-common@0.2.11 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + +## @backstage/plugin-adr-backend@0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-adr-common@0.2.11 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-airbrake@0.3.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/dev-utils@1.0.18-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-airbrake-backend@0.2.21-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-allure@0.1.37-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-analytics-module-ga@0.1.32-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + +## @backstage/plugin-analytics-module-ga4@0.1.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + +## @backstage/plugin-apache-airflow@0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + +## @backstage/plugin-api-docs@0.9.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-apollo-explorer@0.1.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + +## @backstage/plugin-app-backend@0.3.48-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## @backstage/plugin-auth-backend@0.18.6-next.1 + +### Patch Changes + +- 9dad4b0e61bd: Updated config schema to match what was being used in code +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-auth-node@0.2.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-azure-devops-backend@0.3.27-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites-backend@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges-backend@0.2.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-bazaar@0.2.12-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-bazaar-backend@0.2.11-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-bitbucket-cloud-common@0.2.9-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + +## @backstage/plugin-bitrise@0.1.48-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-catalog@1.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-scaffolder-common@1.3.2 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.2.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- b4222908b0c3: Added option to configure AWS `accountId` in `AwsS3EntityProvider` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-kubernetes-common@0.6.5 + +## @backstage/plugin-catalog-backend-module-azure@0.1.19-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.9-next.0 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.15-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.9-next.0 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.13-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.16-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-catalog-backend-module-github@0.3.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-catalog-backend-module-gitlab@0.2.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- e6c721439f37: Added option to skip forked repos in GitlabDiscoveryEntityProvider +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.4.1-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.7-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.5-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-model@1.4.1 + +## @backstage/plugin-catalog-graph@0.2.33-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-catalog-import@0.9.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-catalog-node@1.4.1-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-plugin-api@1.5.3 + - @backstage/plugin-cicd-statistics@0.1.23-next.0 + +## @backstage/plugin-code-climate@0.1.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-code-coverage@0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-code-coverage-backend@0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-codescene@0.1.16-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## @backstage/plugin-config-schema@0.1.44-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-devtools@0.1.3-next.1 + +### Patch Changes + +- 48b6a04ad045: Fix readme typo +- Updated dependencies + - @backstage/plugin-devtools-common@0.1.3-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-react@0.4.14 + +## @backstage/plugin-devtools-backend@0.1.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` + +- 12a8c94eda8d: Add package repository and homepage metadata + +- 2b4f77a4e900: Add DevTools configuration to enable dependency listing to be filtered with custom prefixes. For instance, in your `app-config.yaml`: + + ```yaml + devTools: + info: + packagePrefixes: + - @backstage/ + - @roadiehq/backstage- + - @spotify/backstage- + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/plugin-devtools-common@0.1.3-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-devtools-common@0.1.3-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-dynatrace@7.0.1-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-entity-feedback@0.2.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-entity-feedback-common@0.1.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-entity-feedback-backend@0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-entity-feedback-common@0.1.2-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-entity-feedback-common@0.1.2-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata + +## @backstage/plugin-entity-validation@0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-events-backend@0.2.9-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-events-backend-module-aws-sqs@0.2.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## @backstage/plugin-events-backend-module-azure@0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + +## @backstage/plugin-events-backend-module-gerrit@0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + +## @backstage/plugin-events-backend-module-github@0.1.10-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-events-backend-module-gitlab@0.1.10-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-events-backend-test-utils@0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + +## @backstage/plugin-events-node@0.2.9-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.1 + +## @backstage/plugin-explore-backend@0.0.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.4-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-firehydrant@0.2.5-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-gcalendar@0.3.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## @backstage/plugin-git-release-manager@0.3.34-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + +## @backstage/plugin-github-actions@0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-github-deployments@0.1.52-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-github-issues@0.2.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-graphql-backend@0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-graphql@0.3.22 + +## @backstage/plugin-graphql-voyager@0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + +## @backstage/plugin-ilert@0.2.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-jenkins@0.8.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-jenkins-common@0.1.18-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-jenkins-backend@0.2.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-jenkins-common@0.1.18-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-jenkins-common@0.1.18-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-kafka@0.3.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-kafka-backend@0.2.41-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-kubernetes-backend@0.11.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- bbf4e9c894b5: Fixed a bug where the proxy was not rewriting WebSocket request paths properly. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-kubernetes-common@0.6.5 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-lighthouse-backend@0.2.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-lighthouse-common@0.1.2 + +## @backstage/plugin-linguist@0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-linguist-backend@0.3.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-linguist-common@0.1.1-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata + +## @backstage/plugin-microsoft-calendar@0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- eea2922e749a: README update - example of apiRef definition and fixed component name +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## @backstage/plugin-newrelic-dashboard@0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-nomad@0.1.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-nomad-backend@0.1.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-octopus-deploy@0.2.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-org@0.6.11-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-org-react@0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-periskop@0.1.19-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @backstage/plugin-periskop-backend@0.1.19-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-permission-backend@0.5.23-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-permission-node@0.7.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-playlist@0.1.13-next.1 + +### Patch Changes + +- d1e0588324d1: Displaying an alert popup each time the Playlist is created or deleted +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-playlist-common@0.1.9-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-search-react@1.6.4-next.0 + +## @backstage/plugin-playlist-backend@0.3.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-playlist-common@0.1.9-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-playlist-common@0.1.9-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-permission-common@0.7.7 + +## @backstage/plugin-proxy-backend@0.2.42-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-rollbar-backend@0.1.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + +## @backstage/plugin-scaffolder@1.14.2-next.1 + +### Patch Changes + +- 8a0490fb669e: Fix the get entities query in the `MyGroupsPicker` to query the `kind=Group` entities. +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-scaffolder-common@1.3.2 + - @backstage/plugin-scaffolder-react@1.5.2-next.0 + +## @backstage/plugin-scaffolder-backend@1.15.2-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- d3b31a791eb1: Deprecated `executeShellCommand`, `RunCommandOptions`, and `fetchContents` from `@backstage/plugin-scaffolder-backend`, since they are useful for Scaffolder modules (who should not be importing from the plugin package itself). You should now import these from `@backstage/plugin-scaffolder-backend-node` instead. `RunCommandOptions` was renamed in the Node package as `ExecuteShellCommandOptions`, for consistency. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-scaffolder-common@1.3.2 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- 0d347efc8f18: Use `fetchContents` directly instead of a `fetchPlainAction` +- c186c631b429: Import helpers from the node package instead of the backend package +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.24-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- c186c631b429: Import helpers from the node package instead of the backend package +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- c186c631b429: Import helpers from the node package instead of the backend package +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.8-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## @backstage/plugin-scaffolder-node@0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- d3b31a791eb1: Deprecated `executeShellCommand`, `RunCommandOptions`, and `fetchContents` from `@backstage/plugin-scaffolder-backend`, since they are useful for Scaffolder modules (who should not be importing from the plugin package itself). You should now import these from `@backstage/plugin-scaffolder-backend-node` instead. `RunCommandOptions` was renamed in the Node package as `ExecuteShellCommandOptions`, for consistency. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-scaffolder-common@1.3.2 + +## @backstage/plugin-search-backend@1.4.0-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 951ab6c9db58: Add missing `configSchema` to package.json +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/config@1.0.8 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-search-backend-module-explore@0.1.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-search-backend-module-pg@0.5.9-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-techdocs-node@1.7.4-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-search-backend-node@1.2.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-shortcuts@0.3.13-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-sonarqube@0.7.2-next.1 + +### Patch Changes + +- b2ccddefbdc6: Remove sonarQube card disable class +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-sonarqube-react@0.1.7 + +## @backstage/plugin-sonarqube-backend@0.2.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-stack-overflow@0.1.19-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-home-react@0.1.2-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + +## @backstage/plugin-stack-overflow-backend@0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-tech-insights@0.3.13-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-tech-insights-common@0.2.11 + +## @backstage/plugin-tech-insights-backend@0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.11 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-tech-insights-common@0.2.11 + +## @backstage/plugin-tech-insights-node@0.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.11 + +## @backstage/plugin-techdocs@1.6.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + +## @backstage/plugin-techdocs-backend@1.6.5-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-techdocs-node@1.7.4-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + +## @backstage/plugin-techdocs-node@1.7.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/integration@1.5.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-search-common@1.2.5 + +## @backstage/plugin-todo-backend@0.2.0-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-user-settings-backend@0.1.12-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-vault-backend@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## @backstage/plugin-xcmetrics@0.2.41-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + +## example-app@0.2.86-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-playlist@0.1.13-next.1 + - @backstage/plugin-scaffolder@1.14.2-next.1 + - @backstage/integration-react@1.1.16-next.1 + - @backstage/plugin-microsoft-calendar@0.1.6-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.14-next.1 + - @backstage/plugin-entity-feedback@0.2.4-next.1 + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/plugin-apache-airflow@0.2.14-next.1 + - @backstage/plugin-octopus-deploy@0.2.3-next.1 + - @backstage/plugin-stack-overflow@0.1.19-next.1 + - @backstage/plugin-catalog-graph@0.2.33-next.1 + - @backstage/plugin-code-coverage@0.2.14-next.1 + - @backstage/plugin-tech-insights@0.3.13-next.1 + - @backstage/plugin-dynatrace@7.0.1-next.1 + - @backstage/plugin-gcalendar@0.3.17-next.1 + - @backstage/plugin-shortcuts@0.3.13-next.1 + - @backstage/plugin-airbrake@0.3.21-next.1 + - @backstage/plugin-kafka@0.3.21-next.1 + - @backstage/plugin-nomad@0.1.2-next.1 + - @backstage/plugin-adr@0.6.4-next.1 + - @backstage/plugin-org@0.6.11-next.1 + - @backstage/plugin-devtools@0.1.3-next.1 + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog-import@0.9.11-next.1 + - @backstage/plugin-github-actions@0.6.2-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.16-next.1 + - @backstage/plugin-linguist@0.1.6-next.1 + - @backstage/plugin-jenkins@0.8.3-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-api-docs@0.9.7-next.1 + - @backstage/plugin-azure-devops@0.3.3-next.0 + - @backstage/plugin-azure-sites@0.1.10-next.0 + - @backstage/plugin-badges@0.2.45-next.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.2-next.0 + - @backstage/plugin-circleci@0.3.21-next.0 + - @backstage/plugin-cloudbuild@0.3.21-next.0 + - @backstage/plugin-cost-insights@0.12.10-next.0 + - @backstage/plugin-explore@0.4.7-next.0 + - @backstage/plugin-gcp-projects@0.3.40-next.0 + - @backstage/plugin-gocd@0.1.27-next.0 + - @backstage/plugin-graphiql@0.2.53-next.0 + - @backstage/plugin-home@0.5.5-next.0 + - @backstage/plugin-kubernetes@0.9.4-next.0 + - @backstage/plugin-lighthouse@0.4.6-next.0 + - @backstage/plugin-newrelic@0.3.39-next.0 + - @backstage/plugin-pagerduty@0.6.2-next.0 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-puppetdb@0.1.4-next.0 + - @backstage/plugin-rollbar@0.4.21-next.0 + - @backstage/plugin-scaffolder-react@1.5.2-next.0 + - @backstage/plugin-search@1.3.4-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-sentry@0.5.6-next.0 + - @backstage/plugin-stackstorm@0.1.5-next.0 + - @backstage/plugin-tech-radar@0.6.7-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + - @backstage/plugin-todo@0.2.23-next.0 + - @backstage/plugin-user-settings@0.7.6-next.0 + - @internal/plugin-catalog-customized@0.0.13-next.1 + +## example-backend@0.2.86-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.9-next.1 + - @backstage/plugin-azure-devops-backend@0.3.27-next.1 + - @backstage/plugin-kubernetes-backend@0.11.3-next.1 + - @backstage/plugin-lighthouse-backend@0.2.4-next.1 + - @backstage/plugin-permission-backend@0.5.23-next.1 + - @backstage/plugin-scaffolder-backend@1.15.2-next.1 + - @backstage/plugin-devtools-backend@0.1.3-next.1 + - @backstage/plugin-techdocs-backend@1.6.5-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-badges-backend@0.2.3-next.1 + - @backstage/plugin-events-backend@0.2.9-next.1 + - @backstage/plugin-search-backend@1.4.0-next.1 + - @backstage/plugin-kafka-backend@0.2.41-next.1 + - @backstage/plugin-proxy-backend@0.2.42-next.1 + - @backstage/plugin-todo-backend@0.2.0-next.1 + - @backstage/plugin-app-backend@0.3.48-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 + - @backstage/plugin-code-coverage-backend@0.2.14-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-linguist-backend@0.3.2-next.1 + - @backstage/plugin-playlist-backend@0.3.4-next.1 + - @backstage/plugin-explore-backend@0.0.10-next.1 + - @backstage/plugin-jenkins-backend@0.2.3-next.1 + - @backstage/plugin-nomad-backend@0.1.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-auth-backend@0.18.6-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-adr-backend@0.3.6-next.1 + - @backstage/plugin-azure-sites-backend@0.1.10-next.1 + - @backstage/plugin-graphql-backend@0.1.38-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/plugin-rollbar-backend@0.1.45-next.1 + - @backstage/plugin-tech-insights-backend@0.5.14-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - example-app@0.2.86-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## example-backend-next@0.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.1 + - @backstage/plugin-azure-devops-backend@0.3.27-next.1 + - @backstage/plugin-kubernetes-backend@0.11.3-next.1 + - @backstage/plugin-lighthouse-backend@0.2.4-next.1 + - @backstage/plugin-permission-backend@0.5.23-next.1 + - @backstage/plugin-scaffolder-backend@1.15.2-next.1 + - @backstage/backend-defaults@0.2.0-next.1 + - @backstage/plugin-devtools-backend@0.1.3-next.1 + - @backstage/plugin-techdocs-backend@1.6.5-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-badges-backend@0.2.3-next.1 + - @backstage/plugin-search-backend@1.4.0-next.1 + - @backstage/plugin-todo-backend@0.2.0-next.1 + - @backstage/plugin-app-backend@0.3.48-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-linguist-backend@0.3.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-adr-backend@0.3.6-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/plugin-permission-common@0.7.7 + +## e2e-test@0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.4-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.2.1 + +## techdocs-cli-embedded-app@0.2.85-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + +## @internal/plugin-catalog-customized@0.0.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + +## @internal/plugin-todo-list-backend@1.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 diff --git a/package.json b/package.json index 6c401498ba..abaaec252c 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.17.0-next.0", + "version": "1.17.0-next.1", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 5ddd5b1ba0..c1886c92d5 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,80 @@ # example-app +## 0.2.86-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-playlist@0.1.13-next.1 + - @backstage/plugin-scaffolder@1.14.2-next.1 + - @backstage/integration-react@1.1.16-next.1 + - @backstage/plugin-microsoft-calendar@0.1.6-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.14-next.1 + - @backstage/plugin-entity-feedback@0.2.4-next.1 + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/plugin-apache-airflow@0.2.14-next.1 + - @backstage/plugin-octopus-deploy@0.2.3-next.1 + - @backstage/plugin-stack-overflow@0.1.19-next.1 + - @backstage/plugin-catalog-graph@0.2.33-next.1 + - @backstage/plugin-code-coverage@0.2.14-next.1 + - @backstage/plugin-tech-insights@0.3.13-next.1 + - @backstage/plugin-dynatrace@7.0.1-next.1 + - @backstage/plugin-gcalendar@0.3.17-next.1 + - @backstage/plugin-shortcuts@0.3.13-next.1 + - @backstage/plugin-airbrake@0.3.21-next.1 + - @backstage/plugin-kafka@0.3.21-next.1 + - @backstage/plugin-nomad@0.1.2-next.1 + - @backstage/plugin-adr@0.6.4-next.1 + - @backstage/plugin-org@0.6.11-next.1 + - @backstage/plugin-devtools@0.1.3-next.1 + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog-import@0.9.11-next.1 + - @backstage/plugin-github-actions@0.6.2-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.16-next.1 + - @backstage/plugin-linguist@0.1.6-next.1 + - @backstage/plugin-jenkins@0.8.3-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-api-docs@0.9.7-next.1 + - @backstage/plugin-azure-devops@0.3.3-next.0 + - @backstage/plugin-azure-sites@0.1.10-next.0 + - @backstage/plugin-badges@0.2.45-next.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.2-next.0 + - @backstage/plugin-circleci@0.3.21-next.0 + - @backstage/plugin-cloudbuild@0.3.21-next.0 + - @backstage/plugin-cost-insights@0.12.10-next.0 + - @backstage/plugin-explore@0.4.7-next.0 + - @backstage/plugin-gcp-projects@0.3.40-next.0 + - @backstage/plugin-gocd@0.1.27-next.0 + - @backstage/plugin-graphiql@0.2.53-next.0 + - @backstage/plugin-home@0.5.5-next.0 + - @backstage/plugin-kubernetes@0.9.4-next.0 + - @backstage/plugin-lighthouse@0.4.6-next.0 + - @backstage/plugin-newrelic@0.3.39-next.0 + - @backstage/plugin-pagerduty@0.6.2-next.0 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-puppetdb@0.1.4-next.0 + - @backstage/plugin-rollbar@0.4.21-next.0 + - @backstage/plugin-scaffolder-react@1.5.2-next.0 + - @backstage/plugin-search@1.3.4-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-sentry@0.5.6-next.0 + - @backstage/plugin-stackstorm@0.1.5-next.0 + - @backstage/plugin-tech-radar@0.6.7-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + - @backstage/plugin-todo@0.2.23-next.0 + - @backstage/plugin-user-settings@0.7.6-next.0 + - @internal/plugin-catalog-customized@0.0.13-next.1 + ## 0.2.86-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 96cbf0c1c5..f33a5645b9 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.86-next.0", + "version": "0.2.86-next.1", "private": true, "backstage": { "role": "frontend" diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 9c07587549..cbfbfef468 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/backend-app-api +## 0.5.0-next.1 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `configServiceFactory` to `rootConfigServiceFactory`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.4.6-next.0 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 6f8a5cf9e8..d1aa511794 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.4.6-next.0", + "version": "0.5.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 2977d54c01..f0c6d75478 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/backend-common +## 0.19.2-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/config-loader@1.4.0-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.19.2-next.0 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 6e561fa564..e18369b7e7 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.19.2-next.0", + "version": "0.19.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 1ff580965f..089f80d745 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/backend-defaults +## 0.2.0-next.1 + +### Minor Changes + +- d008aefef808: **BREAKING**: Removing shared environments concept from the new experimental backend system. + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + ## 0.1.13-next.0 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 318b00c7f2..5a89bb51f0 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.13-next.0", + "version": "0.2.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 9a9be3b3e2..a5eb6fe466 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,36 @@ # example-backend-next +## 0.0.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 + - @backstage/plugin-search-backend-module-explore@0.1.4-next.1 + - @backstage/plugin-azure-devops-backend@0.3.27-next.1 + - @backstage/plugin-kubernetes-backend@0.11.3-next.1 + - @backstage/plugin-lighthouse-backend@0.2.4-next.1 + - @backstage/plugin-permission-backend@0.5.23-next.1 + - @backstage/plugin-scaffolder-backend@1.15.2-next.1 + - @backstage/backend-defaults@0.2.0-next.1 + - @backstage/plugin-devtools-backend@0.1.3-next.1 + - @backstage/plugin-techdocs-backend@1.6.5-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-badges-backend@0.2.3-next.1 + - @backstage/plugin-search-backend@1.4.0-next.1 + - @backstage/plugin-todo-backend@0.2.0-next.1 + - @backstage/plugin-app-backend@0.3.48-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-linguist-backend@0.3.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-adr-backend@0.3.6-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/plugin-permission-common@0.7.7 + ## 0.0.14-next.0 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 3043a96ebd..38f85fb8c0 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.14-next.0", + "version": "0.0.14-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index bd1d7f380a..3eb95afe95 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/backend-openapi-utils +## 0.0.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/errors@1.2.1 + ## 0.0.3-next.0 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index 9c83356c83..9123d6dd77 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-openapi-utils", "description": "OpenAPI typescript support.", - "version": "0.0.3-next.0", + "version": "0.0.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index a77cdb71eb..510797672c 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-plugin-api +## 0.6.0-next.1 + +### Minor Changes + +- 629cbd194a87: **BREAKING**: Renamed `coreServices.config` to `coreServices.rootConfig`. +- d008aefef808: **BREAKING**: Removing shared environments concept from the new experimental backend system. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + ## 0.5.5-next.0 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 91936a4c16..5d0bfe08fb 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.5.5-next.0", + "version": "0.6.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index ec1dd319ea..05e51c661c 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/backend-tasks +## 0.5.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.5.5-next.0 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 4c0e4fd27e..9dd2c9e557 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.5.5-next.0", + "version": "0.5.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 2d40873bb9..78a8e7cd6d 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/backend-test-utils +## 0.2.0-next.1 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `mockServices.config` to `mockServices.rootConfig`. + +### Patch Changes + +- ae9304818136: Add needed constants and constructs to support PostgreSQL version 14 as test database +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + ## 0.1.40-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index d9d904357b..beebf06624 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.40-next.0", + "version": "0.2.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index d4359d6ece..84c802ae58 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,60 @@ # example-backend +## 0.2.86-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.3.3-next.1 + - @backstage/plugin-search-backend-module-pg@0.5.9-next.1 + - @backstage/plugin-azure-devops-backend@0.3.27-next.1 + - @backstage/plugin-kubernetes-backend@0.11.3-next.1 + - @backstage/plugin-lighthouse-backend@0.2.4-next.1 + - @backstage/plugin-permission-backend@0.5.23-next.1 + - @backstage/plugin-scaffolder-backend@1.15.2-next.1 + - @backstage/plugin-devtools-backend@0.1.3-next.1 + - @backstage/plugin-techdocs-backend@1.6.5-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-badges-backend@0.2.3-next.1 + - @backstage/plugin-events-backend@0.2.9-next.1 + - @backstage/plugin-search-backend@1.4.0-next.1 + - @backstage/plugin-kafka-backend@0.2.41-next.1 + - @backstage/plugin-proxy-backend@0.2.42-next.1 + - @backstage/plugin-todo-backend@0.2.0-next.1 + - @backstage/plugin-app-backend@0.3.48-next.1 + - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.1-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.2.0-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.17-next.1 + - @backstage/plugin-entity-feedback-backend@0.1.6-next.1 + - @backstage/plugin-code-coverage-backend@0.2.14-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-linguist-backend@0.3.2-next.1 + - @backstage/plugin-playlist-backend@0.3.4-next.1 + - @backstage/plugin-explore-backend@0.0.10-next.1 + - @backstage/plugin-jenkins-backend@0.2.3-next.1 + - @backstage/plugin-nomad-backend@0.1.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-auth-backend@0.18.6-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-adr-backend@0.3.6-next.1 + - @backstage/plugin-azure-sites-backend@0.1.10-next.1 + - @backstage/plugin-graphql-backend@0.1.38-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/plugin-rollbar-backend@0.1.45-next.1 + - @backstage/plugin-tech-insights-backend@0.5.14-next.1 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.32-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - example-app@0.2.86-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + ## 0.2.86-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 1c99a1bdf3..4f5b896d27 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.86-next.0", + "version": "0.2.86-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index fc2876fa76..2615c2ddd7 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/cli-node +## 0.1.3-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.1.2 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index b5ba1855a8..f87f70b135 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-node", "description": "Node.js library for Backstage CLIs", - "version": "0.1.2", + "version": "0.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 2652a40bde..54660d1773 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/cli +## 0.22.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.4.0-next.1 + - @backstage/cli-node@0.1.3-next.0 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/eslint-plugin@0.1.3 + - @backstage/release-manifests@0.0.9 + - @backstage/types@1.1.0 + ## 0.22.10-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 8b78b16900..8fe6a579ea 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.10-next.0", + "version": "0.22.10-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 0782876942..b02d08495a 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/config-loader +## 1.4.0-next.1 + +### Minor Changes + +- 2f1859585998: Loading invalid TypeScript configuration schemas will now throw an error rather than silently being ignored. + + In particular this includes defining any additional types other than `Config` in the schema file, or use of unsupported types such as `Record` or `Partial`. + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 1.4.0-next.0 ### Minor Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 51a4a5a6cd..5e82c0bb76 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.4.0-next.0", + "version": "1.4.0-next.1", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 9a65a15f98..eb2f048d62 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/create-app +## 0.5.4-next.1 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.5.4-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index fb203edf26..de1a9791ae 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.5.4-next.0", + "version": "0.5.4-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 45df686876..132f330d8f 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.0.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 1.0.18-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index d7e12209c3..730d8ffe4e 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.18-next.0", + "version": "1.0.18-next.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index f6f29ff3f2..a334051aae 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.5.4-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.2.1 + ## 0.2.6-next.0 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 48ef90db6f..3708f1bae4 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.6-next.0", + "version": "0.2.6-next.1", "private": true, "backstage": { "role": "cli" diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 4f275a8750..dd43ed34a0 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/integration-react +## 1.1.16-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + ## 1.1.16-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index b39d4fcb0c..71f7597635 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.16-next.0", + "version": "1.1.16-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index b8f37f4977..763c9f1cc1 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/repo-tools +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-node@0.1.3-next.0 + - @backstage/cli-common@0.1.12 + - @backstage/errors@1.2.1 + ## 0.3.3-next.0 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index c05cd30c75..c5d9e266c9 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.3.3-next.0", + "version": "0.3.3-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 26f2246d13..915d54fec3 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.85-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + ## 0.2.85-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 1b6af7f9e9..d980d2ab6c 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.85-next.0", + "version": "0.2.85-next.1", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index daefe75e38..ec0678b2d6 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-techdocs-node@1.7.4-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + ## 1.4.5-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index d59450992b..82ba61e0f6 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.4.5-next.0", + "version": "1.4.5-next.1", "publishConfig": { "access": "public" }, diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index c63b8bd687..07b40ac349 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-adr-backend +## 0.3.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-adr-common@0.2.11 + - @backstage/plugin-search-common@1.2.5 + ## 0.3.6-next.0 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index e7f390b790..0caa9563d8 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.3.6-next.0", + "version": "0.3.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index fbbf4c13de..57f888eaa7 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-adr +## 0.6.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-adr-common@0.2.11 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + ## 0.6.4-next.0 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index b032ccad7b..84d5080a4a 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.6.4-next.0", + "version": "0.6.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index c0f695f372..3892e5563b 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-airbrake-backend +## 0.2.21-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + ## 0.2.21-next.0 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 226126531b..f3ff319d65 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.21-next.0", + "version": "0.2.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index e5b52f1932..5ef51bc443 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-airbrake +## 0.3.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/dev-utils@1.0.18-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.3.21-next.0 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 8a156c775d..72f3bc6094 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.21-next.0", + "version": "0.3.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index caa81f04cf..8bbf800b78 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-allure +## 0.1.37-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.37-next.0 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 7a65d9f707..730347cf8c 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.37-next.0", + "version": "0.1.37-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index d7c09cddb1..d40cb001e2 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-analytics-module-ga +## 0.1.32-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + ## 0.1.32-next.0 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 8fb8d42a9e..ef77925719 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.32-next.0", + "version": "0.1.32-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga4/CHANGELOG.md b/plugins/analytics-module-ga4/CHANGELOG.md index 9715015579..fd589fec4b 100644 --- a/plugins/analytics-module-ga4/CHANGELOG.md +++ b/plugins/analytics-module-ga4/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-analytics-module-ga4 +## 0.1.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/analytics-module-ga4/package.json b/plugins/analytics-module-ga4/package.json index 09e7240142..ef55377f0c 100644 --- a/plugins/analytics-module-ga4/package.json +++ b/plugins/analytics-module-ga4/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga4", - "version": "0.1.3-next.0", + "version": "0.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index ef1d34dc23..42756b19df 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apache-airflow +## 0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 60afaa9a24..a1e84dc6fb 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 68923046f5..7ed022f59e 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-api-docs +## 0.9.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.9.7-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 625fbd3138..8d67619aa9 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.7-next.0", + "version": "0.9.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 0051c8a9e7..b733c807ba 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-apollo-explorer +## 0.1.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + ## 0.1.14-next.0 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index b9eba3278d..f989ba29ad 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.14-next.0", + "version": "0.1.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 7e048ba4d5..a92677ab41 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-app-backend +## 0.3.48-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + ## 0.3.48-next.0 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 5574c8aba3..c9b25508c0 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.48-next.0", + "version": "0.3.48-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 60555ef74f..478570bb31 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-auth-backend +## 0.18.6-next.1 + +### Patch Changes + +- 9dad4b0e61bd: Updated config schema to match what was being used in code +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.18.6-next.0 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 4e7f80afaf..2a3b80de6a 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.18.6-next.0", + "version": "0.18.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index cb802b9757..f19e99feab 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-node +## 0.2.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.17-next.0 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index c5846d60b4..ab98ce1e7f 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.17-next.0", + "version": "0.2.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index 8aa39659fa..c961856b7b 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-azure-devops-backend +## 0.3.27-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.27-next.0 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 706274df6d..857b1643b3 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.27-next.0", + "version": "0.3.27-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 6aa958a860..4a025ba54e 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-sites-backend +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 81d6c434a6..93cdffe8a5 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 03ba2fa42b..4645a45090 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-badges-backend +## 0.2.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 02f20826f2..f68854b9f6 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 15059fe6df..f505eb9b81 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-bazaar-backend +## 0.2.11-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.11-next.0 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index d41127a9fa..6532c6c291 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.11-next.0", + "version": "0.2.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 7168eaec27..b9e8e4001e 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-bazaar +## 0.2.12-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.12-next.0 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 3181e99833..d0f26d68f0 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.12-next.0", + "version": "0.2.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index d438d843fd..1afd2eb74e 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.9-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + ## 0.2.8 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 38ba256c35..7d1ef19b6b 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.2.8", + "version": "0.2.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index db09305c36..51a286ff26 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-bitrise +## 0.1.48-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.48-next.0 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 5388bb3542..1ee1d7efbe 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.48-next.0", + "version": "0.1.48-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 560e1cafb7..09d7823993 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.2.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- b4222908b0c3: Added option to configure AWS `accountId` in `AwsS3EntityProvider` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-kubernetes-common@0.6.5 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index d27587a6b3..bd5377fb67 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 9d60b4a5f2..bf2ce7bb76 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.19-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index ac3cdd2b05..fe9cb9a7cc 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.19-next.0", + "version": "0.1.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 4aeca8609e..593e1fd2a1 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.15-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.9-next.0 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + ## 0.1.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 1baa14f00f..30875be251 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.15-next.0", + "version": "0.1.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index fa0c443e3a..52920ff815 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.13-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 4b35c8f7d7..ac28eecc36 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 9c1da14fba..5b1e75e86d 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.2.9-next.0 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.2.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index e968aad343..53d80eb89e 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.15-next.0", + "version": "0.2.15-next.1", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md new file mode 100644 index 0000000000..7fd00d048d --- /dev/null +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -0,0 +1,18 @@ +# @backstage/plugin-catalog-backend-module-gcp + +## 0.1.0-next.0 + +### Minor Changes + +- 290eff6692aa: Added GCP catalog plugin with GKE provider + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-kubernetes-common@0.6.5 diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 12285d26eb..7ddb7d7b97 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", "description": "A Backstage catalog backend module that helps integrate towards GCP", - "version": "0.0.0", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 09df93f029..3f7d7a8dd3 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.16-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.1.16-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index aa0fc95907..f9566da0e2 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.16-next.0", + "version": "0.1.16-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 3743f035c4..af93dd5419 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-backend-module-github +## 0.3.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + ## 0.3.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 2e64d39638..b05630862c 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.3.3-next.0", + "version": "0.3.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 2fcba33d47..d92ddbce43 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.2.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- e6c721439f37: Added option to skip forked repos in GitlabDiscoveryEntityProvider +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 1a3f0245eb..1465b430ae 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 583458667d..0cc4dc584d 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.4.1-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + ## 0.4.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index a6a947c93c..d4cae08da0 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.4.1-next.0", + "version": "0.4.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 4e9cabb577..9cb5788b30 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + ## 0.5.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 742065735d..8a963923ff 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.15-next.0", + "version": "0.5.15-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 0edda3b91d..f2e0173a13 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.7-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + ## 0.5.7-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index c802b15d16..002531f141 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.7-next.0", + "version": "0.5.7-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 8b6a4c3162..1e63a1193d 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + ## 0.1.14-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index cbc42851d9..13f0305cae 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.14-next.0", + "version": "0.1.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index d7606911e3..8d86cc9c2f 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.5-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.1.5-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 8adbd65941..d17b788737 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.1.5-next.0", + "version": "0.1.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 999c7cf85f..0e4ac7a0e2 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.2.0-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-model@1.4.1 + ## 0.2.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index e9ca4662ac..6052015439 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", "description": "Backstage Catalog module to view unprocessed entities", - "version": "0.2.0-next.0", + "version": "0.2.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 0c0f3c7be8..cedbc1ed08 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend +## 1.12.0-next.1 + +### Minor Changes + +- f32252cdf631: Added OpenTelemetry spans for catalog processing + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/plugin-search-backend-module-catalog@0.1.4-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-scaffolder-common@1.3.2 + - @backstage/plugin-search-common@1.2.5 + ## 1.12.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 8b4edcbc20..2fee3c3a46 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.12.0-next.0", + "version": "1.12.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index 6b573ac4d3..a488e91148 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.0.13-next.0 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index b745c43aca..c849e6c2a3 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.13-next.0", + "version": "0.0.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 4e04cac514..118600f318 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-graph +## 0.2.33-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.33-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 2e2b3c2402..0e8f891dab 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.33-next.0", + "version": "0.2.33-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 47b286216e..139c8b0615 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-import +## 0.9.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.9.11-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 19d475d94e..55d596c955 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.11-next.0", + "version": "0.9.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 633d39d4d5..6299cd2424 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-node +## 1.4.1-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + ## 1.4.1-next.0 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 8aef496418..5a10c9e000 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.4.1-next.0", + "version": "1.4.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index c1cd9ed944..88d0651a03 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog +## 1.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-scaffolder-common@1.3.2 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + ## 1.12.1-next.0 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 84d995dce9..a27cb26f77 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.12.1-next.0", + "version": "1.12.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 93124791bc..f6c2ea06a6 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-plugin-api@1.5.3 + - @backstage/plugin-cicd-statistics@0.1.23-next.0 + ## 0.1.17-next.0 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 2f9064b580..f7c34ade60 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.17-next.0", + "version": "0.1.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index f9f12eda4c..72d15c9730 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-code-climate +## 0.1.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.21-next.0 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 935e56e355..3782e25a5a 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.21-next.0", + "version": "0.1.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index bd17e3bc31..b2fd302e8c 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-code-coverage-backend +## 0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 9174122f38..6b366ab312 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 070777e634..28c8abef54 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-code-coverage +## 0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index 936db59fb4..8e2b111878 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index ac82e96c39..3a10b0984f 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-codescene +## 0.1.16-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + ## 0.1.16-next.0 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index aef649c213..4ec2a9ec4b 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.16-next.0", + "version": "0.1.16-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 23a9d4368e..b607255110 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-config-schema +## 0.1.44-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + ## 0.1.44-next.0 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index ea4f55ef3c..2f8d233407 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.44-next.0", + "version": "0.1.44-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index c6fc117190..c1f6c2e10f 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-devtools-backend +## 0.1.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 2b4f77a4e900: Add DevTools configuration to enable dependency listing to be filtered with custom prefixes. For instance, in your `app-config.yaml`: + + ```yaml + devTools: + info: + packagePrefixes: + - @backstage/ + - @roadiehq/backstage- + - @spotify/backstage- + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config-loader@1.4.0-next.1 + - @backstage/plugin-devtools-common@0.1.3-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 158bc00a8d..f45b38c120 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.1.3-next.0", + "version": "0.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools-common/CHANGELOG.md b/plugins/devtools-common/CHANGELOG.md index 737b00fb15..adf0300433 100644 --- a/plugins/devtools-common/CHANGELOG.md +++ b/plugins/devtools-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-devtools-common +## 0.1.3-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + ## 0.1.2 ### Patch Changes diff --git a/plugins/devtools-common/package.json b/plugins/devtools-common/package.json index 2c8b382727..d098df0e23 100644 --- a/plugins/devtools-common/package.json +++ b/plugins/devtools-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-devtools-common", "description": "Common functionalities for the devtools plugin", - "version": "0.1.2", + "version": "0.1.3-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index a7793b91ab..d87d21a886 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-devtools +## 0.1.3-next.1 + +### Patch Changes + +- 48b6a04ad045: Fix readme typo +- Updated dependencies + - @backstage/plugin-devtools-common@0.1.3-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-react@0.4.14 + ## 0.1.3-next.0 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 38c20ab173..a791233f17 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.3-next.0", + "version": "0.1.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index ce5ea57681..6cd8f6b0c4 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-dynatrace +## 7.0.1-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 7.0.1-next.0 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 852ce144b5..c0a855aa26 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "7.0.1-next.0", + "version": "7.0.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index f2399b657d..c0cd2d8c81 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-entity-feedback-backend +## 0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-entity-feedback-common@0.1.2-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 1d9aae90a8..91cc97a65c 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-common/CHANGELOG.md b/plugins/entity-feedback-common/CHANGELOG.md index 161f990b3a..dd93a7ee36 100644 --- a/plugins/entity-feedback-common/CHANGELOG.md +++ b/plugins/entity-feedback-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-entity-feedback-common +## 0.1.2-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata + ## 0.1.1 ### Patch Changes diff --git a/plugins/entity-feedback-common/package.json b/plugins/entity-feedback-common/package.json index 642988730e..776e33e198 100644 --- a/plugins/entity-feedback-common/package.json +++ b/plugins/entity-feedback-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-entity-feedback-common", "description": "Common functionalities for the entity-feedback plugin", - "version": "0.1.1", + "version": "0.1.2-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index 973dd7c248..8429cdb56b 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-entity-feedback +## 0.2.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-entity-feedback-common@0.1.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index 1ba7a035b7..2736a3a1e2 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index ecc0ba4ba5..beaf7524d2 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-entity-validation +## 0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index e9221c6695..5b85f1f199 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 80da8cdda4..ab4643de53 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.2.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 77edb71673..0e0e1e65e4 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index d04fb93ac8..c4a72dfbdd 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 573d3368c4..568e3eda8f 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index ed48748279..a916666a22 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index e4c1508a34..1ef814848d 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 2d19fd081f..07276b736b 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 55676bce46..3f265c6613 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index dde124b8ca..e29d71c92f 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-github +## 0.1.10-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 71a4d33d42..abde4c91a7 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index 7541db2b22..231bf6dfe2 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.10-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 087e1efd55..e25366b2f7 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 49153b8c64..123a6224ed 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-events-node@0.2.9-next.1 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index bc54d17858..a90a16a6c4 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 8dd156dbcc..f2f9d5f01d 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend +## 0.2.9-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-events-node@0.2.9-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + ## 0.2.9-next.0 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index cbf1dc8af5..eaa9a8f278 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.9-next.0", + "version": "0.2.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 746e8afd4d..af8c020ca3 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-node +## 0.2.9-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.1 + ## 0.2.9-next.0 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 4d2169ac20..0cea638e4f 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.9-next.0", + "version": "0.2.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 559688f555..ef47064c18 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @internal/plugin-todo-list-backend +## 1.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 1.0.16-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 9747356461..2417f2a883 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.16-next.0", + "version": "1.0.16-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index dbe0a173fd..2c478e6a4e 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-explore-backend +## 0.0.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-search-backend-module-explore@0.1.4-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.5 + ## 0.0.10-next.0 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 16174f7a51..5b8a20eea7 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.10-next.0", + "version": "0.0.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 761568ddf4..05b2093663 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-firehydrant +## 0.2.5-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.5-next.0 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 960cf01fba..b955b6e129 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.2.5-next.0", + "version": "0.2.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index b1db7cc767..28e754125f 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-gcalendar +## 0.3.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 8a2311065d..9cbd9e6a36 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.17-next.0", + "version": "0.3.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index e5faa988f3..50a949c70a 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-git-release-manager +## 0.3.34-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + ## 0.3.34-next.0 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index d7214d86da..80d8adc301 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.34-next.0", + "version": "0.3.34-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index e266c4b33d..00da125064 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-actions +## 0.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.6.2-next.0 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 717d8a3a89..664da9fc91 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.6.2-next.0", + "version": "0.6.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 125fda22d2..949c221a1f 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-github-deployments +## 0.1.52-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.52-next.0 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 7fe0efd865..1a31fab535 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.52-next.0", + "version": "0.1.52-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 1cb2542f6d..985b114cb1 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-github-issues +## 0.2.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 89c5d19ba0..179364a725 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.10-next.0", + "version": "0.2.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index c3aff03c42..b8fc2982f7 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-backend +## 0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-graphql@0.3.22 + ## 0.1.38-next.0 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index b672929c87..530f814625 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.38-next.0", + "version": "0.1.38-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index 18b4906203..6106ce1684 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-graphql-voyager +## 0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 5bcf02d73e..7cfe6e3147 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index e4c60e7ab2..5a30c11db7 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-ilert +## 0.2.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.10-next.0 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index e283ffa24a..1ff95f665d 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.10-next.0", + "version": "0.2.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 305399b6ed..d03a2646df 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-jenkins-backend +## 0.2.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-jenkins-common@0.1.18-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 4ab3a59853..942a623ad0 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 855c175aac..b7c7da027b 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins-common +## 0.1.18-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + ## 0.1.17 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index dd00527cee..6d99a808bf 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.17", + "version": "0.1.18-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 174f377d69..bb28eeeaf5 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-jenkins +## 0.8.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-jenkins-common@0.1.18-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.8.3-next.0 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 75e8c4aa01..a44861de23 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.8.3-next.0", + "version": "0.8.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 175a3315e0..48291adcc1 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kafka-backend +## 0.2.41-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.41-next.0 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index e2c5eff6f1..c3cf662208 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.41-next.0", + "version": "0.2.41-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 0f267c654a..80751d23b8 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kafka +## 0.3.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.3.21-next.0 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 617290f5b8..46ec0e8e51 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.21-next.0", + "version": "0.3.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index dc5642ca88..532d0e0618 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-kubernetes-backend +## 0.11.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- bbf4e9c894b5: Fixed a bug where the proxy was not rewriting WebSocket request paths properly. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-kubernetes-common@0.6.5 + - @backstage/plugin-permission-common@0.7.7 + ## 0.11.3-next.0 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 2453c8a9d9..6663479f5e 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.11.3-next.0", + "version": "0.11.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index afdaccb6d6..80c54e4501 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-lighthouse-backend +## 0.2.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-lighthouse-common@0.1.2 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index 2ec52540e9..c5b9bb49ca 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index 0d5e08137e..774dc72250 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-linguist-backend +## 0.3.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.3.2-next.0 ### Patch Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 5110021ab2..99fc323e86 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-common/CHANGELOG.md b/plugins/linguist-common/CHANGELOG.md index f2b34faa84..1bfe9fcc84 100644 --- a/plugins/linguist-common/CHANGELOG.md +++ b/plugins/linguist-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-linguist-common +## 0.1.1-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata + ## 0.1.0 ### Minor Changes diff --git a/plugins/linguist-common/package.json b/plugins/linguist-common/package.json index f28a721021..4ca2b65283 100644 --- a/plugins/linguist-common/package.json +++ b/plugins/linguist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-linguist-common", "description": "Common functionalities for the linguist plugin", - "version": "0.1.0", + "version": "0.1.1-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index b1980ab7d2..84af3bdd60 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-linguist +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 96d61b73f2..2f5369b404 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 02b1bb4b43..0cb4271d67 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-microsoft-calendar +## 0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- eea2922e749a: README update - example of apiRef definition and fixed component name +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 1cdb50898a..84e307ac2b 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index ce1e90b993..de7a9c6b5b 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.14-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.14-next.0 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index fd18e44217..b32fd6c1e2 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.14-next.0", + "version": "0.2.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad-backend/CHANGELOG.md b/plugins/nomad-backend/CHANGELOG.md index f85815f1de..37a5ba36cf 100644 --- a/plugins/nomad-backend/CHANGELOG.md +++ b/plugins/nomad-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-nomad-backend +## 0.1.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/nomad-backend/package.json b/plugins/nomad-backend/package.json index 03d0b137ee..78a3e3a386 100644 --- a/plugins/nomad-backend/package.json +++ b/plugins/nomad-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad-backend", - "version": "0.1.2-next.0", + "version": "0.1.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/nomad/CHANGELOG.md b/plugins/nomad/CHANGELOG.md index fe8796a096..151657c12b 100644 --- a/plugins/nomad/CHANGELOG.md +++ b/plugins/nomad/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-nomad +## 0.1.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/nomad/package.json b/plugins/nomad/package.json index 8db5ed7690..283b6cdb9c 100644 --- a/plugins/nomad/package.json +++ b/plugins/nomad/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-nomad", - "version": "0.1.2-next.0", + "version": "0.1.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index 52e5b5cd9b..b6a652e24d 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-octopus-deploy +## 0.2.3-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index 46ec2cff08..65010ae66f 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 760d798a44..eeac469210 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-org-react +## 0.1.10-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 49765ba6d5..176722ad03 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 57d83db630..4e98307d04 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-org +## 0.6.11-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.6.11-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 23af90d2b8..81d6495d08 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.11-next.0", + "version": "0.6.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index d2279571fd..2bf8f6c147 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-periskop-backend +## 0.1.19-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index f515fd4088..52c7d127b0 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.19-next.0", + "version": "0.1.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 5e9155a931..a12e00971f 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-periskop +## 0.1.19-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 2f9f23d592..3ac124e85c 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.19-next.0", + "version": "0.1.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 58701e2f41..2d641baae8 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-permission-backend +## 0.5.23-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + ## 0.5.23-next.0 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 964a7ed5ac..269cb12061 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.23-next.0", + "version": "0.5.23-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index d036c17985..41e5f3ca5b 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-node +## 0.7.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + ## 0.7.11-next.0 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 52bca6caf0..c5f30ff4a0 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.11-next.0", + "version": "0.7.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 351805dc01..f55ad9991e 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-playlist-backend +## 0.3.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-playlist-common@0.1.9-next.0 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + ## 0.3.4-next.0 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 24686f93e6..5285406e58 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.3.4-next.0", + "version": "0.3.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index 3d93a98c07..ed624302c5 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-playlist-common +## 0.1.9-next.0 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-permission-common@0.7.7 + ## 0.1.8 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 4303113910..2ac82b4852 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.8", + "version": "0.1.9-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index e31fe279e8..3850cc3e5d 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-playlist +## 0.1.13-next.1 + +### Patch Changes + +- d1e0588324d1: Displaying an alert popup each time the Playlist is created or deleted +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-playlist-common@0.1.9-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-search-react@1.6.4-next.0 + ## 0.1.13-next.0 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 33f1a94a3c..69e02df8dd 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.13-next.0", + "version": "0.1.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 9b15b97d5d..4a9e2bdb70 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-proxy-backend +## 0.2.42-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 4b82382ed8c2: Fixed invalid configuration schema. The configuration schema may be more strict as a result. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + ## 0.2.42-next.0 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 7ca210520c..56439cd0f3 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.42-next.0", + "version": "0.2.42-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index 37f7d42ec8..9789127cc4 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-rollbar-backend +## 0.1.45-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + ## 0.1.45-next.0 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index e19f4c43d0..3def2395f1 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.45-next.0", + "version": "0.1.45-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index f48ac96986..ea3e24c720 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.2.1-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- 0d347efc8f18: Use `fetchContents` directly instead of a `fetchPlainAction` +- c186c631b429: Import helpers from the node package instead of the backend package +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 676eddfb12..0d342d1717 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 390e1ae7bd..f6d1e6bd01 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.24-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- c186c631b429: Import helpers from the node package instead of the backend package +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.2.24-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 446d79e06c..df1d81bbd3 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.24-next.0", + "version": "0.2.24-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 95b481acb0..4c50ef46fd 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.3-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index 5099bb473b..8c9ba33a77 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.2.3-next.0", + "version": "0.2.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index ddf314f2bf..fa3f9201ac 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- c186c631b429: Import helpers from the node package instead of the backend package +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/integration@1.5.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.4.17-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 3697529c31..c514354955 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.17-next.0", + "version": "0.4.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 47c9c7ec51..fbeed9e5e3 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.8-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.1.8-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 0193427ec1..5b58d1ef87 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.8-next.0", + "version": "0.1.8-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index eed4d1a4c0..fcf915a348 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.21-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + ## 0.2.21-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 12e05629db..6e90170dab 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.21-next.0", + "version": "0.2.21-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 477d7ebb5e..dc8140c996 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-scaffolder-backend +## 1.15.2-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- d3b31a791eb1: Deprecated `executeShellCommand`, `RunCommandOptions`, and `fetchContents` from `@backstage/plugin-scaffolder-backend`, since they are useful for Scaffolder modules (who should not be importing from the plugin package itself). You should now import these from `@backstage/plugin-scaffolder-backend-node` instead. `RunCommandOptions` was renamed in the Node package as `ExecuteShellCommandOptions`, for consistency. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-catalog-backend@1.12.0-next.1 + - @backstage/plugin-scaffolder-node@0.1.6-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-scaffolder-common@1.3.2 + ## 1.15.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 0978a828bb..d1481e2068 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.15.2-next.0", + "version": "1.15.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index fb0a3f0823..fd1605c2df 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-scaffolder-node +## 0.1.6-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- d3b31a791eb1: Deprecated `executeShellCommand`, `RunCommandOptions`, and `fetchContents` from `@backstage/plugin-scaffolder-backend`, since they are useful for Scaffolder modules (who should not be importing from the plugin package itself). You should now import these from `@backstage/plugin-scaffolder-backend-node` instead. `RunCommandOptions` was renamed in the Node package as `ExecuteShellCommandOptions`, for consistency. +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-scaffolder-common@1.3.2 + ## 0.1.6-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 053e9a1dec..555a25417d 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.6-next.0", + "version": "0.1.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 2d1a68c3ff..414e7acf53 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-scaffolder +## 1.14.2-next.1 + +### Patch Changes + +- 8a0490fb669e: Fix the get entities query in the `MyGroupsPicker` to query the `kind=Group` entities. +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-scaffolder-common@1.3.2 + - @backstage/plugin-scaffolder-react@1.5.2-next.0 + ## 1.14.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 08a3004e08..f010329b14 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.14.2-next.0", + "version": "1.14.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index a01a5a41a1..b2a9d07118 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-search-backend-module-catalog +## 0.1.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index c1f46b7a3a..1c625a6e5f 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-catalog", "description": "A module for the search backend that exports catalog modules", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 268f563330..2191fa05ff 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.3.3-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/config@1.0.8 + - @backstage/plugin-search-common@1.2.5 + ## 1.3.3-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 47abe5e3b2..f119b1b28a 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.3.3-next.0", + "version": "1.3.3-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index a7c34b950e..fc9fedf290 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-search-backend-module-explore +## 0.1.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.5 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 46c11a2e62..13c6ce474c 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-explore", "description": "A module for the search backend that exports explore modules", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 25f4090f11..3bc95aaa2d 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.9-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-search-common@1.2.5 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 2f37f90681..63c8061fea 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index 6dad3cc182..6fc2307106 100644 --- a/plugins/search-backend-module-techdocs/CHANGELOG.md +++ b/plugins/search-backend-module-techdocs/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-search-backend-module-techdocs +## 0.1.4-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-techdocs-node@1.7.4-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + ## 0.1.4-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index 5a5e933523..c378a395c0 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-techdocs", "description": "A module for the search backend that exports techdocs modules", - "version": "0.1.4-next.0", + "version": "0.1.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index ad3d44f026..a8b8b930ee 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-backend-node +## 1.2.4-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + ## 1.2.4-next.0 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index b799d07d62..842c636bba 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.2.4-next.0", + "version": "1.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 26bf5db1f2..db52ff9e55 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-search-backend +## 1.4.0-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 951ab6c9db58: Add missing `configSchema` to package.json +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + ## 1.4.0-next.0 ### Minor Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 5342b412f9..167e4d835a 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.4.0-next.0", + "version": "1.4.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 1082d7d53e..af94df1ac4 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-shortcuts +## 0.3.13-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + ## 0.3.13-next.0 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 1c1699c67c..dfd05422ac 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.13-next.0", + "version": "0.3.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index 23010b6a79..3ef87ad9d1 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-sonarqube-backend +## 0.2.2-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.2-next.0 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 41aec6ecc9..2df0d1fd71 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.2.2-next.0", + "version": "0.2.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 51128ed9f5..59b6e51883 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-sonarqube +## 0.7.2-next.1 + +### Patch Changes + +- b2ccddefbdc6: Remove sonarQube card disable class +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-sonarqube-react@0.1.7 + ## 0.7.2-next.0 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index dda7ad59ea..ed3bc6142e 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.7.2-next.0", + "version": "0.7.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index 3e3716580e..aa16d5b8d4 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-stack-overflow-backend +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/plugin-search-common@1.2.5 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 3ad42aa525..c2fbc85def 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.2.4-next.0", + "version": "0.2.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 0a45b1eb07..c6fc25e2b9 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-stack-overflow +## 0.1.19-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-home-react@0.1.2-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + ## 0.1.19-next.0 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 030255ec62..3a6efe8d99 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.19-next.0", + "version": "0.1.19-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 4b07de0d02..a678af8513 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-tech-insights-common@0.2.11 + ## 0.1.32-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 3784d3d1f5..021fed330c 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.32-next.0", + "version": "0.1.32-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 4d2b8b5630..f652b66b77 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-tech-insights-backend +## 0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/plugin-tech-insights-node@0.4.6-next.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.11 + ## 0.5.14-next.0 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 944d1f2cc5..c5dfc94afb 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.14-next.0", + "version": "0.5.14-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index 8eb1287bd5..57ab233cfd 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-node +## 0.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-tech-insights-common@0.2.11 + ## 0.4.6-next.0 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 87d8ebb6ee..f89bb41748 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.6-next.0", + "version": "0.4.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index 079e53c767..c415a5a5af 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-tech-insights +## 0.3.13-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/catalog-model@1.4.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/types@1.1.0 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-tech-insights-common@0.2.11 + ## 0.3.13-next.0 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 67df31cf47..21f65edd6b 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.13-next.0", + "version": "0.3.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 4998c21869..ffa103dd67 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/plugin-catalog@1.12.1-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/test-utils@1.4.2-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + ## 1.0.17-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index ff14fb2187..a718d5a842 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.17-next.0", + "version": "1.0.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 24c9a12c2b..ebb0e6c2ed 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-techdocs-backend +## 1.6.5-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/plugin-search-backend-module-techdocs@0.1.4-next.1 + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-techdocs-node@1.7.4-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + ## 1.6.5-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index f3718e7a7d..87d10c91ae 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.6.5-next.0", + "version": "1.6.5-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index b04e012a5f..8af1e616bc 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + ## 1.0.16-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 79ac81c021..da388e9044 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.16-next.0", + "version": "1.0.16-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 7cafbe692c..4f3b73146d 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-node +## 1.7.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/integration@1.5.1 + - @backstage/integration-aws-node@0.1.5 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-search-common@1.2.5 + ## 1.7.4-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 6efbc99547..5f0f3d69d7 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.7.4-next.0", + "version": "1.7.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index fbf8b4cbdc..fe0813b36a 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs +## 1.6.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.1.16-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + ## 1.6.6-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 2892e2d983..080401b9f6 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.6.6-next.0", + "version": "1.6.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 3cdec47720..ab059adbff 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-todo-backend +## 0.2.0-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-catalog-node@1.4.1-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/integration@1.5.1 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.2.0-next.0 ### Minor Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index 1257ce5303..520fac0215 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.2.0-next.0", + "version": "0.2.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index c54bb63337..c33eab6b77 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-user-settings-backend +## 0.1.12-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/catalog-model@1.4.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + ## 0.1.12-next.0 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index caaa31faa8..b472754b2b 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.12-next.0", + "version": "0.1.12-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 682d521970..cac3188526 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-vault-backend +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-tasks@0.5.5-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + ## 0.3.4-next.0 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 36cfcbee1d..44d01c576b 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.3.4-next.0", + "version": "0.3.4-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 501758e40c..5fafa11c11 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-xcmetrics +## 0.2.41-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/errors@1.2.1 + - @backstage/theme@0.4.1 + ## 0.2.41-next.0 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 0a3ca50ca8..54320e6f7f 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.41-next.0", + "version": "0.2.41-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", From 8e741a1bd29b92c767e9b308f151d10468be1980 Mon Sep 17 00:00:00 2001 From: Connor Younglund Date: Tue, 1 Aug 2023 08:42:10 -0400 Subject: [PATCH 139/440] renamed config and variables Signed-off-by: Connor Younglund --- .changeset/warm-peas-hang.md | 2 +- plugins/sonarqube-backend/README.md | 6 +++--- plugins/sonarqube-backend/api-report.md | 6 +++--- plugins/sonarqube-backend/config.d.ts | 4 ++-- .../src/service/router.test.ts | 6 +++--- .../sonarqube-backend/src/service/router.ts | 4 ++-- .../src/service/sonarqubeInfoProvider.test.ts | 12 ++++++------ .../src/service/sonarqubeInfoProvider.ts | 19 ++++++++++--------- 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.changeset/warm-peas-hang.md b/.changeset/warm-peas-hang.md index 685bdc2489..a8a40c1ccd 100644 --- a/.changeset/warm-peas-hang.md +++ b/.changeset/warm-peas-hang.md @@ -2,4 +2,4 @@ '@backstage/plugin-sonarqube-backend': minor --- -Added optional `externalUrl` config for setting a different frontend URL +Added optional `externalBaseUrl` config for setting a different frontend URL diff --git a/plugins/sonarqube-backend/README.md b/plugins/sonarqube-backend/README.md index 9061dc9d1d..b417fea7c4 100644 --- a/plugins/sonarqube-backend/README.md +++ b/plugins/sonarqube-backend/README.md @@ -141,14 +141,14 @@ sonarqube: #### Example - Different frontend and backend URLs In some instances, you might want to use one URL for the backend and another for the frontend. -This can be achieved by using the optional `externalUrl` property in the config. +This can be achieved by using the optional `externalBaseUrl` property in the config. ##### Single instance config ```yaml sonarqube: baseUrl: https://sonarqube-internal.example.com - externalUrl: https://sonarqube.example.com + externalBaseUrl: https://sonarqube.example.com apiKey: 123456789abcdef0123456789abcedf012 ``` @@ -159,7 +159,7 @@ sonarqube: instances: - name: default baseUrl: https://default-sonarqube-internal.example.com - externalUrl: https://default-sonarqube.example.com + externalBaseUrl: https://default-sonarqube.example.com apiKey: 123456789abcdef0123456789abcedf012 - name: specialProject baseUrl: https://special-project-sonarqube.example.com diff --git a/plugins/sonarqube-backend/api-report.md b/plugins/sonarqube-backend/api-report.md index cf0314aad1..535db37185 100644 --- a/plugins/sonarqube-backend/api-report.md +++ b/plugins/sonarqube-backend/api-report.md @@ -15,7 +15,7 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { static fromConfig(config: Config): DefaultSonarqubeInfoProvider; getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; }; getFindings(options: { componentKey: string; @@ -50,7 +50,7 @@ export interface SonarqubeFindings { export interface SonarqubeInfoProvider { getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; }; getFindings(options: { componentKey: string; @@ -62,7 +62,7 @@ export interface SonarqubeInfoProvider { export interface SonarqubeInstanceConfig { apiKey: string; baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; name: string; } diff --git a/plugins/sonarqube-backend/config.d.ts b/plugins/sonarqube-backend/config.d.ts index 0e2ac1ca64..6e03a53f0c 100644 --- a/plugins/sonarqube-backend/config.d.ts +++ b/plugins/sonarqube-backend/config.d.ts @@ -28,7 +28,7 @@ export interface Config { * Use this if you want to use a different url for the frontend than the backend. * @visibility frontend */ - externalUrl?: string; + externalBaseUrl?: string; /** * The api key to access the sonarqube instance under baseUrl. @@ -58,7 +58,7 @@ export interface Config { * Use this if you want to use a different url for the frontend than the backend. * @visibility frontend */ - externalUrl?: string; + externalBaseUrl?: string; /** * The api key to access the sonarqube instance. diff --git a/plugins/sonarqube-backend/src/service/router.test.ts b/plugins/sonarqube-backend/src/service/router.test.ts index bede4c7f6f..b40e2d1528 100644 --- a/plugins/sonarqube-backend/src/service/router.test.ts +++ b/plugins/sonarqube-backend/src/service/router.test.ts @@ -24,7 +24,7 @@ import { SonarqubeFindings } from './sonarqubeInfoProvider'; describe('createRouter', () => { let app: express.Express; const getBaseUrlMock: jest.Mock< - { baseUrl: string; externalUrl?: string }, + { baseUrl: string; externalBaseUrl?: string }, [{ instanceName: string }] > = jest.fn(); const getFindingsMock: jest.Mock< @@ -147,10 +147,10 @@ describe('createRouter', () => { expect(response.body).toEqual({ instanceUrl: DUMMY_INSTANCE_URL }); }); - it('returns the external url when provided', async () => { + it('returns the external base url when provided', async () => { getBaseUrlMock.mockReturnValue({ baseUrl: DUMMY_INSTANCE_URL, - externalUrl: DUMMY_INSTANCE_EXTERNAL_URL, + externalBaseUrl: DUMMY_INSTANCE_EXTERNAL_URL, }); const response = await request(app).get('/instanceUrl').send(); expect(response.status).toEqual(200); diff --git a/plugins/sonarqube-backend/src/service/router.ts b/plugins/sonarqube-backend/src/service/router.ts index 9c63c5c3cd..5a993b5d59 100644 --- a/plugins/sonarqube-backend/src/service/router.ts +++ b/plugins/sonarqube-backend/src/service/router.ts @@ -81,11 +81,11 @@ export async function createRouter( ? `Retrieving sonarqube instance URL for key ${instanceKey}` : `Retrieving default sonarqube instance URL as instanceKey is not provided`, ); - const { baseUrl, externalUrl } = sonarqubeInfoProvider.getBaseUrl({ + const { baseUrl, externalBaseUrl } = sonarqubeInfoProvider.getBaseUrl({ instanceName: instanceKey, }); response.json({ - instanceUrl: externalUrl || baseUrl, + instanceUrl: externalBaseUrl || baseUrl, }); }); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts index 151f767974..468020c1b3 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts @@ -302,22 +302,22 @@ describe('DefaultSonarqubeInfoProvider', () => { }); }); - it('Provide external url for simple config', async () => { + it('Provide external base url for simple config', async () => { const provider = configureProvider({ sonarqube: { baseUrl: 'https://sonarqube-internal.example.com', - externalUrl: 'https://sonarqube.example.com', + externalBaseUrl: 'https://sonarqube.example.com', apiKey: '123456789abcdef0123456789abcedf012', }, }); expect(provider.getBaseUrl()).toEqual({ baseUrl: 'https://sonarqube-internal.example.com', - externalUrl: 'https://sonarqube.example.com', + externalBaseUrl: 'https://sonarqube.example.com', }); }); - it('Provide external url for named config', async () => { + it('Provide external base url for named config', async () => { const provider = configureProvider({ sonarqube: { instances: [ @@ -329,7 +329,7 @@ describe('DefaultSonarqubeInfoProvider', () => { { name: 'other', baseUrl: 'https://sonarqube-other-internal.example.com', - externalUrl: 'https://sonarqube-other.example.com', + externalBaseUrl: 'https://sonarqube-other.example.com', apiKey: '123456789abcdef0123456789abcedf012', }, ], @@ -338,7 +338,7 @@ describe('DefaultSonarqubeInfoProvider', () => { expect(provider.getBaseUrl({ instanceName: 'other' })).toEqual({ baseUrl: 'https://sonarqube-other-internal.example.com', - externalUrl: 'https://sonarqube-other.example.com', + externalBaseUrl: 'https://sonarqube-other.example.com', }); }); }); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts index 6277f6f57e..a5c0bf985a 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts @@ -32,7 +32,7 @@ export interface SonarqubeInfoProvider { */ getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; }; /** @@ -102,7 +102,7 @@ export interface SonarqubeInstanceConfig { /** * External url to access the instance from the frontend */ - externalUrl?: string; + externalBaseUrl?: string; /** * Access token to access the sonarqube instance as generated in user profile. */ @@ -139,7 +139,7 @@ export class SonarqubeConfig { sonarqubeConfig.getOptionalConfigArray('instances')?.map(c => ({ name: c.getString('name'), baseUrl: c.getString('baseUrl'), - externalUrl: c.getOptionalString('externalUrl'), + externalBaseUrl: c.getOptionalString('externalBaseUrl'), apiKey: c.getString('apiKey'), })) || []; @@ -150,10 +150,11 @@ export class SonarqubeConfig { // Get these as optional strings and check to give a better error message const baseUrl = sonarqubeConfig.getOptionalString('baseUrl'); - const externalUrl = sonarqubeConfig.getOptionalString('externalUrl'); + const externalBaseUrl = + sonarqubeConfig.getOptionalString('externalBaseUrl'); const apiKey = sonarqubeConfig.getOptionalString('apiKey'); - if (hasNamedDefault && (baseUrl || externalUrl || apiKey)) { + if (hasNamedDefault && (baseUrl || externalBaseUrl || apiKey)) { throw new Error( `Found both a named sonarqube instance with name ${DEFAULT_SONARQUBE_NAME} and top level baseUrl or apiKey config. Use only one style of config.`, ); @@ -169,11 +170,11 @@ export class SonarqubeConfig { if (unnamedAllPresent) { const unnamedInstanceConfig = [ - { name: DEFAULT_SONARQUBE_NAME, baseUrl, externalUrl, apiKey }, + { name: DEFAULT_SONARQUBE_NAME, baseUrl, externalBaseUrl, apiKey }, ] as { name: string; baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; apiKey: string; }[]; @@ -313,14 +314,14 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { */ getBaseUrl(options: { instanceName?: string } = {}): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; } { const instanceConfig = this.config.getInstanceConfig({ sonarqubeName: options.instanceName, }); return { baseUrl: instanceConfig.baseUrl, - externalUrl: instanceConfig.externalUrl, + externalBaseUrl: instanceConfig.externalBaseUrl, }; } From f55b6fd1e28e0dd67a6974a2acb507e2b3538221 Mon Sep 17 00:00:00 2001 From: Robert Bunning Date: Tue, 1 Aug 2023 11:20:31 -0400 Subject: [PATCH 140/440] Ensure subsequent page reads are run through the proxy Signed-off-by: Robert Bunning --- plugins/newrelic/src/api/index.test.ts | 34 +++++++++++++++++++++++--- plugins/newrelic/src/api/index.ts | 22 +++++++++++------ 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/plugins/newrelic/src/api/index.test.ts b/plugins/newrelic/src/api/index.test.ts index 13d9c5304d..69cf74066f 100644 --- a/plugins/newrelic/src/api/index.test.ts +++ b/plugins/newrelic/src/api/index.test.ts @@ -126,7 +126,7 @@ describe('NewRelicClient', () => { headers: new Map([ [ 'link', - '; rel="next", ; rel="next"', + '; rel="next", ; rel="next"', ], ['otherheader', 'otherValue'], ]), @@ -135,7 +135,7 @@ describe('NewRelicClient', () => { ok: true, json: async () => ({ applications: [] }), headers: new Map([ - ['Link', '; rel="next",'], + ['Link', '; rel="next",'], ]), }) .mockResolvedValueOnce({ @@ -170,10 +170,10 @@ describe('NewRelicClient', () => { 'https://test.test/newrelic/apm/api/applications.json', ); expect(mockedFetchApi.fetch).toHaveBeenCalledWith( - 'https://next.page/page2', + 'https://test.test/newrelic/apm/api/applications.json?page=2', ); expect(mockedFetchApi.fetch).toHaveBeenCalledWith( - 'https://next.page/page3', + 'https://test.test/newrelic/apm/api/applications.json?page=3', ); expect(actual).toStrictEqual(expected); }); @@ -220,6 +220,7 @@ describe('NewRelicClient', () => { ['<>; rel:"value"'], ['; rel: "next"'], ['ABCDE'], + ['; rel="next",'], ])( 'It does not attempt pagination when the link header value is invalid (%p)', async linkHeaderValue => { @@ -309,4 +310,29 @@ describe('NewRelicClient', () => { expect(actual).toStrictEqual({ applications: [] }); }); + + it('Generates the base url only once', async () => { + const mockedDiscoveryApi: DiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValueOnce('https://test.test'), + }; + + const mockedFetchApi: FetchApi = { + fetch: jest.fn().mockResolvedValue({ + ok: true, + json: async () => ({ applications: [] }), + }), + }; + + const client = new NewRelicClient({ + discoveryApi: mockedDiscoveryApi, + fetchApi: mockedFetchApi, + }); + + await client.getApplications(); + await client.getApplications(); + await client.getApplications(); + await client.getApplications(); + + expect(mockedDiscoveryApi.getBaseUrl).toHaveBeenCalledTimes(1); + }); }); diff --git a/plugins/newrelic/src/api/index.ts b/plugins/newrelic/src/api/index.ts index 9c95f3fe1f..b471104139 100644 --- a/plugins/newrelic/src/api/index.ts +++ b/plugins/newrelic/src/api/index.ts @@ -91,16 +91,22 @@ export class NewRelicClient implements NewRelicApi { private readonly discoveryApi: DiscoveryApi; private readonly fetchApi: FetchApi; private readonly proxyPathBase: string; + private baseUrl: string; constructor(options: Options) { this.discoveryApi = options.discoveryApi; this.fetchApi = options.fetchApi; this.proxyPathBase = options.proxyPathBase ?? DEFAULT_PROXY_PATH_BASE; + this.baseUrl = ''; } async getApplications(): Promise { - const proxyUrl = await this.discoveryApi.getBaseUrl('proxy'); - let targetUrl = `${proxyUrl}${this.proxyPathBase}/apm/api/applications.json`; + if (!this.baseUrl) { + const proxyUrl = await this.discoveryApi.getBaseUrl('proxy'); + this.baseUrl = `${proxyUrl}${this.proxyPathBase}/apm/api/applications.json`; + } + + let targetUrl = this.baseUrl; let hasNextPage = true; try { @@ -111,7 +117,7 @@ export class NewRelicClient implements NewRelicApi { await this.fetchNewRelic(targetUrl); hasNextPage = hasMoreApplications; - targetUrl = pagination!.nextPageLink; + targetUrl = hasNextPage ? pagination!.nextPageLink : ''; applications = applications.concat(applicationsFromReadPage); } while (hasNextPage); @@ -155,12 +161,12 @@ export class NewRelicClient implements NewRelicApi { } const nextRelevantLink = linkHeader.replaceAll(' ', '').split(',')[0]; - - // Link should be of the format ;rel="relation" - const linkParts = nextRelevantLink.match(/^<(.+)>;rel="(.+)"$/); - const nextPageLink = linkParts?.[1]; + const linkParts = nextRelevantLink.match(/^<.+(\?page=.+)>;rel="(.+)"$/); + const nextPageNumber = linkParts?.[1]; const relation = linkParts?.[2]; - const isValidLink = !!(!!linkParts && nextPageLink && relation); + + const nextPageLink = `${this.baseUrl}${nextPageNumber}`; + const isValidLink = !!(!!linkParts && nextPageNumber && relation); if (!nextRelevantLink || !isValidLink) { return undefined; From 5003fc9667415e744ea28ef16b1959170aa1cf46 Mon Sep 17 00:00:00 2001 From: Chris James Date: Tue, 1 Aug 2023 10:35:07 -0700 Subject: [PATCH 141/440] Add changeset for changes Signed-off-by: Chris James --- .changeset/clever-adults-add.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/clever-adults-add.md diff --git a/.changeset/clever-adults-add.md b/.changeset/clever-adults-add.md new file mode 100644 index 0000000000..940b82474e --- /dev/null +++ b/.changeset/clever-adults-add.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-pagerduty': minor +--- + +Add new 'disableChangeEvents' attribute to PagerDuty Card to hide the Change Events tab and disable fetching of chang events for a the service. From 365b0125c05156fff4beb8f6cc5322fb97f89325 Mon Sep 17 00:00:00 2001 From: Chris James Date: Tue, 1 Aug 2023 10:36:24 -0700 Subject: [PATCH 142/440] Update clever-adults-add.md Signed-off-by: Chris James --- .changeset/clever-adults-add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/clever-adults-add.md b/.changeset/clever-adults-add.md index 940b82474e..c5ca2de902 100644 --- a/.changeset/clever-adults-add.md +++ b/.changeset/clever-adults-add.md @@ -2,4 +2,4 @@ '@backstage/plugin-pagerduty': minor --- -Add new 'disableChangeEvents' attribute to PagerDuty Card to hide the Change Events tab and disable fetching of chang events for a the service. +Add new 'disableChangeEvents' attribute to PagerDuty Card to hide the Change Events tab and disable fetching of change events for the PagerDuty service. From 74e76c3b45467575877b569505109fbdee573757 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 1 Aug 2023 15:35:13 -0400 Subject: [PATCH 143/440] chore: Add OpenSSF Badges Signed-off-by: Adam Harvey --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d9da778694..9c8fbec79b 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ [![Codecov](https://img.shields.io/codecov/c/github/backstage/backstage)](https://codecov.io/gh/backstage/backstage) [![](https://img.shields.io/github/v/release/backstage/backstage)](https://github.com/backstage/backstage/releases) [![Uffizzi](https://img.shields.io/endpoint?url=https%3A%2F%2Fapp.uffizzi.com%2Fapi%2Fv1%2Fpublic%2Fshields%2Fgithub.com%2Fbackstage%2Fbackstage)](https://app.uffizzi.com/ephemeral-environments/backstage/backstage) +[![OpenSSF Best Practices](https://bestpractices.coreinfrastructure.org/projects/7678/badge)](https://bestpractices.coreinfrastructure.org/projects/7678) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/backstage/backstage/badge)](https://securityscorecards.dev/viewer/?uri=github.com/backstage/backstage) > 🏖️ The week beginning the 26th of June, some of the maintainers will be taking a well earned Summer Holiday break. We will be slower to respond to issues and PRs during this time. Releases will continue to be shipped weekly. Normal service will resume on the 24th of July. 🏝️ From 0a9034a49088fbc6a0d787c5ca10ef9ba3f51888 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 1 Aug 2023 15:59:04 -0400 Subject: [PATCH 144/440] chore(security): Add OpenSSF Scorecard scanning Signed-off-by: Adam Harvey --- .github/workflows/scorecard.yml | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/scorecard.yml diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000000..6841b0776f --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,67 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + # branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '41 8 * * 6' + push: + branches: [ "master" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@e38b1902ae4f44df626f11ba0734b14fb91f8f86 # v2.1.2 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + with: + sarif_file: results.sarif + From 31cd0dd9e514b24523913ac083d576be9fccbce2 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 1 Aug 2023 16:25:53 -0400 Subject: [PATCH 145/440] chore: Prettier cleanup Signed-off-by: Adam Harvey --- .github/workflows/scorecard.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 6841b0776f..63c44bcf20 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -12,7 +12,7 @@ on: schedule: - cron: '41 8 * * 6' push: - branches: [ "master" ] + branches: ['master'] # Declare default permissions as read only. permissions: read-all @@ -28,12 +28,12 @@ jobs: id-token: write steps: - - name: "Checkout code" + - name: 'Checkout code' uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 with: persist-credentials: false - - name: "Run analysis" + - name: 'Run analysis' uses: ossf/scorecard-action@e38b1902ae4f44df626f11ba0734b14fb91f8f86 # v2.1.2 with: results_file: results.sarif @@ -52,7 +52,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - - name: "Upload artifact" + - name: 'Upload artifact' uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 with: name: SARIF file @@ -60,8 +60,7 @@ jobs: retention-days: 5 # Upload the results to GitHub's code scanning dashboard. - - name: "Upload to code-scanning" + - name: 'Upload to code-scanning' uses: github/codeql-action/upload-sarif@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 with: sarif_file: results.sarif - From 414b8f16ba82674d2c579d0b5ecfe086a054d481 Mon Sep 17 00:00:00 2001 From: Dillon Smedley Date: Tue, 1 Aug 2023 22:20:50 -0400 Subject: [PATCH 146/440] Fixed changelog for fromConfig and moved config example to as config section of readme Signed-off-by: Dillon Smedley --- plugins/explore-backend/CHANGELOG.md | 2 +- plugins/explore-backend/README.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 2c478e6a4e..de8b7b7dd6 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -99,7 +99,7 @@ - ]; - - StaticExploreToolProvider.fromData(tools) - + StaticExploreToolProvider.fromData(env.config) + + StaticExploreToolProvider.fromConfig(env.config) ``` - Updated dependencies diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md index a7a6496fe4..543e8e2fa2 100644 --- a/plugins/explore-backend/README.md +++ b/plugins/explore-backend/README.md @@ -39,15 +39,6 @@ export default async function createPlugin( } ``` -#### Tools as Code - -Install dependencies - -```bash -# From your Backstage root directory -yarn add --cwd packages/backend @backstage/plugin-explore-backend @backstage/plugin-explore-common -``` - Config: ```yaml @@ -63,6 +54,15 @@ explore: - nerdGraph ``` +#### Tools as Code + +Install dependencies + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-explore-backend @backstage/plugin-explore-common +``` + You'll need to add the plugin to the router in your `backend` package. You can do this by creating a file called `packages/backend/src/plugins/explore.ts` with the following content: From 83467b0534eeed2d816912daf1e1e7efd07e4cf6 Mon Sep 17 00:00:00 2001 From: "jean-philippe.blary" Date: Wed, 2 Aug 2023 09:37:51 +0200 Subject: [PATCH 147/440] fix(explore): don't put ? if no query parameters Signed-off-by: jean-philippe.blary --- .changeset/violet-dogs-breathe.md | 5 +++++ plugins/explore/src/api/ExploreClient.test.ts | 16 ++++++++++++++++ plugins/explore/src/api/ExploreClient.ts | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 .changeset/violet-dogs-breathe.md diff --git a/.changeset/violet-dogs-breathe.md b/.changeset/violet-dogs-breathe.md new file mode 100644 index 0000000000..938c8df678 --- /dev/null +++ b/.changeset/violet-dogs-breathe.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-explore': patch +--- + +Don't put "?" in URL if no query parameters. diff --git a/plugins/explore/src/api/ExploreClient.test.ts b/plugins/explore/src/api/ExploreClient.test.ts index bbec568a09..77eb42ddf6 100644 --- a/plugins/explore/src/api/ExploreClient.test.ts +++ b/plugins/explore/src/api/ExploreClient.test.ts @@ -83,6 +83,22 @@ describe('ExploreClient', () => { }); expect(response).toEqual(expectedResponse); }); + + it('should request explore tools without filters', async () => { + const expectedResponse: GetExploreToolsResponse = { + tools: mockTools, + }; + + server.use( + rest.get(`${mockBaseUrl}/tools`, (req, res, ctx) => { + expect(req.url.search).toBe(''); + return res(ctx.json(expectedResponse)); + }), + ); + + const response = await client.getTools(); + expect(response).toEqual(expectedResponse); + }); }); describe('when using exploreToolsConfig for backwards compatibility', () => { diff --git a/plugins/explore/src/api/ExploreClient.ts b/plugins/explore/src/api/ExploreClient.ts index 9dca2755fe..4528200b43 100644 --- a/plugins/explore/src/api/ExploreClient.ts +++ b/plugins/explore/src/api/ExploreClient.ts @@ -71,7 +71,7 @@ export class ExploreClient implements ExploreApi { filter?.lifecycle?.map(l => `lifecycle=${encodeURIComponent(l)}`) ?? []; const query = [...tags, ...lifecycles].join('&'); - const response = await fetch(`${baseUrl}/tools?${query}`); + const response = await fetch(`${baseUrl}/tools${query ? `?${query}` : ''}`); if (!response.ok) { throw await ResponseError.fromResponse(response); From 29f77f923c71ce9812f57973bf05e85f67fe6e6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 2 Aug 2023 10:14:06 +0200 Subject: [PATCH 148/440] Ensure that all services are dependency injected into the module instead of taken from options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/beige-files-reflect.md | 7 +++++ .../alpha-api-report.md | 2 +- .../package.json | 1 + .../src/alpha.ts | 9 ++++-- .../alpha-api-report.md | 6 +--- .../src/alpha.ts | 28 +++++++++++-------- .../alpha-api-report.md | 2 +- .../package.json | 1 + .../src/alpha.ts | 6 +++- yarn.lock | 2 ++ 10 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 .changeset/beige-files-reflect.md diff --git a/.changeset/beige-files-reflect.md b/.changeset/beige-files-reflect.md new file mode 100644 index 0000000000..e888d5e0f8 --- /dev/null +++ b/.changeset/beige-files-reflect.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-search-backend-module-techdocs': patch +'@backstage/plugin-search-backend-module-catalog': patch +'@backstage/plugin-search-backend-module-explore': patch +--- + +Ensure that all services are dependency injected into the module instead of taken from options diff --git a/plugins/search-backend-module-catalog/alpha-api-report.md b/plugins/search-backend-module-catalog/alpha-api-report.md index 70fae9ef93..7c6e91b6a1 100644 --- a/plugins/search-backend-module-catalog/alpha-api-report.md +++ b/plugins/search-backend-module-catalog/alpha-api-report.md @@ -15,7 +15,7 @@ export const searchModuleCatalogCollator: ( // @alpha export type SearchModuleCatalogCollatorOptions = Omit< DefaultCatalogCollatorFactoryOptions, - 'discovery' | 'tokenManager' + 'discovery' | 'tokenManager' | 'catalogClient' > & { schedule?: TaskScheduleDefinition; }; diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index 1c625a6e5f..37473ef04b 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -49,6 +49,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^" diff --git a/plugins/search-backend-module-catalog/src/alpha.ts b/plugins/search-backend-module-catalog/src/alpha.ts index f79aacab52..cfd8c13539 100644 --- a/plugins/search-backend-module-catalog/src/alpha.ts +++ b/plugins/search-backend-module-catalog/src/alpha.ts @@ -30,6 +30,7 @@ import { DefaultCatalogCollatorFactory, DefaultCatalogCollatorFactoryOptions, } from '@backstage/plugin-search-backend-module-catalog'; +import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; /** * @alpha @@ -37,14 +38,15 @@ import { */ export type SearchModuleCatalogCollatorOptions = Omit< DefaultCatalogCollatorFactoryOptions, - 'discovery' | 'tokenManager' + 'discovery' | 'tokenManager' | 'catalogClient' > & { schedule?: TaskScheduleDefinition; }; /** - * @alpha * Search backend module for the Catalog index. + * + * @alpha */ export const searchModuleCatalogCollator = createBackendModule( (options?: SearchModuleCatalogCollatorOptions) => ({ @@ -58,6 +60,7 @@ export const searchModuleCatalogCollator = createBackendModule( tokenManager: coreServices.tokenManager, scheduler: coreServices.scheduler, indexRegistry: searchIndexRegistryExtensionPoint, + catalog: catalogServiceRef, }, async init({ config, @@ -65,6 +68,7 @@ export const searchModuleCatalogCollator = createBackendModule( tokenManager, scheduler, indexRegistry, + catalog, }) { const defaultSchedule = { frequency: { minutes: 10 }, @@ -80,6 +84,7 @@ export const searchModuleCatalogCollator = createBackendModule( ...options, discovery, tokenManager, + catalogClient: catalog, }), }); }, diff --git a/plugins/search-backend-module-explore/alpha-api-report.md b/plugins/search-backend-module-explore/alpha-api-report.md index cf32b59dd3..7b0f2658d6 100644 --- a/plugins/search-backend-module-explore/alpha-api-report.md +++ b/plugins/search-backend-module-explore/alpha-api-report.md @@ -5,7 +5,6 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; import { TaskScheduleDefinition } from '@backstage/backend-tasks'; -import { ToolDocumentCollatorFactoryOptions } from '@backstage/plugin-search-backend-module-explore'; // @alpha export const searchModuleExploreCollator: ( @@ -13,10 +12,7 @@ export const searchModuleExploreCollator: ( ) => BackendFeature; // @alpha -export type SearchModuleExploreCollatorOptions = Omit< - ToolDocumentCollatorFactoryOptions, - 'logger' | 'discovery' -> & { +export type SearchModuleExploreCollatorOptions = { schedule?: TaskScheduleDefinition; }; diff --git a/plugins/search-backend-module-explore/src/alpha.ts b/plugins/search-backend-module-explore/src/alpha.ts index 542d6def2b..fadbcda3a5 100644 --- a/plugins/search-backend-module-explore/src/alpha.ts +++ b/plugins/search-backend-module-explore/src/alpha.ts @@ -27,25 +27,21 @@ import { TaskScheduleDefinition } from '@backstage/backend-tasks'; import { loggerToWinstonLogger } from '@backstage/backend-common'; import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; -import { - ToolDocumentCollatorFactory, - ToolDocumentCollatorFactoryOptions, -} from '@backstage/plugin-search-backend-module-explore'; +import { ToolDocumentCollatorFactory } from '@backstage/plugin-search-backend-module-explore'; /** - * @alpha * Options for {@link searchModuleExploreCollator}. + * + * @alpha */ -export type SearchModuleExploreCollatorOptions = Omit< - ToolDocumentCollatorFactoryOptions, - 'logger' | 'discovery' -> & { +export type SearchModuleExploreCollatorOptions = { schedule?: TaskScheduleDefinition; }; /** - * @alpha * Search backend module for the Explore index. + * + * @alpha */ export const searchModuleExploreCollator = createBackendModule( (options?: SearchModuleExploreCollatorOptions) => ({ @@ -58,9 +54,17 @@ export const searchModuleExploreCollator = createBackendModule( logger: coreServices.logger, discovery: coreServices.discovery, scheduler: coreServices.scheduler, + tokenManager: coreServices.tokenManager, indexRegistry: searchIndexRegistryExtensionPoint, }, - async init({ config, logger, discovery, scheduler, indexRegistry }) { + async init({ + config, + logger, + discovery, + scheduler, + indexRegistry, + tokenManager, + }) { const defaultSchedule = { frequency: { minutes: 10 }, timeout: { minutes: 15 }, @@ -72,9 +76,9 @@ export const searchModuleExploreCollator = createBackendModule( options?.schedule ?? defaultSchedule, ), factory: ToolDocumentCollatorFactory.fromConfig(config, { - ...options, discovery, logger: loggerToWinstonLogger(logger), + tokenManager, }), }); }, diff --git a/plugins/search-backend-module-techdocs/alpha-api-report.md b/plugins/search-backend-module-techdocs/alpha-api-report.md index 71ce09b744..0eac010b4c 100644 --- a/plugins/search-backend-module-techdocs/alpha-api-report.md +++ b/plugins/search-backend-module-techdocs/alpha-api-report.md @@ -15,7 +15,7 @@ export const searchModuleTechDocsCollator: ( // @alpha export type SearchModuleTechDocsCollatorOptions = Omit< TechDocsCollatorFactoryOptions, - 'logger' | 'discovery' | 'tokenManager' + 'logger' | 'discovery' | 'tokenManager' | 'catalogClient' > & { schedule?: TaskScheduleDefinition; }; diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index c378a395c0..ffc9d0ff4f 100644 --- a/plugins/search-backend-module-techdocs/package.json +++ b/plugins/search-backend-module-techdocs/package.json @@ -49,6 +49,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-search-backend-node": "workspace:^", "@backstage/plugin-search-common": "workspace:^", diff --git a/plugins/search-backend-module-techdocs/src/alpha.ts b/plugins/search-backend-module-techdocs/src/alpha.ts index fe34d5241b..5d82b6804f 100644 --- a/plugins/search-backend-module-techdocs/src/alpha.ts +++ b/plugins/search-backend-module-techdocs/src/alpha.ts @@ -26,6 +26,7 @@ import { import { TaskScheduleDefinition } from '@backstage/backend-tasks'; import { loggerToWinstonLogger } from '@backstage/backend-common'; import { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; +import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; import { DefaultTechDocsCollatorFactory, @@ -38,7 +39,7 @@ import { */ export type SearchModuleTechDocsCollatorOptions = Omit< TechDocsCollatorFactoryOptions, - 'logger' | 'discovery' | 'tokenManager' + 'logger' | 'discovery' | 'tokenManager' | 'catalogClient' > & { schedule?: TaskScheduleDefinition; }; @@ -59,6 +60,7 @@ export const searchModuleTechDocsCollator = createBackendModule( discovery: coreServices.discovery, tokenManager: coreServices.tokenManager, scheduler: coreServices.scheduler, + catalog: catalogServiceRef, indexRegistry: searchIndexRegistryExtensionPoint, }, async init({ @@ -67,6 +69,7 @@ export const searchModuleTechDocsCollator = createBackendModule( discovery, tokenManager, scheduler, + catalog, indexRegistry, }) { const defaultSchedule = { @@ -84,6 +87,7 @@ export const searchModuleTechDocsCollator = createBackendModule( discovery, tokenManager, logger: loggerToWinstonLogger(logger), + catalogClient: catalog, }), }); }, diff --git a/yarn.lock b/yarn.lock index 1fb653e7bc..f628161240 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8519,6 +8519,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" @@ -8599,6 +8600,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-search-backend-node": "workspace:^" "@backstage/plugin-search-common": "workspace:^" From e65b43779882d6ce7efc1ba79295cd864108d7f7 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 2 Aug 2023 11:00:35 +0100 Subject: [PATCH 149/440] fixes after merge to master Signed-off-by: Brian Fletcher --- .../src/scaffolder/actions/builtin/fetch/plain.examples.test.ts | 2 +- .../scaffolder/actions/builtin/fetch/plainFile.examples.test.ts | 2 +- .../scaffolder/actions/builtin/fetch/template.examples.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts index e3c7d3e15c..c5e270bce6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts @@ -25,7 +25,7 @@ import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { createFetchPlainAction } from './plain'; import { PassThrough } from 'stream'; -import { fetchContents } from './helpers'; +import { fetchContents } from '@backstage/plugin-scaffolder-node'; import { examples } from './plain.examples'; describe('fetch:plain examples', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts index 7ae34cc140..cc1f6fa667 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts @@ -25,7 +25,7 @@ import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { createFetchPlainFileAction } from './plainFile'; import { PassThrough } from 'stream'; -import { fetchFile } from './helpers'; +import { fetchFile } from '@backstage/plugin-scaffolder-node'; import { examples } from './plainFile.examples'; describe('fetch:plain:file examples', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts index f744460690..fa4183cabe 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts @@ -25,7 +25,7 @@ import { } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { PassThrough } from 'stream'; -import { fetchContents } from './helpers'; +import { fetchContents } from '@backstage/plugin-scaffolder-node'; import { createFetchTemplateAction } from './template'; import { ActionContext, From bb70a9c3886a9e759393649568977dc9d41defb3 Mon Sep 17 00:00:00 2001 From: djamaile Date: Wed, 2 Aug 2023 12:09:46 +0200 Subject: [PATCH 150/440] chore: add frontend visibility to provider objects in auth config Signed-off-by: djamaile --- .changeset/unlucky-bags-pump.md | 5 +++++ plugins/auth-backend/config.d.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 .changeset/unlucky-bags-pump.md diff --git a/.changeset/unlucky-bags-pump.md b/.changeset/unlucky-bags-pump.md new file mode 100644 index 0000000000..a275887410 --- /dev/null +++ b/.changeset/unlucky-bags-pump.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Add frontend visibility to provider objects in `auth` config. diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts index d059f2ec04..4ebf7c9de1 100644 --- a/plugins/auth-backend/config.d.ts +++ b/plugins/auth-backend/config.d.ts @@ -62,6 +62,7 @@ export interface Config { * @additionalProperties true */ providers?: { + /** @visibility frontend */ google?: { [authEnv: string]: { clientId: string; @@ -72,6 +73,7 @@ export interface Config { callbackUrl?: string; }; }; + /** @visibility frontend */ github?: { [authEnv: string]: { clientId: string; @@ -83,6 +85,7 @@ export interface Config { enterpriseInstanceUrl?: string; }; }; + /** @visibility frontend */ gitlab?: { [authEnv: string]: { clientId: string; @@ -94,6 +97,7 @@ export interface Config { callbackUrl?: string; }; }; + /** @visibility frontend */ saml?: { entryPoint: string; logoutUrl?: string; @@ -117,6 +121,7 @@ export interface Config { digestAlgorithm?: string; acceptedClockSkewMs?: number; }; + /** @visibility frontend */ okta?: { [authEnv: string]: { clientId: string; @@ -130,6 +135,7 @@ export interface Config { callbackUrl?: string; }; }; + /** @visibility frontend */ oauth2?: { [authEnv: string]: { clientId: string; @@ -143,6 +149,7 @@ export interface Config { disableRefresh?: boolean; }; }; + /** @visibility frontend */ oidc?: { [authEnv: string]: { clientId: string; @@ -158,6 +165,7 @@ export interface Config { prompt?: string; }; }; + /** @visibility frontend */ auth0?: { [authEnv: string]: { clientId: string; @@ -172,6 +180,7 @@ export interface Config { connectionScope?: string; }; }; + /** @visibility frontend */ microsoft?: { [authEnv: string]: { clientId: string; @@ -183,6 +192,7 @@ export interface Config { callbackUrl?: string; }; }; + /** @visibility frontend */ onelogin?: { [authEnv: string]: { clientId: string; @@ -194,10 +204,12 @@ export interface Config { callbackUrl?: string; }; }; + /** @visibility frontend */ awsalb?: { iss?: string; region: string; }; + /** @visibility frontend */ cfaccess?: { teamName: string; }; From 85617f898d72d9ee19e672c2c3f90e2971e67e23 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 2 Aug 2023 11:25:39 +0100 Subject: [PATCH 151/440] fix tests Signed-off-by: Brian Fletcher --- .../actions/builtin/fetch/plain.examples.test.ts | 7 +++++-- .../actions/builtin/fetch/plainFile.examples.test.ts | 8 +++++--- .../actions/builtin/fetch/template.examples.test.ts | 5 +++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts index c5e270bce6..6b308a97eb 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.examples.test.ts @@ -16,8 +16,6 @@ import yaml from 'yaml'; -jest.mock('./helpers'); - import os from 'os'; import { resolve as resolvePath } from 'path'; import { getVoidLogger, UrlReader } from '@backstage/backend-common'; @@ -28,6 +26,11 @@ import { PassThrough } from 'stream'; import { fetchContents } from '@backstage/plugin-scaffolder-node'; import { examples } from './plain.examples'; +jest.mock('@backstage/plugin-scaffolder-node', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-node'), + fetchContents: jest.fn(), +})); + describe('fetch:plain examples', () => { const integrations = ScmIntegrations.fromConfig( new ConfigReader({ diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts index cc1f6fa667..86fe15be8e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts @@ -15,9 +15,6 @@ */ import yaml from 'yaml'; - -jest.mock('./helpers'); - import os from 'os'; import { resolve as resolvePath } from 'path'; import { getVoidLogger, UrlReader } from '@backstage/backend-common'; @@ -28,6 +25,11 @@ import { PassThrough } from 'stream'; import { fetchFile } from '@backstage/plugin-scaffolder-node'; import { examples } from './plainFile.examples'; +jest.mock('@backstage/plugin-scaffolder-node', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-node'), + fetchContents: jest.fn(), +})); + describe('fetch:plain:file examples', () => { const integrations = ScmIntegrations.fromConfig( new ConfigReader({ diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts index fa4183cabe..43bed5a048 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts @@ -25,16 +25,17 @@ import { } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { PassThrough } from 'stream'; -import { fetchContents } from '@backstage/plugin-scaffolder-node'; import { createFetchTemplateAction } from './template'; import { ActionContext, TemplateAction, + fetchContents, } from '@backstage/plugin-scaffolder-node'; import { examples } from './template.examples'; import yaml from 'yaml'; -jest.mock('./helpers', () => ({ +jest.mock('@backstage/plugin-scaffolder-node', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-node'), fetchContents: jest.fn(), })); From 1bce847ac4287d4213b540aa2f962b89ec4e2e99 Mon Sep 17 00:00:00 2001 From: Michael Oren Date: Wed, 2 Aug 2023 22:14:46 +1000 Subject: [PATCH 152/440] Add missing slash to proxying docs Signed-off-by: Michael Oren --- docs/plugins/proxying.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md index 3e20e37cad..442721a355 100644 --- a/docs/plugins/proxying.md +++ b/docs/plugins/proxying.md @@ -36,7 +36,7 @@ Example: ```yaml # in app-config.yaml proxy: - simple-example: http://simple.example.com:8080 + /simple-example: http://simple.example.com:8080 '/larger-example/v1': target: http://larger.example.com:8080/svc.v1 headers: From 1233e3b3d11760cc8c92ea127972af944c336fef Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 14:46:49 +0200 Subject: [PATCH 153/440] docs: minor naming fix Signed-off-by: Patrik Oldsberg --- docs/features/software-catalog/creating-the-catalog-graph.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/software-catalog/creating-the-catalog-graph.md b/docs/features/software-catalog/creating-the-catalog-graph.md index 8b0f21a52c..4dc5b461b2 100644 --- a/docs/features/software-catalog/creating-the-catalog-graph.md +++ b/docs/features/software-catalog/creating-the-catalog-graph.md @@ -64,7 +64,7 @@ The recommended approach would be to represent information in catalog-info files **Naming strategies:** -- Ldap: Internal ldap usernames as entity names. e.g., owner: user:myuser or user: my-team-name. +- Ldap: Internal ldap usernames as entity names. e.g., owner: user:my-user or user: my-team-name. **Ownership strategies:** From e65c4896f755799d01e6ef15a606ef7f09ff762e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 2 Aug 2023 15:17:29 +0200 Subject: [PATCH 154/440] Do not throw in backend.stop, if start failed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/brown-taxis-develop.md | 5 +++++ packages/backend-app-api/src/wiring/BackendInitializer.ts | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .changeset/brown-taxis-develop.md diff --git a/.changeset/brown-taxis-develop.md b/.changeset/brown-taxis-develop.md new file mode 100644 index 0000000000..19ebfdef1a --- /dev/null +++ b/.changeset/brown-taxis-develop.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Do not throw in backend.stop, if start failed diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 8c2b75e887..ec4b2a79ac 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -259,7 +259,12 @@ export class BackendInitializer { if (!this.#startPromise) { return; } - await this.#startPromise; + + try { + await this.#startPromise; + } catch (error) { + // The startup failed, but we may still want to do cleanup so we continue silently + } const lifecycleService = await this.#getRootLifecycleImpl(); await lifecycleService.shutdown(); From f1d32fb998d857408afcb193cf5c8aef46a30fb3 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:21:59 +0200 Subject: [PATCH 155/440] backend-next: install proxy backend Signed-off-by: Patrik Oldsberg --- packages/backend-next/package.json | 1 + packages/backend-next/src/index.ts | 4 ++++ yarn.lock | 1 + 3 files changed, 6 insertions(+) diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 38f85fb8c0..af4f483db0 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -42,6 +42,7 @@ "@backstage/plugin-permission-backend": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", + "@backstage/plugin-proxy-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", "@backstage/plugin-search-backend": "workspace:^", "@backstage/plugin-search-backend-module-catalog": "workspace:^", diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index fa7561e211..df3ce24618 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -39,6 +39,7 @@ import { devtoolsPlugin } from '@backstage/plugin-devtools-backend'; import { TaskScheduleDefinition } from '@backstage/backend-tasks'; import { adrPlugin } from '@backstage/plugin-adr-backend'; import { lighthousePlugin } from '@backstage/plugin-lighthouse-backend'; +import { proxyPlugin } from '@backstage/plugin-proxy-backend'; const backend = createBackend(); @@ -98,6 +99,9 @@ backend.add(kubernetesPlugin()); // Lighthouse backend.add(lighthousePlugin()); +// Proxy +backend.add(proxyPlugin()); + // Permissions backend.add(permissionPlugin()); backend.add(permissionModuleAllowAllPolicy()); diff --git a/yarn.lock b/yarn.lock index 1fb653e7bc..9e829b5a58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25172,6 +25172,7 @@ __metadata: "@backstage/plugin-permission-backend": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" + "@backstage/plugin-proxy-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" "@backstage/plugin-search-backend": "workspace:^" "@backstage/plugin-search-backend-module-catalog": "workspace:^" From 7daf65bfcfa1be447d9a48bd1c935e5227dcc06c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:25:19 +0200 Subject: [PATCH 156/440] proxy-backend: deprecate root proxy config, move to proxy.endpoints instead Signed-off-by: Patrik Oldsberg --- .changeset/rotten-rabbits-move.md | 5 + plugins/proxy-backend/config.d.ts | 100 +++++++++++--------- plugins/proxy-backend/src/plugin.ts | 51 +++++----- plugins/proxy-backend/src/service/router.ts | 59 +++++++++++- 4 files changed, 137 insertions(+), 78 deletions(-) create mode 100644 .changeset/rotten-rabbits-move.md diff --git a/.changeset/rotten-rabbits-move.md b/.changeset/rotten-rabbits-move.md new file mode 100644 index 0000000000..f2e1ffda08 --- /dev/null +++ b/.changeset/rotten-rabbits-move.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-proxy-backend': minor +--- + +Defining proxy endpoints directly under the root `proxy` configuration key is deprecated. Endpoints should now be declared under `proxy.endpoints` instead. The `skipInvalidProxies` and `reviveConsumedRequestBodies` can now also be configured through static configuration. diff --git a/plugins/proxy-backend/config.d.ts b/plugins/proxy-backend/config.d.ts index bc9cf7765a..79e1cfcba6 100644 --- a/plugins/proxy-backend/config.d.ts +++ b/plugins/proxy-backend/config.d.ts @@ -15,51 +15,63 @@ */ export interface Config { - /** - * A list of forwarding-proxies. Each key is a route to match, - * below the prefix that the proxy plugin is mounted on. It must - * start with a '/'. - */ proxy?: { - [key: string]: - | string - | { - /** - * Target of the proxy. Url string to be parsed with the url module. - */ - target: string; - /** - * Object with extra headers to be added to target requests. - */ - headers?: { - /** @visibility secret */ - Authorization?: string; - /** @visibility secret */ - authorization?: string; - /** @visibility secret */ - 'X-Api-Key'?: string; - /** @visibility secret */ - 'x-api-key'?: string; - [key: string]: string | undefined; + /** + * Rather than failing to start up, the proxy backend will instead just warn on invalid endpoints. + */ + skipInvalidProxies?: boolean; + + /** + * Revive request bodies that have already been consumed by earlier middleware. + */ + reviveConsumedRequestBodies?: boolean; + + /** + * A list of forwarding-proxies. Each key is a route to match, + * below the prefix that the proxy plugin is mounted on. It must + * start with a '/'. + */ + endpoints?: { + [key: string]: + | string + | { + /** + * Target of the proxy. Url string to be parsed with the url module. + */ + target: string; + /** + * Object with extra headers to be added to target requests. + */ + headers?: { + /** @visibility secret */ + Authorization?: string; + /** @visibility secret */ + authorization?: string; + /** @visibility secret */ + 'X-Api-Key'?: string; + /** @visibility secret */ + 'x-api-key'?: string; + [key: string]: string | undefined; + }; + /** + * Changes the origin of the host header to the target URL. Default: true. + */ + changeOrigin?: boolean; + /** + * Rewrite target's url path. Object-keys will be used as RegExp to match paths. + * If pathRewrite is not specified, it is set to a single rewrite that removes the entire prefix and route. + */ + pathRewrite?: { [regexp: string]: string }; + /** + * Limit the forwarded HTTP methods, for example allowedMethods: ['GET'] to enforce read-only access. + */ + allowedMethods?: string[]; + /** + * Limit the forwarded HTTP methods. By default, only the headers that are considered safe for CORS + * and headers that are set by the proxy will be forwarded. + */ + allowedHeaders?: string[]; }; - /** - * Changes the origin of the host header to the target URL. Default: true. - */ - changeOrigin?: boolean; - /** - * Rewrite target's url path. Object-keys will be used as RegExp to match paths. - * If pathRewrite is not specified, it is set to a single rewrite that removes the entire prefix and route. - */ - pathRewrite?: { [regexp: string]: string }; - /** - * Limit the forwarded HTTP methods, for example allowedMethods: ['GET'] to enforce read-only access. - */ - allowedMethods?: string[]; - /** - * Limit the forwarded HTTP methods. By default, only the headers that are considered safe for CORS - * and headers that are set by the proxy will be forwarded. - */ - allowedHeaders?: string[]; - }; + }; }; } diff --git a/plugins/proxy-backend/src/plugin.ts b/plugins/proxy-backend/src/plugin.ts index c8dbdb4a08..e4c14b0037 100644 --- a/plugins/proxy-backend/src/plugin.ts +++ b/plugins/proxy-backend/src/plugin.ts @@ -26,32 +26,25 @@ import { createRouter } from './service/router'; * * @alpha */ -export const proxyPlugin = createBackendPlugin( - (options?: { - skipInvalidProxies?: boolean; - reviveConsumedRequestBodies?: boolean; - }) => ({ - pluginId: 'proxy', - register(env) { - env.registerInit({ - deps: { - config: coreServices.rootConfig, - discovery: coreServices.discovery, - logger: coreServices.logger, - httpRouter: coreServices.httpRouter, - }, - async init({ config, discovery, logger, httpRouter }) { - httpRouter.use( - await createRouter({ - config, - discovery, - logger: loggerToWinstonLogger(logger), - skipInvalidProxies: options?.skipInvalidProxies, - reviveConsumedRequestBodies: options?.reviveConsumedRequestBodies, - }), - ); - }, - }); - }, - }), -); +export const proxyPlugin = createBackendPlugin({ + pluginId: 'proxy', + register(env) { + env.registerInit({ + deps: { + config: coreServices.rootConfig, + discovery: coreServices.discovery, + logger: coreServices.logger, + httpRouter: coreServices.httpRouter, + }, + async init({ config, discovery, logger, httpRouter }) { + httpRouter.use( + await createRouter({ + config, + discovery, + logger: loggerToWinstonLogger(logger), + }), + ); + }, + }); + }, +}); diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts index 6912965659..f8f6a3fdab 100644 --- a/plugins/proxy-backend/src/service/router.ts +++ b/plugins/proxy-backend/src/service/router.ts @@ -191,6 +191,37 @@ export function buildMiddleware( return createProxyMiddleware(filter, fullConfig); } +function readProxyConfig(config: Config, logger: Logger): unknown { + const endpoints = config.getOptional('proxy.endpoints'); + if (endpoints) { + if (typeof endpoints !== 'object' || Array.isArray(endpoints)) { + throw new Error('proxy configuration must be an object'); + } + return endpoints; + } + + const root = config.getOptional('proxy'); + if (!root) { + return {}; + } + if (typeof root !== 'object' || Array.isArray(root)) { + throw new Error('deprecated proxy configuration must be an object'); + } + + const rootEndpoints = Object.fromEntries( + Object.entries(root).filter(([key]) => key.startsWith('/')), + ); + if (Object.keys(rootEndpoints).length === 0) { + return {}; + } + + logger.warn( + "Configuring proxy endpoints in the root 'proxy' configuration is deprecated. Move this configuration to 'proxy.endpoints' instead.", + ); + + return rootEndpoints; +} + /** * Creates a new {@link https://expressjs.com/en/api.html#router | "express router"} that proxy each target configured under the `proxy` key of the config * @example @@ -215,25 +246,39 @@ export async function createRouter( const router = Router(); let currentRouter = Router(); + const skipInvalidProxies = + options.skipInvalidProxies ?? + options.config.getOptionalBoolean('proxy.skipInvalidProxies') ?? + false; + const reviveConsumedRequestBodies = + options.reviveConsumedRequestBodies ?? + options.config.getOptionalBoolean('proxy.reviveConsumedRequestBodies') ?? + false; + const proxyOptions = { + skipInvalidProxies, + reviveConsumedRequestBodies, + logger: options.logger, + }; + const externalUrl = await options.discovery.getExternalBaseUrl('proxy'); const { pathname: pathPrefix } = new URL(externalUrl); - const proxyConfig = options.config.getOptional('proxy') ?? {}; - configureMiddlewares(options, currentRouter, pathPrefix, proxyConfig); + const proxyConfig = readProxyConfig(options.config, options.logger); + configureMiddlewares(proxyOptions, currentRouter, pathPrefix, proxyConfig); router.use((...args) => currentRouter(...args)); if (options.config.subscribe) { let currentKey = JSON.stringify(proxyConfig); options.config.subscribe(() => { - const newProxyConfig = options.config.getOptional('proxy') ?? {}; + const newProxyConfig = readProxyConfig(options.config, options.logger); const newKey = JSON.stringify(newProxyConfig); if (currentKey !== newKey) { currentKey = newKey; currentRouter = Router(); configureMiddlewares( - options, + proxyOptions, currentRouter, pathPrefix, newProxyConfig, @@ -246,7 +291,11 @@ export async function createRouter( } function configureMiddlewares( - options: RouterOptions, + options: { + reviveConsumedRequestBodies: boolean; + skipInvalidProxies: boolean; + logger: Logger; + }, router: express.Router, pathPrefix: string, proxyConfig: any, From c7f8ad78f7e05782493555355ed3e697093fb787 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:25:30 +0200 Subject: [PATCH 157/440] app-config: move proxy endpoints to proxy.endpoints Signed-off-by: Patrik Oldsberg --- app-config.yaml | 123 ++++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 61 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index 8dcd052e61..e6195eefe3 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -49,80 +49,81 @@ backend: # See README.md in the proxy-backend plugin for information on the configuration format proxy: - '/circleci/api': - target: https://circleci.com/api/v1.1 - headers: - Circle-Token: ${CIRCLECI_AUTH_TOKEN} + endpoints: + '/circleci/api': + target: https://circleci.com/api/v1.1 + headers: + Circle-Token: ${CIRCLECI_AUTH_TOKEN} - '/jenkins/api': - target: http://localhost:8080 - headers: - Authorization: ${JENKINS_BASIC_AUTH_HEADER} + '/jenkins/api': + target: http://localhost:8080 + headers: + Authorization: ${JENKINS_BASIC_AUTH_HEADER} - '/travisci/api': - target: https://api.travis-ci.com - changeOrigin: true - headers: - Authorization: ${TRAVISCI_AUTH_TOKEN} - travis-api-version: '3' + '/travisci/api': + target: https://api.travis-ci.com + changeOrigin: true + headers: + Authorization: ${TRAVISCI_AUTH_TOKEN} + travis-api-version: '3' - '/newrelic/apm/api': - target: https://api.newrelic.com/v2 - headers: - X-Api-Key: ${NEW_RELIC_REST_API_KEY} + '/newrelic/apm/api': + target: https://api.newrelic.com/v2 + headers: + X-Api-Key: ${NEW_RELIC_REST_API_KEY} - '/newrelic/api': - target: https://api.newrelic.com - headers: - X-Api-Key: ${NEW_RELIC_USER_KEY} + '/newrelic/api': + target: https://api.newrelic.com + headers: + X-Api-Key: ${NEW_RELIC_USER_KEY} - '/pagerduty': - target: https://api.pagerduty.com - headers: - Authorization: Token token=${PAGERDUTY_TOKEN} + '/pagerduty': + target: https://api.pagerduty.com + headers: + Authorization: Token token=${PAGERDUTY_TOKEN} - '/buildkite/api': - target: https://api.buildkite.com/v2/ - headers: - Authorization: ${BUILDKITE_TOKEN} + '/buildkite/api': + target: https://api.buildkite.com/v2/ + headers: + Authorization: ${BUILDKITE_TOKEN} - '/sentry/api': - target: https://sentry.io/api/ - allowedMethods: ['GET'] - headers: - Authorization: ${SENTRY_TOKEN} + '/sentry/api': + target: https://sentry.io/api/ + allowedMethods: ['GET'] + headers: + Authorization: ${SENTRY_TOKEN} - '/ilert': - target: https://api.ilert.com - allowedMethods: ['GET', 'POST', 'PUT'] - allowedHeaders: ['Authorization'] - headers: - Authorization: ${ILERT_AUTH_HEADER} + '/ilert': + target: https://api.ilert.com + allowedMethods: ['GET', 'POST', 'PUT'] + allowedHeaders: ['Authorization'] + headers: + Authorization: ${ILERT_AUTH_HEADER} - '/airflow': - target: https://your.airflow.instance.com/api/v1 - headers: - Authorization: ${AIRFLOW_BASIC_AUTH_HEADER} + '/airflow': + target: https://your.airflow.instance.com/api/v1 + headers: + Authorization: ${AIRFLOW_BASIC_AUTH_HEADER} - '/gocd': - target: https://your.gocd.instance.com/go/api - allowedMethods: ['GET'] - allowedHeaders: ['Authorization'] - headers: - Authorization: Basic ${GOCD_AUTH_CREDENTIALS} + '/gocd': + target: https://your.gocd.instance.com/go/api + allowedMethods: ['GET'] + allowedHeaders: ['Authorization'] + headers: + Authorization: Basic ${GOCD_AUTH_CREDENTIALS} - '/dynatrace': - target: https://your.dynatrace.instance.com/api/v2 - headers: - Authorization: 'Api-Token ${DYNATRACE_ACCESS_TOKEN}' + '/dynatrace': + target: https://your.dynatrace.instance.com/api/v2 + headers: + Authorization: 'Api-Token ${DYNATRACE_ACCESS_TOKEN}' - '/stackstorm': - target: https://your.stackstorm.instance.com/api - headers: - St2-Api-Key: ${ST2_API_KEY} + '/stackstorm': + target: https://your.stackstorm.instance.com/api + headers: + St2-Api-Key: ${ST2_API_KEY} - '/puppetdb': - target: https://your.puppetdb.instance.com + '/puppetdb': + target: https://your.puppetdb.instance.com organization: name: My Company From b810344311e8dd75dbc120153d569fb166f57be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 2 Aug 2023 15:23:46 +0200 Subject: [PATCH 158/440] Make readTaskScheduleDefinitionFromConfig properly handle bad inputs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/twelve-seahorses-perform.md | 5 +++ ...adTaskScheduleDefinitionFromConfig.test.ts | 15 +++++++- .../readTaskScheduleDefinitionFromConfig.ts | 37 ++++++++++++++----- 3 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 .changeset/twelve-seahorses-perform.md diff --git a/.changeset/twelve-seahorses-perform.md b/.changeset/twelve-seahorses-perform.md new file mode 100644 index 0000000000..e3c761b2a5 --- /dev/null +++ b/.changeset/twelve-seahorses-perform.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': patch +--- + +Make `readTaskScheduleDefinitionFromConfig` properly handle bad inputs diff --git a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts index fc2a045614..21f51954b5 100644 --- a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts +++ b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.test.ts @@ -76,7 +76,7 @@ describe('readTaskScheduleDefinitionFromConfig', () => { ); }); - it('invalid frequency value', () => { + it('invalid frequency key', () => { const config = new ConfigReader({ frequency: { invalid: 'value', @@ -89,6 +89,19 @@ describe('readTaskScheduleDefinitionFromConfig', () => { ); }); + it('invalid frequency value', () => { + const config = new ConfigReader({ + frequency: { + minutes: 'value', + }, + timeout: 'PT3M', + }); + + expect(() => readTaskScheduleDefinitionFromConfig(config)).toThrow( + "Unable to convert config value for key 'frequency.minutes' in 'mock-config' to a number", + ); + }); + it('frequency value with additional invalid prop', () => { const config = new ConfigReader({ frequency: { diff --git a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts index 1448a328f8..5d5682450e 100644 --- a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts +++ b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts @@ -31,29 +31,48 @@ const propsOfHumanDuration = [ ]; function convertToHumanDuration(config: Config, key: string): HumanDuration { - const props = config.getConfig(key).keys(); - if (!props.find(prop => propsOfHumanDuration.includes(prop))) { + // Ensures that the root is an object + const root = config.getConfig(key); + + const result: Record = {}; + let found = false; + for (const prop of propsOfHumanDuration) { + const value = root.getOptionalNumber(prop); + if (value !== undefined) { + result[prop] = value; + found = true; + } + } + + if (!found) { throw new Error( `HumanDuration needs at least one of: ${propsOfHumanDuration}`, ); } - const invalidProps = props.filter( - prop => !propsOfHumanDuration.includes(prop), - ); + const invalidProps = root + .keys() + .filter(prop => !propsOfHumanDuration.includes(prop)); if (invalidProps.length > 0) { throw new Error( `HumanDuration does not contain properties: ${invalidProps}`, ); } - return config.get(key) as HumanDuration; + return result as HumanDuration; } function readDuration(config: Config, key: string): Duration | HumanDuration { - return typeof config.get(key) === 'string' - ? Duration.fromISO(config.getString(key)) - : convertToHumanDuration(config, key); + if (typeof config.get(key) === 'string') { + const value = config.getString(key); + const duration = Duration.fromISO(value); + if (!duration.isValid) { + throw new Error(`Invalid duration: ${value}`); + } + return duration; + } + + return convertToHumanDuration(config, key); } function readCronOrDuration( From dfd1b6b2fc33c317a00f0cc95530b3b8d5f85052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 2 Aug 2023 15:27:35 +0200 Subject: [PATCH 159/440] changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../{twelve-seahorses-perform.md => seven-cougars-smash.md} | 2 +- .../src/tasks/readTaskScheduleDefinitionFromConfig.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename .changeset/{twelve-seahorses-perform.md => seven-cougars-smash.md} (67%) diff --git a/.changeset/twelve-seahorses-perform.md b/.changeset/seven-cougars-smash.md similarity index 67% rename from .changeset/twelve-seahorses-perform.md rename to .changeset/seven-cougars-smash.md index e3c761b2a5..5493a724d7 100644 --- a/.changeset/twelve-seahorses-perform.md +++ b/.changeset/seven-cougars-smash.md @@ -1,5 +1,5 @@ --- -'@backstage/backend-plugin-api': patch +'@backstage/backend-tasks': patch --- Make `readTaskScheduleDefinitionFromConfig` properly handle bad inputs diff --git a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts index 5d5682450e..b31cf68f74 100644 --- a/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts +++ b/packages/backend-tasks/src/tasks/readTaskScheduleDefinitionFromConfig.ts @@ -15,7 +15,7 @@ */ import { Config } from '@backstage/config'; -import { HumanDuration, JsonObject } from '@backstage/types'; +import { HumanDuration } from '@backstage/types'; import { TaskScheduleDefinition } from './types'; import { Duration } from 'luxon'; From 24450b8a40e0d68805ccc1aca86064f6c80befdb Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:47:29 +0200 Subject: [PATCH 160/440] proxy-backend: update tests to use proxy.endpoints Signed-off-by: Patrik Oldsberg --- plugins/proxy-backend/package.json | 1 + .../src/service/router.config.test.ts | 75 +++++++++++-------- .../proxy-backend/src/service/router.test.ts | 26 ++++--- yarn.lock | 1 + 4 files changed, 61 insertions(+), 42 deletions(-) diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 56439cd0f3..d7eb3ad435 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -49,6 +49,7 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", + "@backstage/config-loader": "workspace:^", "@types/http-proxy-middleware": "^0.19.3", "@types/supertest": "^2.0.8", "@types/uuid": "^8.0.0", diff --git a/plugins/proxy-backend/src/service/router.config.test.ts b/plugins/proxy-backend/src/service/router.config.test.ts index 5f90f847e4..fffdcb5142 100644 --- a/plugins/proxy-backend/src/service/router.config.test.ts +++ b/plugins/proxy-backend/src/service/router.config.test.ts @@ -15,7 +15,11 @@ */ import { getVoidLogger, SingleHostDiscovery } from '@backstage/backend-common'; -import { ConfigReader } from '@backstage/config'; +import { + ConfigSources, + MutableConfigSource, + StaticConfigSource, +} from '@backstage/config-loader'; import express from 'express'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; @@ -56,34 +60,36 @@ describe('createRouter reloadable configuration', () => { const logger = getVoidLogger(); // Grab the subscriber function and use mutable config data to mock a config file change - let subscriber: () => void; - const mutableConfigData: any = { - backend: { - baseUrl: 'http://localhost:7007', - listen: { - port: 7007, - }, - }, - proxy: { - '/test': { - target: 'https://non-existing-example.com', - pathRewrite: { - '.*': '/', + const mutableConfigSource = MutableConfigSource.create({ data: {} }); + const config = await ConfigSources.toConfig( + ConfigSources.merge([ + StaticConfigSource.create({ + data: { + backend: { + baseUrl: 'http://localhost:7007', + listen: { + port: 7007, + }, + }, + proxy: { + endpoints: { + '/test': { + target: 'https://non-existing-example.com', + pathRewrite: { + '.*': '/', + }, + }, + }, + }, }, - }, - }, - }; + }), + mutableConfigSource, + ]), + ); - const mockConfig = Object.assign(new ConfigReader(mutableConfigData), { - subscribe: (s: () => void) => { - subscriber = s; - return { unsubscribe: () => {} }; - }, - }); - - const discovery = SingleHostDiscovery.fromConfig(mockConfig); + const discovery = SingleHostDiscovery.fromConfig(config); const router = await createRouter({ - config: mockConfig, + config, logger, discovery, }); @@ -100,13 +106,18 @@ describe('createRouter reloadable configuration', () => { expect(response1.status).toEqual(200); - mutableConfigData.proxy['/test2'] = { - target: 'https://non-existing-example.com', - pathRewrite: { - '.*': '/', + mutableConfigSource.setData({ + proxy: { + endpoints: { + '/test2': { + target: 'https://non-existing-example.com', + pathRewrite: { + '.*': '/', + }, + }, + }, }, - }; - subscriber!(); + }); const response2 = await agent.get('/test2'); diff --git a/plugins/proxy-backend/src/service/router.test.ts b/plugins/proxy-backend/src/service/router.test.ts index 9e8c909d25..f69b0d38b7 100644 --- a/plugins/proxy-backend/src/service/router.test.ts +++ b/plugins/proxy-backend/src/service/router.test.ts @@ -45,10 +45,12 @@ describe('createRouter', () => { }, }, proxy: { - '/test': { - target: 'https://example.com', - headers: { - Authorization: 'Bearer supersecret', + endpoints: { + '/test': { + target: 'https://example.com', + headers: { + Authorization: 'Bearer supersecret', + }, }, }, }, @@ -112,9 +114,11 @@ describe('createRouter', () => { }, // no target would cause the buildMiddleware to fail proxy: { - '/test': { - headers: { - Authorization: 'Bearer supersecret', + endpoints: { + '/test': { + headers: { + Authorization: 'Bearer supersecret', + }, }, }, }, @@ -141,9 +145,11 @@ describe('createRouter', () => { }, // no target would cause the buildMiddleware to fail proxy: { - '/test': { - headers: { - Authorization: 'Bearer supersecret', + endpoints: { + '/test': { + headers: { + Authorization: 'Bearer supersecret', + }, }, }, }, diff --git a/yarn.lock b/yarn.lock index 9e829b5a58..33681796da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8055,6 +8055,7 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/config-loader": "workspace:^" "@types/express": ^4.17.6 "@types/http-proxy-middleware": ^0.19.3 "@types/supertest": ^2.0.8 From 76a710edd9f4a70908f6602a1cef2355e64ea075 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:52:28 +0200 Subject: [PATCH 161/440] proxy-backend: add test for deprecated configuration Signed-off-by: Patrik Oldsberg --- plugins/proxy-backend/package.json | 1 + .../proxy-backend/src/service/router.test.ts | 27 +++++++++++++++++++ yarn.lock | 1 + 3 files changed, 29 insertions(+) diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index d7eb3ad435..959c946d55 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -48,6 +48,7 @@ "yup": "^0.32.9" }, "devDependencies": { + "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@backstage/config-loader": "workspace:^", "@types/http-proxy-middleware": "^0.19.3", diff --git a/plugins/proxy-backend/src/service/router.test.ts b/plugins/proxy-backend/src/service/router.test.ts index f69b0d38b7..2b58e52e94 100644 --- a/plugins/proxy-backend/src/service/router.test.ts +++ b/plugins/proxy-backend/src/service/router.test.ts @@ -15,6 +15,7 @@ */ import { getVoidLogger, SingleHostDiscovery } from '@backstage/backend-common'; +import { mockServices } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { Request, Response } from 'express'; import * as http from 'http'; @@ -70,6 +71,32 @@ describe('createRouter', () => { expect(router).toBeDefined(); }); + it('supports deprecated proxy configuration', async () => { + const router = await createRouter({ + config: mockServices.rootConfig({ + data: { + proxy: { + '/test': { + target: 'https://example.com', + headers: { + Authorization: 'Bearer supersecret', + }, + }, + }, + }, + }), + logger, + discovery, + }); + expect(router).toBeDefined(); + expect(mockCreateProxyMiddleware).toHaveBeenCalledWith( + expect.any(Function), + expect.objectContaining({ + target: 'https://example.com', + }), + ); + }); + it('revives request bodies when set', async () => { const router = await createRouter({ config, diff --git a/yarn.lock b/yarn.lock index 33681796da..7256f2b11d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8053,6 +8053,7 @@ __metadata: dependencies: "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" From 9fbe95ef6503877e6c9f1a94ae34e93f67529619 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 15:09:46 +0200 Subject: [PATCH 162/440] added app-node with a static fallback handler extension point Signed-off-by: Patrik Oldsberg --- .changeset/lazy-pugs-wash.md | 5 +++ plugins/app-node/.eslintrc.js | 1 + plugins/app-node/README.md | 5 +++ plugins/app-node/api-report.md | 16 +++++++++ plugins/app-node/package.json | 34 +++++++++++++++++++ plugins/app-node/src/extensions.ts | 52 ++++++++++++++++++++++++++++++ plugins/app-node/src/index.ts | 26 +++++++++++++++ plugins/app-node/src/setupTests.ts | 16 +++++++++ yarn.lock | 10 ++++++ 9 files changed, 165 insertions(+) create mode 100644 .changeset/lazy-pugs-wash.md create mode 100644 plugins/app-node/.eslintrc.js create mode 100644 plugins/app-node/README.md create mode 100644 plugins/app-node/api-report.md create mode 100644 plugins/app-node/package.json create mode 100644 plugins/app-node/src/extensions.ts create mode 100644 plugins/app-node/src/index.ts create mode 100644 plugins/app-node/src/setupTests.ts diff --git a/.changeset/lazy-pugs-wash.md b/.changeset/lazy-pugs-wash.md new file mode 100644 index 0000000000..923ef5b116 --- /dev/null +++ b/.changeset/lazy-pugs-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-app-node': minor +--- + +Added the `app` plugin node library, initially providing an extension point that can be used to configure a static fallback handler. diff --git a/plugins/app-node/.eslintrc.js b/plugins/app-node/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/app-node/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/app-node/README.md b/plugins/app-node/README.md new file mode 100644 index 0000000000..5c606540c0 --- /dev/null +++ b/plugins/app-node/README.md @@ -0,0 +1,5 @@ +# @backstage/plugin-app-node + +Welcome to the Node.js library package for the app plugin! + +_This plugin was created through the Backstage CLI_ diff --git a/plugins/app-node/api-report.md b/plugins/app-node/api-report.md new file mode 100644 index 0000000000..504c9d48c1 --- /dev/null +++ b/plugins/app-node/api-report.md @@ -0,0 +1,16 @@ +## API Report File for "@backstage/plugin-app-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ExtensionPoint } from '@backstage/backend-plugin-api'; +import { Handler } from 'express'; + +// @public +export interface StaticFallbackHandlerExtensionPoint { + setStaticFallbackHandler(handler: Handler): void; +} + +// @public +export const staticFallbackHandlerExtensionPoint: ExtensionPoint; +``` diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json new file mode 100644 index 0000000000..9caff82e9d --- /dev/null +++ b/plugins/app-node/package.json @@ -0,0 +1,34 @@ +{ + "name": "@backstage/plugin-app-node", + "description": "Node.js library for the app plugin", + "version": "0.0.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "node-library" + }, + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + }, + "files": [ + "dist" + ], + "dependencies": { + "@backstage/backend-plugin-api": "workspace:^", + "express": "^4.18.2" + } +} diff --git a/plugins/app-node/src/extensions.ts b/plugins/app-node/src/extensions.ts new file mode 100644 index 0000000000..6a75a5b791 --- /dev/null +++ b/plugins/app-node/src/extensions.ts @@ -0,0 +1,52 @@ +/* + * 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 { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { Handler } from 'express'; + +/** + * The interface for {@link staticFallbackHandlerExtensionPoint}. + * + * @public + */ +export interface StaticFallbackHandlerExtensionPoint { + /** + * Sets the static fallback handler. This can only be done once. + */ + setStaticFallbackHandler(handler: Handler): void; +} + +/** + * An extension point the exposes the ability to configure a static fallback handler for the app backend. + * + * The static fallback handler is a request handler to handle requests for static content that is not + * present in the app bundle. + * + * This can be used to avoid issues with clients on older deployment versions trying to access lazy + * loaded content that is no longer present. Typically the requests would fall back to a long-term + * object store where all recently deployed versions of the app are present. + * + * Another option is to provide a `database` that will take care of storing the static assets instead. + * + * If both `database` and `staticFallbackHandler` are provided, the `database` will attempt to serve + * static assets first, and if they are not found, the `staticFallbackHandler` will be called. + * + * @public + */ +export const staticFallbackHandlerExtensionPoint = + createExtensionPoint({ + id: 'app.staticFallbackHandler', + }); diff --git a/plugins/app-node/src/index.ts b/plugins/app-node/src/index.ts new file mode 100644 index 0000000000..c5189fa8b9 --- /dev/null +++ b/plugins/app-node/src/index.ts @@ -0,0 +1,26 @@ +/* + * 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. + */ + +/** + * Node.js library for the app plugin. + * + * @packageDocumentation + */ + +export { + staticFallbackHandlerExtensionPoint, + type StaticFallbackHandlerExtensionPoint, +} from './extensions'; diff --git a/plugins/app-node/src/setupTests.ts b/plugins/app-node/src/setupTests.ts new file mode 100644 index 0000000000..4b9026cde5 --- /dev/null +++ b/plugins/app-node/src/setupTests.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export {}; diff --git a/yarn.lock b/yarn.lock index f628161240..d18e8fbc66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4657,6 +4657,16 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-app-node@workspace:^, @backstage/plugin-app-node@workspace:plugins/app-node": + version: 0.0.0-use.local + resolution: "@backstage/plugin-app-node@workspace:plugins/app-node" + dependencies: + "@backstage/backend-plugin-api": "workspace:^" + "@backstage/cli": "workspace:^" + express: ^4.18.2 + languageName: unknown + linkType: soft + "@backstage/plugin-auth-backend@workspace:^, @backstage/plugin-auth-backend@workspace:plugins/auth-backend": version: 0.0.0-use.local resolution: "@backstage/plugin-auth-backend@workspace:plugins/auth-backend" From d564ad142b1737b22643d6e5829f6752ae07f001 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 15:30:49 +0200 Subject: [PATCH 163/440] app-backend: migrate to use static configuration and extension point Signed-off-by: Patrik Oldsberg --- .changeset/sharp-months-think.md | 5 ++ plugins/app-backend/alpha-api-report.md | 11 +-- plugins/app-backend/config.d.ts | 46 +++++++++++ plugins/app-backend/package.json | 3 + plugins/app-backend/src/alpha.ts | 1 - .../app-backend/src/service/appPlugin.test.ts | 14 ++-- plugins/app-backend/src/service/appPlugin.ts | 79 ++++++------------- yarn.lock | 3 +- 8 files changed, 92 insertions(+), 70 deletions(-) create mode 100644 .changeset/sharp-months-think.md create mode 100644 plugins/app-backend/config.d.ts diff --git a/.changeset/sharp-months-think.md b/.changeset/sharp-months-think.md new file mode 100644 index 0000000000..04ffbb8d1b --- /dev/null +++ b/.changeset/sharp-months-think.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-app-backend': patch +--- + +Migrated the alpha `appBackend` export to use static configuration and extension points rather than accepting options. diff --git a/plugins/app-backend/alpha-api-report.md b/plugins/app-backend/alpha-api-report.md index 20a2902557..5fb0546a79 100644 --- a/plugins/app-backend/alpha-api-report.md +++ b/plugins/app-backend/alpha-api-report.md @@ -4,18 +4,9 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; -import express from 'express'; // @alpha -export const appPlugin: (options: AppPluginOptions) => BackendFeature; - -// @alpha (undocumented) -export type AppPluginOptions = { - appPackageName?: string; - staticFallbackHandler?: express.Handler; - disableConfigInjection?: boolean; - disableStaticFallbackCache?: boolean; -}; +export const appPlugin: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/app-backend/config.d.ts b/plugins/app-backend/config.d.ts new file mode 100644 index 0000000000..dc11bc4e0a --- /dev/null +++ b/plugins/app-backend/config.d.ts @@ -0,0 +1,46 @@ +/* + * 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. + */ + +export interface Config { + app?: { + /** + * The name of the app package (in most Backstage repositories, this is the + * "name" field in `packages/app/package.json`) that content should be served + * from. The same app package should be added as a dependency to the backend + * package in order for it to be accessible at runtime. + * + * In a typical setup with a single app package, this will default to 'app'. + */ + packageName?: string; + + /** + * Disables the configuration injection. This can be useful if you're running in an environment + * with a read-only filesystem, or for some other reason don't want configuration to be injected. + * + * Note that this will cause the configuration used when building the app bundle to be used, unless + * a separate configuration loading strategy is set up. + * + * This also disables configuration injection though `APP_CONFIG_` environment variables. + */ + disableConfigInjection?: boolean; + + /** + * By default the app backend plugin will cache previously deployed static assets in the database. + * If you disable this, it is recommended to set a `staticFallbackHandler` instead. + */ + disableStaticFallbackCache?: boolean; + }; +} diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index c9b25508c0..be1b6b3a80 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -49,6 +49,7 @@ "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/config-loader": "workspace:^", + "@backstage/plugin-app-node": "workspace:^", "@backstage/types": "workspace:^", "@types/express": "^4.17.6", "express": "^4.17.1", @@ -73,8 +74,10 @@ "node-fetch": "^2.6.7", "supertest": "^6.1.3" }, + "configSchema": "config.d.ts", "files": [ "dist", + "config.d.ts", "migrations/**/*.{js,d.ts}", "static" ] diff --git a/plugins/app-backend/src/alpha.ts b/plugins/app-backend/src/alpha.ts index cc8276b853..edb5c8caf5 100644 --- a/plugins/app-backend/src/alpha.ts +++ b/plugins/app-backend/src/alpha.ts @@ -15,4 +15,3 @@ */ export { appPlugin } from './service/appPlugin'; -export type { AppPluginOptions } from './service/appPlugin'; diff --git a/plugins/app-backend/src/service/appPlugin.test.ts b/plugins/app-backend/src/service/appPlugin.test.ts index 518f56b7f9..37d38663ef 100644 --- a/plugins/app-backend/src/service/appPlugin.test.ts +++ b/plugins/app-backend/src/service/appPlugin.test.ts @@ -17,7 +17,7 @@ import mockFs from 'mock-fs'; import { resolve as resolvePath } from 'path'; import fetch from 'node-fetch'; -import { startTestBackend } from '@backstage/backend-test-utils'; +import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; import { appPlugin } from './appPlugin'; describe('appPlugin', () => { @@ -39,10 +39,14 @@ describe('appPlugin', () => { it('boots', async () => { const { server } = await startTestBackend({ - features: [ - appPlugin({ - appPackageName: 'app', - disableStaticFallbackCache: true, + features: [appPlugin()], + services: [ + mockServices.rootConfig.factory({ + data: { + app: { + disableStaticFallbackCache: true, + }, + }, }), ], }); diff --git a/plugins/app-backend/src/service/appPlugin.ts b/plugins/app-backend/src/service/appPlugin.ts index a223d3ffb5..7f521acfb9 100644 --- a/plugins/app-backend/src/service/appPlugin.ts +++ b/plugins/app-backend/src/service/appPlugin.ts @@ -21,58 +21,28 @@ import { } from '@backstage/backend-plugin-api'; import { createRouter } from './router'; import { loggerToWinstonLogger } from '@backstage/backend-common'; - -/** @alpha */ -export type AppPluginOptions = { - /** - * The name of the app package (in most Backstage repositories, this is the - * "name" field in `packages/app/package.json`) that content should be served - * from. The same app package should be added as a dependency to the backend - * package in order for it to be accessible at runtime. - * - * In a typical setup with a single app package, this will default to 'app'. - */ - appPackageName?: string; - - /** - * A request handler to handle requests for static content that are not present in the app bundle. - * - * This can be used to avoid issues with clients on older deployment versions trying to access lazy - * loaded content that is no longer present. Typically the requests would fall back to a long-term - * object store where all recently deployed versions of the app are present. - * - * Another option is to provide a `database` that will take care of storing the static assets instead. - * - * If both `database` and `staticFallbackHandler` are provided, the `database` will attempt to serve - * static assets first, and if they are not found, the `staticFallbackHandler` will be called. - */ - staticFallbackHandler?: express.Handler; - - /** - * Disables the configuration injection. This can be useful if you're running in an environment - * with a read-only filesystem, or for some other reason don't want configuration to be injected. - * - * Note that this will cause the configuration used when building the app bundle to be used, unless - * a separate configuration loading strategy is set up. - * - * This also disables configuration injection though `APP_CONFIG_` environment variables. - */ - disableConfigInjection?: boolean; - - /** - * By default the app backend plugin will cache previously deployed static assets in the database. - * If you disable this, it is recommended to set a `staticFallbackHandler` instead. - */ - disableStaticFallbackCache?: boolean; -}; +import { staticFallbackHandlerExtensionPoint } from '@backstage/plugin-app-node'; /** * The App plugin is responsible for serving the frontend app bundle and static assets. * @alpha */ -export const appPlugin = createBackendPlugin((options: AppPluginOptions) => ({ +export const appPlugin = createBackendPlugin({ pluginId: 'app', register(env) { + let staticFallbackHandler: express.Handler | undefined; + + env.registerExtensionPoint(staticFallbackHandlerExtensionPoint, { + setStaticFallbackHandler(handler) { + if (staticFallbackHandler) { + throw new Error( + 'Attempted to install a static fallback handler for the app-backend twice', + ); + } + staticFallbackHandler = handler; + }, + }); + env.registerInit({ deps: { logger: coreServices.logger, @@ -81,19 +51,22 @@ export const appPlugin = createBackendPlugin((options: AppPluginOptions) => ({ httpRouter: coreServices.httpRouter, }, async init({ logger, config, database, httpRouter }) { - const { - appPackageName, - staticFallbackHandler, - disableConfigInjection, - disableStaticFallbackCache, - } = options; + const appPackageName = + config.getOptionalString('app.packageName') ?? 'app'; + const disableConfigInjection = config.getOptionalBoolean( + 'app.disableConfigInjection', + ); + const disableStaticFallbackCache = config.getOptionalBoolean( + 'app.disableStaticFallbackCache', + ); + const winstonLogger = loggerToWinstonLogger(logger); const router = await createRouter({ logger: winstonLogger, config, database: disableStaticFallbackCache ? undefined : database, - appPackageName: appPackageName ?? 'app', + appPackageName, staticFallbackHandler, disableConfigInjection, }); @@ -101,4 +74,4 @@ export const appPlugin = createBackendPlugin((options: AppPluginOptions) => ({ }, }); }, -})); +}); diff --git a/yarn.lock b/yarn.lock index d18e8fbc66..2ed762bf99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4637,6 +4637,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/config-loader": "workspace:^" + "@backstage/plugin-app-node": "workspace:^" "@backstage/types": "workspace:^" "@types/express": ^4.17.6 "@types/supertest": ^2.0.8 @@ -25462,7 +25463,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1": +"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: From 5dd1f25cc81e3c979dba1d88aa83d2ffbac68037 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 15:47:18 +0200 Subject: [PATCH 164/440] backend-next: update to stop using appBackend options Signed-off-by: Patrik Oldsberg --- app-config.yaml | 2 ++ packages/backend-next/src/index.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app-config.yaml b/app-config.yaml index 8dcd052e61..7988d6ebbe 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -20,6 +20,8 @@ app: - url: https://discord.gg/backstage-687207715902193673 title: '#backstage' + packageName: example-app + backend: # Used for enabling authentication, secret is shared by all backend plugins # See https://backstage.io/docs/auth/service-to-service-auth for diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index fa7561e211..c44da4ae8c 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -42,7 +42,7 @@ import { lighthousePlugin } from '@backstage/plugin-lighthouse-backend'; const backend = createBackend(); -backend.add(appPlugin({ appPackageName: 'example-app' })); +backend.add(appPlugin()); // Badges backend.add(badgesPlugin()); From cbdc9a39d64681b1f40e1e39528da30f9f305c78 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:54:51 +0200 Subject: [PATCH 165/440] app-node: add missing @types/express dependency Signed-off-by: Patrik Oldsberg --- plugins/app-node/package.json | 1 + yarn.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 9caff82e9d..486ad7f9f7 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -29,6 +29,7 @@ ], "dependencies": { "@backstage/backend-plugin-api": "workspace:^", + "@types/express": "^4.17.6", "express": "^4.18.2" } } diff --git a/yarn.lock b/yarn.lock index 2ed762bf99..2177fb8ab0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4664,6 +4664,7 @@ __metadata: dependencies: "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" + "@types/express": ^4.17.6 express: ^4.18.2 languageName: unknown linkType: soft From 7bc4dad52c2184eb729d6c1c091edb950aa97417 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 2 Aug 2023 16:57:48 +0200 Subject: [PATCH 166/440] app-backend: move reading of static config to createRouter Signed-off-by: Patrik Oldsberg --- plugins/app-backend/src/service/appPlugin.ts | 10 +--------- plugins/app-backend/src/service/router.ts | 11 +++++++++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins/app-backend/src/service/appPlugin.ts b/plugins/app-backend/src/service/appPlugin.ts index 7f521acfb9..9ba2ea6d6c 100644 --- a/plugins/app-backend/src/service/appPlugin.ts +++ b/plugins/app-backend/src/service/appPlugin.ts @@ -53,22 +53,14 @@ export const appPlugin = createBackendPlugin({ async init({ logger, config, database, httpRouter }) { const appPackageName = config.getOptionalString('app.packageName') ?? 'app'; - const disableConfigInjection = config.getOptionalBoolean( - 'app.disableConfigInjection', - ); - const disableStaticFallbackCache = config.getOptionalBoolean( - 'app.disableStaticFallbackCache', - ); - const winstonLogger = loggerToWinstonLogger(logger); const router = await createRouter({ logger: winstonLogger, config, - database: disableStaticFallbackCache ? undefined : database, + database, appPackageName, staticFallbackHandler, - disableConfigInjection, }); httpRouter.use(router); }, diff --git a/plugins/app-backend/src/service/router.ts b/plugins/app-backend/src/service/router.ts index 4e94138439..40e291c19d 100644 --- a/plugins/app-backend/src/service/router.ts +++ b/plugins/app-backend/src/service/router.ts @@ -92,6 +92,13 @@ export async function createRouter( ): Promise { const { config, logger, appPackageName, staticFallbackHandler } = options; + const disableConfigInjection = + options.disableConfigInjection ?? + config.getOptionalBoolean('app.disableConfigInjection'); + const disableStaticFallbackCache = config.getOptionalBoolean( + 'app.disableStaticFallbackCache', + ); + const appDistDir = resolvePackagePath(appPackageName, 'dist'); const staticDir = resolvePath(appDistDir, 'static'); @@ -107,7 +114,7 @@ export async function createRouter( logger.info(`Serving static app content from ${appDistDir}`); - if (!options.disableConfigInjection) { + if (!disableConfigInjection) { const appConfigs = await readConfigs({ config, appDistDir, @@ -131,7 +138,7 @@ export async function createRouter( }), ); - if (options.database) { + if (options.database && !disableStaticFallbackCache) { const store = await StaticAssetsStore.create({ logger, database: options.database, From e0ecbd684cf9cbdde73cb76626a50c6d103d3bb1 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 2 Aug 2023 11:27:43 -0400 Subject: [PATCH 167/440] chore: Add CLO Monitor exemption settings Signed-off-by: Adam Harvey --- .clomonitor.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .clomonitor.yml diff --git a/.clomonitor.yml b/.clomonitor.yml new file mode 100644 index 0000000000..1e217dd400 --- /dev/null +++ b/.clomonitor.yml @@ -0,0 +1,9 @@ +# CLOMonitor metadata file +# This file must be located at the root of the repository +# https://clomonitor.io/projects/cncf/backstage + +# Checks exemptions +exemptions: + - check: trademark_disclaimer # Check identifier (see https://github.com/cncf/clomonitor/blob/main/docs/checks.md#exemptions) + # Justification of this exemption (mandatory, it will be displayed on the UI) + reason: 'The Linux Foundation trademark disclaimer and link are contained within the project web site at https://backstage.io in the copyright footer. However, because the site is delivered dynamically via React through JavaScript, the check cannot currently identify it.' From 6f71cdeb7ef3d557870aa43a242bd046d21bff16 Mon Sep 17 00:00:00 2001 From: tperehinets Date: Wed, 2 Aug 2023 19:52:09 +0300 Subject: [PATCH 168/440] Changed testcase Signed-off-by: tperehinets --- .../components/CatalogGraphCard/CatalogGraphCard.test.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.test.tsx b/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.test.tsx index adee03e298..ee400f1e56 100644 --- a/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.test.tsx +++ b/plugins/catalog-graph/src/components/CatalogGraphCard/CatalogGraphCard.test.tsx @@ -133,7 +133,8 @@ describe('', () => { expect(button).toBeInTheDocument(); expect(button.closest('a')).toHaveAttribute( 'href', - '/catalog-graph?rootEntityRefs%5B%5D=b%3Ad%2Fc&unidirectional=true&mergeRelations=true&direction=LR', + // '/catalog-graph?rootEntityRefs%5B%5D=b%3Ad%2Fc&unidirectional=true&mergeRelations=true&direction=LR', + '/catalog-graph?rootEntityRefs%5B%5D=b%3Ad%2Fc&maxDepth=1&unidirectional=true&mergeRelations=true&direction=LR', ); }); @@ -157,7 +158,7 @@ describe('', () => { expect(button).toBeInTheDocument(); expect(button.closest('a')).toHaveAttribute( 'href', - '/catalog-graph?rootEntityRefs%5B%5D=b%3Ad%2Fc&unidirectional=true&mergeRelations=false&direction=LR', + '/catalog-graph?rootEntityRefs%5B%5D=b%3Ad%2Fc&maxDepth=2&unidirectional=true&mergeRelations=false&direction=LR', ); }); From b8cccd8ee858dbcb69514e7766593f235bf7cfba Mon Sep 17 00:00:00 2001 From: Phil Kuang Date: Wed, 2 Aug 2023 15:42:27 -0400 Subject: [PATCH 169/440] feat(AnnotateScmSlughEntityProcessor): support configuring applicable kinds Signed-off-by: Phil Kuang --- .changeset/little-penguins-build.md | 5 ++ plugins/catalog-backend/api-report.md | 12 +++- .../AnnotateScmSlugEntityProcessor.test.ts | 67 +++++++++++++++++++ .../core/AnnotateScmSlugEntityProcessor.ts | 19 +++++- 4 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 .changeset/little-penguins-build.md diff --git a/.changeset/little-penguins-build.md b/.changeset/little-penguins-build.md new file mode 100644 index 0000000000..9e54a566e2 --- /dev/null +++ b/.changeset/little-penguins-build.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Support configuring applicable kinds for `AnnotateScmSlugEntityProcessor` diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 84d8de4753..345874d919 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -91,9 +91,17 @@ export class AnnotateLocationEntityProcessor implements CatalogProcessor_2 { // @public (undocumented) export class AnnotateScmSlugEntityProcessor implements CatalogProcessor_2 { - constructor(opts: { scmIntegrationRegistry: ScmIntegrationRegistry }); + constructor(opts: { + scmIntegrationRegistry: ScmIntegrationRegistry; + kinds?: string[]; + }); // (undocumented) - static fromConfig(config: Config): AnnotateScmSlugEntityProcessor; + static fromConfig( + config: Config, + options?: { + kinds?: string[]; + }, + ): AnnotateScmSlugEntityProcessor; // (undocumented) getProcessorName(): string; // (undocumented) diff --git a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts index bafac6e3ac..0cde9417db 100644 --- a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.test.ts @@ -109,6 +109,73 @@ describe('AnnotateScmSlugEntityProcessor', () => { }, }); }); + + it('should only process applicable kinds', async () => { + const component: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + }, + }; + + const api: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'API', + metadata: { + name: 'my-component', + }, + }; + + const system: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'System', + metadata: { + name: 'my-component', + }, + }; + + const location: LocationSpec = { + type: 'url', + target: + 'https://github.com/backstage/backstage/blob/master/catalog-info.yaml', + }; + + const processor = AnnotateScmSlugEntityProcessor.fromConfig( + new ConfigReader({}), + { kinds: ['API', 'System'] }, + ); + + expect(await processor.preProcessEntity(component, location)).toEqual({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'my-component', + }, + }); + + expect(await processor.preProcessEntity(api, location)).toEqual({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'API', + metadata: { + name: 'my-component', + annotations: { + 'github.com/project-slug': 'backstage/backstage', + }, + }, + }); + + expect(await processor.preProcessEntity(system, location)).toEqual({ + apiVersion: 'backstage.io/v1alpha1', + kind: 'System', + metadata: { + name: 'my-component', + annotations: { + 'github.com/project-slug': 'backstage/backstage', + }, + }, + }); + }); }); describe('gitlab', () => { it('adds annotation', async () => { diff --git a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts index 2c18ba1d7d..241a27433e 100644 --- a/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts +++ b/plugins/catalog-backend/src/modules/core/AnnotateScmSlugEntityProcessor.ts @@ -31,16 +31,23 @@ const GITLAB_ACTIONS_ANNOTATION = 'gitlab.com/project-slug'; /** @public */ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { constructor( - private readonly opts: { scmIntegrationRegistry: ScmIntegrationRegistry }, + private readonly opts: { + scmIntegrationRegistry: ScmIntegrationRegistry; + kinds?: string[]; + }, ) {} getProcessorName(): string { return 'AnnotateScmSlugEntityProcessor'; } - static fromConfig(config: Config): AnnotateScmSlugEntityProcessor { + static fromConfig( + config: Config, + options?: { kinds?: string[] }, + ): AnnotateScmSlugEntityProcessor { return new AnnotateScmSlugEntityProcessor({ scmIntegrationRegistry: ScmIntegrations.fromConfig(config), + kinds: options?.kinds, }); } @@ -48,7 +55,13 @@ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { entity: Entity, location: LocationSpec, ): Promise { - if (entity.kind !== 'Component' || location.type !== 'url') { + const applicableKinds = (this.opts.kinds ?? ['Component']).map(k => + k.toLocaleLowerCase('en-US'), + ); + if ( + !applicableKinds.includes(entity.kind.toLocaleLowerCase('en-US')) || + location.type !== 'url' + ) { return entity; } From 593ea01f6a05192900b6f87ab9e834de9264576a Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 2 Aug 2023 23:17:08 +0200 Subject: [PATCH 170/440] catalog: fix EntitySwitch unmounting children on entity refresh Signed-off-by: Vincenzo Scamporlino --- .../EntitySwitch/EntitySwitch.test.tsx | 93 ++++++++++++++++++- .../components/EntitySwitch/EntitySwitch.tsx | 10 +- 2 files changed, 95 insertions(+), 8 deletions(-) diff --git a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx index 13e214d823..3a8795ccb7 100644 --- a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx +++ b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx @@ -20,7 +20,7 @@ import { EntityProvider, } from '@backstage/plugin-catalog-react'; import { render, screen } from '@testing-library/react'; -import React from 'react'; +import React, { useEffect } from 'react'; import { isKind } from './conditions'; import { EntitySwitch } from './EntitySwitch'; import { featureFlagsApiRef } from '@backstage/core-plugin-api'; @@ -209,6 +209,97 @@ describe('EntitySwitch', () => { expect(screen.queryByText('B')).not.toBeInTheDocument(); }); + it('should display the children in case entity is available and loading is true', () => { + const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity; + + render( + + + + Component

} + /> + System

} /> + + + , + ); + + expect(screen.queryByText('Component')).toBeInTheDocument(); + expect(screen.queryByText('System')).not.toBeInTheDocument(); + }); + + it(`shouldn't unmount the children on entity refresh`, () => { + const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity; + + let mountsCount = 0; + function Component() { + useEffect(() => { + ++mountsCount; + }, []); + + return

Component

; + } + + const rendered = render( + + + + } + /> + System

} /> +
+
+
, + ); + + expect(screen.queryByText('Component')).toBeInTheDocument(); + expect(screen.queryByText('System')).not.toBeInTheDocument(); + + expect(mountsCount).toBe(1); + + rendered.rerender( + + + + } + /> + System

} /> +
+
+
, + ); + + expect(screen.queryByText('Component')).toBeInTheDocument(); + expect(screen.queryByText('System')).not.toBeInTheDocument(); + + expect(mountsCount).toBe(1); + + rendered.rerender( + + + + } + /> + System

} /> +
+
+
, + ); + + expect(screen.queryByText('Component')).toBeInTheDocument(); + expect(screen.queryByText('System')).not.toBeInTheDocument(); + + expect(mountsCount).toBe(1); + }); + it('should switch with async condition that is true', async () => { const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity; diff --git a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx index 3cd806faa5..90de358ef9 100644 --- a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx +++ b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx @@ -64,8 +64,9 @@ export interface EntitySwitchProps { /** @public */ export const EntitySwitch = (props: EntitySwitchProps) => { - const { entity, loading } = useAsyncEntity(); + const { entity } = useAsyncEntity(); const apis = useApiHolder(); + const results = useElementFilter( props.children, collection => @@ -76,11 +77,6 @@ export const EntitySwitch = (props: EntitySwitchProps) => { }) .getElements() .flatMap((element: ReactElement) => { - // Nothing is rendered while loading - if (loading) { - return []; - } - const { if: condition, children: elementsChildren } = element.props as EntitySwitchCase; @@ -100,7 +96,7 @@ export const EntitySwitch = (props: EntitySwitchProps) => { }, ]; }), - [apis, entity, loading], + [apis, entity], ); const hasAsyncCases = results.some( From 136cea792bd4ea7404a0cbfbadc3655c4284fdf2 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 2 Aug 2023 23:19:15 +0200 Subject: [PATCH 171/440] changeset Signed-off-by: Vincenzo Scamporlino --- .changeset/twelve-ducks-swim.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/twelve-ducks-swim.md diff --git a/.changeset/twelve-ducks-swim.md b/.changeset/twelve-ducks-swim.md new file mode 100644 index 0000000000..1e44f09be1 --- /dev/null +++ b/.changeset/twelve-ducks-swim.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Fixed an issue causing `EntitySwitch` to unmount its children once entity refresh was invoked From 047e0906364366606bd626a8010e680da6d04d3d Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Wed, 2 Aug 2023 23:42:59 +0200 Subject: [PATCH 172/440] I think unmount should be valid Signed-off-by: Vincenzo Scamporlino --- .github/vale/Vocab/Backstage/accept.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index ed09c73c91..f85139ccbf 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -405,6 +405,7 @@ unbreak Unconference unicode unmanaged +unmount unregister unregistering unregistration From eda2a699f40dd9f94e89af097cdecbe7c92c2ba4 Mon Sep 17 00:00:00 2001 From: Dillon Smedley Date: Wed, 2 Aug 2023 21:26:29 -0400 Subject: [PATCH 173/440] Added changeset for explore-backend Signed-off-by: Dillon Smedley --- .changeset/hot-cats-rush.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hot-cats-rush.md diff --git a/.changeset/hot-cats-rush.md b/.changeset/hot-cats-rush.md new file mode 100644 index 0000000000..2963804ff2 --- /dev/null +++ b/.changeset/hot-cats-rush.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-explore-backend': patch +--- + +Moved the config example from the "Tools as Code" section to the "Tools as Config" section of the README From 2b9653e3105e142682ab9ecd4fb3795ba0d9d3b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Aug 2023 01:59:17 +0000 Subject: [PATCH 174/440] fix(deps): update swc monorepo Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 92 +++++++++++++++++++++++++++---------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/yarn.lock b/yarn.lock index f628161240..1f2a33ba8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16065,90 +16065,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-darwin-arm64@npm:1.3.68" +"@swc/core-darwin-arm64@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-darwin-arm64@npm:1.3.74" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-darwin-x64@npm:1.3.68" +"@swc/core-darwin-x64@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-darwin-x64@npm:1.3.74" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.68" +"@swc/core-linux-arm-gnueabihf@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.74" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.68" +"@swc/core-linux-arm64-gnu@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.74" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.68" +"@swc/core-linux-arm64-musl@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.74" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.68" +"@swc/core-linux-x64-gnu@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.74" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-linux-x64-musl@npm:1.3.68" +"@swc/core-linux-x64-musl@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-linux-x64-musl@npm:1.3.74" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.68" +"@swc/core-win32-arm64-msvc@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.74" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.68" +"@swc/core-win32-ia32-msvc@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.74" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.68": - version: 1.3.68 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.68" +"@swc/core-win32-x64-msvc@npm:1.3.74": + version: 1.3.74 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.74" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.46": - version: 1.3.68 - resolution: "@swc/core@npm:1.3.68" + version: 1.3.74 + resolution: "@swc/core@npm:1.3.74" dependencies: - "@swc/core-darwin-arm64": 1.3.68 - "@swc/core-darwin-x64": 1.3.68 - "@swc/core-linux-arm-gnueabihf": 1.3.68 - "@swc/core-linux-arm64-gnu": 1.3.68 - "@swc/core-linux-arm64-musl": 1.3.68 - "@swc/core-linux-x64-gnu": 1.3.68 - "@swc/core-linux-x64-musl": 1.3.68 - "@swc/core-win32-arm64-msvc": 1.3.68 - "@swc/core-win32-ia32-msvc": 1.3.68 - "@swc/core-win32-x64-msvc": 1.3.68 + "@swc/core-darwin-arm64": 1.3.74 + "@swc/core-darwin-x64": 1.3.74 + "@swc/core-linux-arm-gnueabihf": 1.3.74 + "@swc/core-linux-arm64-gnu": 1.3.74 + "@swc/core-linux-arm64-musl": 1.3.74 + "@swc/core-linux-x64-gnu": 1.3.74 + "@swc/core-linux-x64-musl": 1.3.74 + "@swc/core-win32-arm64-msvc": 1.3.74 + "@swc/core-win32-ia32-msvc": 1.3.74 + "@swc/core-win32-x64-msvc": 1.3.74 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -16175,7 +16175,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: f56ad1d4cb91f7cc1cb5d4b9894bbb528da0b2eabc98984581f5b3f3187cf2c0d512003880f6ff7a3f6d215b7a3dcbf5a9c45e8a428ac2d711941027c0151d89 + checksum: fd61d65fbfceb372178a14cfa998c649481a728e33b68bad90fed0ff05b34fb432f88dafb0c2257d54c4de49cdcdd12d2b5fe66f79abc553656445910f163adb languageName: node linkType: hard @@ -16189,14 +16189,14 @@ __metadata: linkType: hard "@swc/jest@npm:^0.2.22": - version: 0.2.26 - resolution: "@swc/jest@npm:0.2.26" + version: 0.2.27 + resolution: "@swc/jest@npm:0.2.27" dependencies: "@jest/create-cache-key-function": ^27.4.2 jsonc-parser: ^3.2.0 peerDependencies: "@swc/core": "*" - checksum: 771821ed08cf168ca0b6307dee7689253d0af0685acd08408ac431860a7c42ace892db2cb6bb6dcfe297edbdce0f2e22d44ed4ed72d1c621be9e841cffd408a0 + checksum: db258e13f9eb9441d4d924684452939fb49016a4a2eaf7700cbf5eb4f90dff96bb7ce240ed539adbcd41b45fe62bacdc1d3f3d995403af44d54501b41f1ec72f languageName: node linkType: hard From 17d626cad4d6191bc15138c51f87541501847471 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Thu, 3 Aug 2023 10:34:25 +0300 Subject: [PATCH 175/440] Fix variable passing Signed-off-by: Alex Eftimie --- .../tasks/NunjucksWorkflowRunner.test.ts | 66 ++++++++++++++++++- .../tasks/NunjucksWorkflowRunner.ts | 11 +++- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 8fbbd45b94..253a6c4388 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -574,7 +574,7 @@ describe('DefaultWorkflowRunner', () => { }); describe('each', () => { - it('should run a step repeatedly', async () => { + it('should run a step repeatedly - flat values', async () => { const task = createMockTaskWithSpec({ apiVersion: 'scaffolder.backstage.io/v1beta3', steps: [ @@ -583,7 +583,7 @@ describe('DefaultWorkflowRunner', () => { name: 'name', each: '${{parameters.colors}}', action: 'jest-mock-action', - input: { color: '${{each}}' }, + input: { color: '${{each.value}}' }, }, ], output: {}, @@ -604,6 +604,68 @@ describe('DefaultWorkflowRunner', () => { expect.objectContaining({ input: { color: 'red' } }), ); }); + + it('should run a step repeatedly - object list', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + each: '${{parameters.settings}}', + action: 'jest-mock-action', + input: { + key: '${{each.key}}', + value: '${{each.value}}', + }, + }, + ], + output: {}, + parameters: { + settings: [{ color: 'blue' }], + }, + }); + + await runner.execute(task); + + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ + input: { key: '0', value: { color: 'blue' } }, + }), + ); + }); + + it('should run a step repeatedly - object', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + each: '${{parameters.settings}}', + action: 'jest-mock-action', + input: { key: '${{each.key}}', value: '${{each.value}}' }, + }, + ], + output: {}, + parameters: { + settings: { color: 'blue', transparent: 'yes' }, + }, + }); + + await runner.execute(task); + + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ + input: { key: 'color', value: 'blue' }, + }), + ); + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ + input: { key: 'transparent', value: 'yes' }, + }), + ); + }); }); describe('secrets', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index a6c486c58d..b0b8fd6d09 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -315,7 +315,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { const iterations = new Array(); if (step.each) { const each = await this.render(step.each, context, renderTemplate); - iterations.push(...each); + iterations.push( + ...Object.keys(each).map((key: any) => [key, each[key]]), + ); } else { iterations.push({}); } @@ -324,13 +326,16 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { for (const iteration of iterations) { if (step.each) { taskLogger.info(`Running step each: ${iteration}`); - context.each = iteration; + const iterationContext = { + ...context, + each: { key: iteration[0], value: iteration[1] }, + }; // re-render input with the modified context that includes each actionInput = (step.input && this.render( step.input, - { ...context, secrets: task.secrets ?? {} }, + { ...iterationContext, secrets: task.secrets ?? {} }, renderTemplate, )) ?? {}; From 43b61fdb394c987def5b9ccb2186d71ab5c4e57e Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Thu, 3 Aug 2023 10:44:37 +0300 Subject: [PATCH 176/440] fix tsc Signed-off-by: Alex Eftimie --- .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index b0b8fd6d09..1f93ded94c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -316,7 +316,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { if (step.each) { const each = await this.render(step.each, context, renderTemplate); iterations.push( - ...Object.keys(each).map((key: any) => [key, each[key]]), + ...Object.keys(each).map((key: any) => { + return { key: key, value: each[key] }; + }), ); } else { iterations.push({}); @@ -328,7 +330,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { taskLogger.info(`Running step each: ${iteration}`); const iterationContext = { ...context, - each: { key: iteration[0], value: iteration[1] }, + each: iteration, }; // re-render input with the modified context that includes each actionInput = From 5b0b80f39582c2082d1a57229c66899a8b9f67f5 Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Thu, 3 Aug 2023 12:23:46 +0300 Subject: [PATCH 177/440] fix docs Signed-off-by: Alex Eftimie --- docs/features/software-templates/writing-templates.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md index db342bcf61..57e261f19f 100644 --- a/docs/features/software-templates/writing-templates.md +++ b/docs/features/software-templates/writing-templates.md @@ -526,8 +526,8 @@ input: each: [{ name: 'apple', count: 3 }, { name: 'orange', count: 1 }] input: values: - fruit: ${{ each.name }} - count: ${{ each.count }} + fruit: ${{ each.value.name }} + count: ${{ each.value.count }} ``` When `each` is used, the outputs of a repeated step are returned as an array of outputs from each iteration. From da06d93e24536ff406621a3b244d630d49c5f67d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 3 Aug 2023 11:40:36 +0200 Subject: [PATCH 178/440] app-node: align express version Signed-off-by: Patrik Oldsberg --- plugins/app-node/package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 486ad7f9f7..c971bdb628 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -30,6 +30,6 @@ "dependencies": { "@backstage/backend-plugin-api": "workspace:^", "@types/express": "^4.17.6", - "express": "^4.18.2" + "express": "^4.17.1" } } diff --git a/yarn.lock b/yarn.lock index 2177fb8ab0..57aef2759f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4665,7 +4665,7 @@ __metadata: "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@types/express": ^4.17.6 - express: ^4.18.2 + express: ^4.17.1 languageName: unknown linkType: soft @@ -25464,7 +25464,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2": +"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: From 9995962c31c79fa0682ad9dd210e909d51c1b18d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 3 Aug 2023 11:49:01 +0200 Subject: [PATCH 179/440] proxy-backend: update API report Signed-off-by: Patrik Oldsberg --- plugins/proxy-backend/api-report.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/plugins/proxy-backend/api-report.md b/plugins/proxy-backend/api-report.md index 12d799bdf7..9c5cf5f9ef 100644 --- a/plugins/proxy-backend/api-report.md +++ b/plugins/proxy-backend/api-report.md @@ -13,14 +13,7 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common'; export function createRouter(options: RouterOptions): Promise; // @alpha -export const proxyPlugin: ( - options?: - | { - skipInvalidProxies?: boolean | undefined; - reviveConsumedRequestBodies?: boolean | undefined; - } - | undefined, -) => BackendFeature; +export const proxyPlugin: () => BackendFeature; // @public (undocumented) export interface RouterOptions { From 6a76b893722bd9738a4360d61a622967f662ad1a Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Thu, 3 Aug 2023 14:13:53 +0100 Subject: [PATCH 180/440] fix mocking Signed-off-by: Brian Fletcher --- .../actions/builtin/fetch/plainFile.examples.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts index 86fe15be8e..2ee17c29fe 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.examples.test.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +jest.mock('@backstage/plugin-scaffolder-node', () => { + const actual = jest.requireActual('@backstage/plugin-scaffolder-node'); + return { ...actual, fetchFile: jest.fn() }; +}); + import yaml from 'yaml'; import os from 'os'; import { resolve as resolvePath } from 'path'; @@ -25,11 +30,6 @@ import { PassThrough } from 'stream'; import { fetchFile } from '@backstage/plugin-scaffolder-node'; import { examples } from './plainFile.examples'; -jest.mock('@backstage/plugin-scaffolder-node', () => ({ - ...jest.requireActual('@backstage/plugin-scaffolder-node'), - fetchContents: jest.fn(), -})); - describe('fetch:plain:file examples', () => { const integrations = ScmIntegrations.fromConfig( new ConfigReader({ From aea0482fee564be8295b5a8e6291045a397f09d3 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Thu, 3 Aug 2023 14:15:09 +0100 Subject: [PATCH 181/440] fix typo Signed-off-by: Brian Fletcher --- .../src/scaffolder/actions/builtin/catalog/fetch.examples.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts index 5bd76dd539..6459b17a71 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.examples.ts @@ -34,7 +34,7 @@ export const examples: TemplateExample[] = [ }), }, { - description: 'Fetch multiple entities by referencse', + description: 'Fetch multiple entities by reference', example: yaml.stringify({ steps: [ { From f2047da89b93295a92f044c6d1db0da09103ba11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 3 Aug 2023 15:48:59 +0200 Subject: [PATCH 182/440] get rid of vulnerable version of protobufjs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- yarn.lock | 48 ++++++++++++------------------------------------ 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/yarn.lock b/yarn.lock index f628161240..44b3612cd0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26853,8 +26853,8 @@ __metadata: linkType: hard "google-gax@npm:^3.5.7, google-gax@npm:^3.5.8": - version: 3.6.0 - resolution: "google-gax@npm:3.6.0" + version: 3.6.1 + resolution: "google-gax@npm:3.6.1" dependencies: "@grpc/grpc-js": ~1.8.0 "@grpc/proto-loader": ^0.7.0 @@ -26868,13 +26868,13 @@ __metadata: node-fetch: ^2.6.1 object-hash: ^3.0.0 proto3-json-serializer: ^1.0.0 - protobufjs: 7.2.3 + protobufjs: 7.2.4 protobufjs-cli: 1.1.1 retry-request: ^5.0.0 bin: compileProtos: build/tools/compileProtos.js minifyProtoJson: build/tools/minify.js - checksum: 4c7b1b5a278ffda3eaa92e7f25a9e0ea2d0a76aca704aca4baee4fe9d109916e97e83062ad751006ed93ac675a7fd74028061204fa9ed92833a853e6657a71a1 + checksum: 16e5fb211d75c6a4cb4d2e62adba7bbf41d160feba74fe39435a70fc31ef8ebc740af4527a2897abab39a1806d131792b2a761da432ae1b916198c9c43aab36e languageName: node linkType: hard @@ -35919,11 +35919,11 @@ __metadata: linkType: hard "proto3-json-serializer@npm:^1.0.0": - version: 1.0.0 - resolution: "proto3-json-serializer@npm:1.0.0" + version: 1.1.1 + resolution: "proto3-json-serializer@npm:1.1.1" dependencies: - protobufjs: ^6.11.2 - checksum: 47ac3b7c48eb177aba3e59431704c5db24d670827bd47ef7488e3529ab85e0de4833ed22615945fa72597dd382aa505b8dd427c917c4c50d31e7570d8af21294 + protobufjs: ^7.0.0 + checksum: 0cd94cb635a9b9b3a2d047700175be4a6c7b7a43e2698826edad17604793764bcdfc270585ea58cb94aa690211b6cdaae5bf7a22522bea68ca67a2844773b4b7 languageName: node linkType: hard @@ -35950,9 +35950,9 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:7.2.3, protobufjs@npm:^7.0.0": - version: 7.2.3 - resolution: "protobufjs@npm:7.2.3" +"protobufjs@npm:7.2.4, protobufjs@npm:^7.0.0": + version: 7.2.4 + resolution: "protobufjs@npm:7.2.4" dependencies: "@protobufjs/aspromise": ^1.1.2 "@protobufjs/base64": ^1.1.2 @@ -35966,31 +35966,7 @@ __metadata: "@protobufjs/utf8": ^1.1.0 "@types/node": ">=13.7.0" long: ^5.0.0 - checksum: 9afa6de5fced0139a5180c063718508fac3ea734a9f1aceb99712367b15473a83327f91193f16b63540f9112b09a40912f5f0441a9b0d3f3c6a1c7f707d78249 - languageName: node - linkType: hard - -"protobufjs@npm:^6.11.2": - version: 6.11.3 - resolution: "protobufjs@npm:6.11.3" - dependencies: - "@protobufjs/aspromise": ^1.1.2 - "@protobufjs/base64": ^1.1.2 - "@protobufjs/codegen": ^2.0.4 - "@protobufjs/eventemitter": ^1.1.0 - "@protobufjs/fetch": ^1.1.0 - "@protobufjs/float": ^1.0.2 - "@protobufjs/inquire": ^1.1.0 - "@protobufjs/path": ^1.1.2 - "@protobufjs/pool": ^1.1.0 - "@protobufjs/utf8": ^1.1.0 - "@types/long": ^4.0.1 - "@types/node": ">=13.7.0" - long: ^4.0.0 - bin: - pbjs: bin/pbjs - pbts: bin/pbts - checksum: 4a6ce1964167e4c45c53fd8a312d7646415c777dd31b4ba346719947b88e61654912326101f927da387d6b6473ab52a7ea4f54d6f15d63b31130ce28e2e15070 + checksum: a952cdf2a5e5250c16ae651b570849b6f5b20a5475c3eef63ffb290ad239aa2916adfc1cc676f7fc93c69f48113df268761c0c246f7f023118c85bdd1a170044 languageName: node linkType: hard From cc14e1ba0ec638dbc9c07636e8db89e3cfd2e5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 3 Aug 2023 16:09:02 +0200 Subject: [PATCH 183/440] bump nwsapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f628161240..86122494c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33649,9 +33649,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.0": - version: 2.2.0 - resolution: "nwsapi@npm:2.2.0" - checksum: 5ef4a9bc0c1a5b7f2e014aa6a4b359a257503b796618ed1ef0eb852098f77e772305bb0e92856e4bbfa3e6c75da48c0113505c76f144555ff38867229c2400a7 + version: 2.2.7 + resolution: "nwsapi@npm:2.2.7" + checksum: cab25f7983acec7e23490fec3ef7be608041b460504229770e3bfcf9977c41d6fe58f518994d3bd9aa3a101f501089a3d4a63536f4ff8ae4b8c4ca23bdbfda4e languageName: node linkType: hard From 825be22c82d052461615c182b925a1531bc19cd9 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Thu, 3 Aug 2023 13:15:01 -0400 Subject: [PATCH 184/440] fix(auth-backend): Overly permissive regex in test Signed-off-by: Adam Harvey --- plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts b/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts index a0c437815d..a61d51b27b 100644 --- a/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts +++ b/plugins/auth-backend/src/lib/flow/authFlowHelpers.test.ts @@ -125,7 +125,7 @@ describe('oauth helpers', () => { postMessageResponse(mockResponse, appOrigin, data); expect(responseBody.match(/.postMessage\(/g)).toHaveLength(2); expect( - responseBody.match(/.postMessage\([a-zA-z.()]*, \'\*\'\)/g), + responseBody.match(/.postMessage\([a-zA-Z.()]*, \'\*\'\)/g), ).toHaveLength(1); const errData: WebMessageResponse = { @@ -135,7 +135,7 @@ describe('oauth helpers', () => { postMessageResponse(mockResponse, appOrigin, errData); expect(responseBody.match(/.postMessage\(/g)).toHaveLength(2); expect( - responseBody.match(/.postMessage\([a-zA-z.()]*, \'\*\'\)/g), + responseBody.match(/.postMessage\([a-zA-Z.()]*, \'\*\'\)/g), ).toHaveLength(1); }); From ee497790227247c112d9e97003ed166c048817f8 Mon Sep 17 00:00:00 2001 From: coderrob Date: Thu, 3 Aug 2023 12:46:59 -0500 Subject: [PATCH 185/440] Fix invalid deprecated import paths in plugin-catalog-backend Signed-off-by: coderrob --- plugins/catalog-backend/src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts index 345102adcd..8ce258d3b6 100644 --- a/plugins/catalog-backend/src/index.ts +++ b/plugins/catalog-backend/src/index.ts @@ -36,13 +36,13 @@ import { /** * @public - * @deprecated import from `@backstage/search-backend-module-catalog` instead + * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead */ export const DefaultCatalogCollatorFactory = _DefaultCatalogCollatorFactory; /** * @public - * @deprecated import from `@backstage/search-backend-module-catalog` instead + * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead */ export const defaultCatalogCollatorEntityTransformer = _defaultCatalogCollatorEntityTransformer; @@ -54,14 +54,14 @@ import type { /** * @public - * @deprecated import from `@backstage/search-backend-module-catalog` instead + * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead */ export type DefaultCatalogCollatorFactoryOptions = _DefaultCatalogCollatorFactoryOptions; /** * @public - * @deprecated import from `@backstage/search-backend-module-catalog` instead + * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead */ export type CatalogCollatorEntityTransformer = _CatalogCollatorEntityTransformer; From 6ca6c3b865b16db32620f7b932d18021c1c11f7a Mon Sep 17 00:00:00 2001 From: coderrob Date: Thu, 3 Aug 2023 12:48:13 -0500 Subject: [PATCH 186/440] Fix invalid deprecated import paths in plugins/explore-backend Signed-off-by: coderrob --- plugins/explore-backend/src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/explore-backend/src/index.ts b/plugins/explore-backend/src/index.ts index ca501db96b..15659d6ab6 100644 --- a/plugins/explore-backend/src/index.ts +++ b/plugins/explore-backend/src/index.ts @@ -36,19 +36,19 @@ import type { /** * @public - * @deprecated import from `@backstage/search-backend-module-explore` instead + * @deprecated import from `@backstage/plugin-search-backend-module-explore` instead */ export const ToolDocumentCollatorFactory = _ToolDocumentCollatorFactory; /** * @public - * @deprecated import from `@backstage/search-backend-module-explore` instead + * @deprecated import from `@backstage/plugin-search-backend-module-explore` instead */ export type ToolDocument = _ToolDocument; /** * @public - * @deprecated import from `@backstage/search-backend-module-explore` instead + * @deprecated import from `@backstage/plugin-search-backend-module-explore` instead */ export type ToolDocumentCollatorFactoryOptions = _ToolDocumentCollatorFactoryOptions; From 659264dad4030c167c33eb672a328917339161e4 Mon Sep 17 00:00:00 2001 From: coderrob Date: Thu, 3 Aug 2023 12:49:00 -0500 Subject: [PATCH 187/440] Fix invalid deprecated import paths in plugins/techdocs-backend Signed-off-by: coderrob --- plugins/techdocs-backend/src/search/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/techdocs-backend/src/search/index.ts b/plugins/techdocs-backend/src/search/index.ts index fc2b48375e..904f998042 100644 --- a/plugins/techdocs-backend/src/search/index.ts +++ b/plugins/techdocs-backend/src/search/index.ts @@ -25,12 +25,12 @@ import type { TechDocsCollatorFactoryOptions as _TechDocsCollatorFactoryOptions /** * @public - * @deprecated import from `@backstage/search-backend-module-techdocs` instead + * @deprecated import from `@backstage/plugin-search-backend-module-techdocs` instead */ export type TechDocsCollatorFactoryOptions = _TechDocsCollatorFactoryOptions; /** * @public - * @deprecated import from `@backstage/search-backend-module-techdocs` instead + * @deprecated import from `@backstage/plugin-search-backend-module-techdocs` instead */ export const DefaultTechDocsCollatorFactory = _DefaultTechDocsCollatorFactory; From 51d47ba5abca2377ad84efa32db1e8b9d65bd2dd Mon Sep 17 00:00:00 2001 From: Rob Lindley Date: Thu, 3 Aug 2023 12:51:23 -0500 Subject: [PATCH 188/440] Fix missing ` in catalog-backend find / replace Signed-off-by: Rob Lindley Signed-off-by: coderrob --- plugins/catalog-backend/src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts index 8ce258d3b6..55c1c672d3 100644 --- a/plugins/catalog-backend/src/index.ts +++ b/plugins/catalog-backend/src/index.ts @@ -36,13 +36,13 @@ import { /** * @public - * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead + * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead */ export const DefaultCatalogCollatorFactory = _DefaultCatalogCollatorFactory; /** * @public - * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead + * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead */ export const defaultCatalogCollatorEntityTransformer = _defaultCatalogCollatorEntityTransformer; @@ -54,14 +54,14 @@ import type { /** * @public - * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead + * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead */ export type DefaultCatalogCollatorFactoryOptions = _DefaultCatalogCollatorFactoryOptions; /** * @public - * @deprecated import from @backstage/plugin-search-backend-module-catalog` instead + * @deprecated import from `@backstage/plugin-search-backend-module-catalog` instead */ export type CatalogCollatorEntityTransformer = _CatalogCollatorEntityTransformer; From c641de0f3b66f5e9289fe564f339aa6f64ece50b Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Thu, 3 Aug 2023 10:58:55 -0700 Subject: [PATCH 189/440] Updated plugin files: - ocm.yaml - keycloak.yaml - tekton.yaml - topology.yaml - quay.yaml - 3scale.yaml - jfrog-artifactory.yaml Signed-off-by: Taras Mankovski --- microsite/data/plugins/3scale.yaml | 2 +- microsite/data/plugins/jfrog-artifactory.yaml | 2 +- microsite/data/plugins/keycloak.yaml | 2 +- microsite/data/plugins/ocm.yaml | 2 +- microsite/data/plugins/quay.yaml | 2 +- microsite/data/plugins/tekton.yaml | 2 +- microsite/data/plugins/topology.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/microsite/data/plugins/3scale.yaml b/microsite/data/plugins/3scale.yaml index c190ed7e9e..fa568c17bf 100644 --- a/microsite/data/plugins/3scale.yaml +++ b/microsite/data/plugins/3scale.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Discovery description: Synchronize 3scale content into the Backstage catalog. documentation: https://janus-idp.io/plugins/3scale -iconUrl: http://janus-idp.io/images/plugins/3scale.svg +iconUrl: https://janus-idp.io/images/plugins/3scale.svg npmPackageName: '@janus-idp/backstage-plugin-3scale-backend' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/jfrog-artifactory.yaml b/microsite/data/plugins/jfrog-artifactory.yaml index 279cbc161e..6765fe3d8d 100644 --- a/microsite/data/plugins/jfrog-artifactory.yaml +++ b/microsite/data/plugins/jfrog-artifactory.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Image description: View container image details from JFrog Artifactory in Backstage. documentation: https://janus-idp.io/plugins/jfrog-artifactory -iconUrl: http://janus-idp.io/images/plugins/jfrog-artifactory.svg +iconUrl: https://janus-idp.io/images/plugins/jfrog-artifactory.svg npmPackageName: '@janus-idp/backstage-plugin-jfrog-artifactory' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/keycloak.yaml b/microsite/data/plugins/keycloak.yaml index ea657c74f2..3da89c3d0a 100644 --- a/microsite/data/plugins/keycloak.yaml +++ b/microsite/data/plugins/keycloak.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Authentication/Authorization description: Load users and groups from Keycloak, enabling use of multiple authentication providers to be applied to Backstage entities. documentation: https://janus-idp.io/plugins/keycloak -iconUrl: http://janus-idp.io/images/plugins/keycloak.svg +iconUrl: https://janus-idp.io/images/plugins/keycloak.svg npmPackageName: '@janus-idp/backstage-plugin-keycloak-backend' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/ocm.yaml b/microsite/data/plugins/ocm.yaml index 9e9b8ff1b7..6cf77ca678 100644 --- a/microsite/data/plugins/ocm.yaml +++ b/microsite/data/plugins/ocm.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Infrastructure description: View clusters from OCM's MultiClusterHub and MultiCluster Engine in Backstage. documentation: https://janus-idp.io/plugins/ocm -iconUrl: http://janus-idp.io/images/plugins/ocm.svg +iconUrl: https://janus-idp.io/images/plugins/ocm.svg npmPackageName: '@janus-idp/backstage-plugin-ocm' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/quay.yaml b/microsite/data/plugins/quay.yaml index e4aeb1ec1a..79ae1c3408 100644 --- a/microsite/data/plugins/quay.yaml +++ b/microsite/data/plugins/quay.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Image description: View container image details from Quay in Backstage. documentation: https://janus-idp.io/plugins/quay -iconUrl: http://janus-idp.io/images/plugins/quay.svg +iconUrl: https://janus-idp.io/images/plugins/quay.svg npmPackageName: '@janus-idp/backstage-plugin-quay' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/tekton.yaml b/microsite/data/plugins/tekton.yaml index fa94b89c35..27540a81d3 100644 --- a/microsite/data/plugins/tekton.yaml +++ b/microsite/data/plugins/tekton.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: CI/CD description: Easily view Tekton PipelineRun status for your services in Backstage. documentation: https://janus-idp.io/plugins/tekton -iconUrl: http://janus-idp.io/images/plugins/tekton.svg +iconUrl: https://janus-idp.io/images/plugins/tekton.svg npmPackageName: '@janus-idp/backstage-plugin-tekton' addedDate: '2023-05-15' diff --git a/microsite/data/plugins/topology.yaml b/microsite/data/plugins/topology.yaml index 2f26f7c755..9d3b816bd4 100644 --- a/microsite/data/plugins/topology.yaml +++ b/microsite/data/plugins/topology.yaml @@ -5,6 +5,6 @@ authorUrl: https://redhat.com category: Kubernetes description: Visualize the deployment status and related resources of your applications deployed on any Kubernetes cluster. documentation: https://janus-idp.io/plugins/topology -iconUrl: http://janus-idp.io/images/plugins/topology.svg +iconUrl: https://janus-idp.io/images/plugins/topology.svg npmPackageName: '@janus-idp/backstage-plugin-topology' addedDate: '2023-05-15' From a6f2f70515ab7131ee8a777f1f0f21c66d86eb1c Mon Sep 17 00:00:00 2001 From: Robert Bunning <129326788+wss-rbunning@users.noreply.github.com> Date: Thu, 3 Aug 2023 14:47:25 -0400 Subject: [PATCH 190/440] Update plugins/newrelic/src/api/index.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Robert Bunning <129326788+wss-rbunning@users.noreply.github.com> --- plugins/newrelic/src/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/newrelic/src/api/index.ts b/plugins/newrelic/src/api/index.ts index b471104139..9ce6f2c111 100644 --- a/plugins/newrelic/src/api/index.ts +++ b/plugins/newrelic/src/api/index.ts @@ -166,7 +166,7 @@ export class NewRelicClient implements NewRelicApi { const relation = linkParts?.[2]; const nextPageLink = `${this.baseUrl}${nextPageNumber}`; - const isValidLink = !!(!!linkParts && nextPageNumber && relation); + const isValidLink = !!(linkParts && nextPageNumber && relation); if (!nextRelevantLink || !isValidLink) { return undefined; From 8691920ba5929745def1c6594e0633cebe661d26 Mon Sep 17 00:00:00 2001 From: Waldir Montoya Date: Thu, 3 Aug 2023 12:37:55 -0500 Subject: [PATCH 191/440] Describe what is a session secret Signed-off-by: Waldir Montoya --- docs/auth/auth0/provider.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/auth/auth0/provider.md b/docs/auth/auth0/provider.md index e9393cfa0b..dabc5fa3c1 100644 --- a/docs/auth/auth0/provider.md +++ b/docs/auth/auth0/provider.md @@ -47,6 +47,7 @@ The Auth0 provider is a structure with three configuration keys: - `clientSecret`: The Application client secret, found on the Auth0 Application page - `domain`: The Application domain, found on the Auth0 Application page +- `sessionsecret`: The session secret is a key used for signing and/or encrypting cookies set by the application to maintain session state. In this case, 'your session secret' should be replaced with a long, complex, and unique string that only your application knows. Because Auth0 requires a session you need to give the session a secret key. From fc13158927622b7d15b330c253575f8da4df4b3b Mon Sep 17 00:00:00 2001 From: Waldir Montoya <35240971+waldirmontoya25@users.noreply.github.com> Date: Thu, 3 Aug 2023 12:55:30 -0500 Subject: [PATCH 192/440] Update docs/auth/auth0/provider.md Co-authored-by: Jamie Klassen Signed-off-by: Waldir Montoya <35240971+waldirmontoya25@users.noreply.github.com> --- docs/auth/auth0/provider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/auth/auth0/provider.md b/docs/auth/auth0/provider.md index dabc5fa3c1..68d55ca0e3 100644 --- a/docs/auth/auth0/provider.md +++ b/docs/auth/auth0/provider.md @@ -47,7 +47,7 @@ The Auth0 provider is a structure with three configuration keys: - `clientSecret`: The Application client secret, found on the Auth0 Application page - `domain`: The Application domain, found on the Auth0 Application page -- `sessionsecret`: The session secret is a key used for signing and/or encrypting cookies set by the application to maintain session state. In this case, 'your session secret' should be replaced with a long, complex, and unique string that only your application knows. +- `session.secret`: The session secret is a key used for signing and/or encrypting cookies set by the application to maintain session state. In this case, 'your session secret' should be replaced with a long, complex, and unique string that only your application knows. Because Auth0 requires a session you need to give the session a secret key. From 414ecc6a272b75f50829110d79c28f9e062dd329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 3 Aug 2023 21:30:06 +0200 Subject: [PATCH 193/440] fix the config checking error for linguist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/linguist-backend/config.d.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/linguist-backend/config.d.ts b/plugins/linguist-backend/config.d.ts index 5faf28fb1d..e7ad487d12 100644 --- a/plugins/linguist-backend/config.d.ts +++ b/plugins/linguist-backend/config.d.ts @@ -35,7 +35,9 @@ export interface Config { * A custom mapping of linguist languages to how they should be rendered as entity tags. * If a language is mapped to '' it will not be included as a tag. */ - languageMap?: Record; + languageMap?: { + [language: string]: string | undefined; + }; /** * How long to cache entity languages for in memory. Used to avoid constant db hits during * processing. Defaults to 30 minutes. From f626d1d85e784a0f45d31448b2d91b770e742c04 Mon Sep 17 00:00:00 2001 From: Waldir Montoya Date: Thu, 3 Aug 2023 14:32:43 -0500 Subject: [PATCH 194/440] tweak session secret description given feedback Signed-off-by: Waldir Montoya --- docs/auth/auth0/provider.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/auth/auth0/provider.md b/docs/auth/auth0/provider.md index 68d55ca0e3..dcd02d226f 100644 --- a/docs/auth/auth0/provider.md +++ b/docs/auth/auth0/provider.md @@ -41,15 +41,18 @@ auth: secret: ${AUTH_SESSION_SECRET} ``` -The Auth0 provider is a structure with three configuration keys: +The Auth0 provider is a structure with these configuration keys: - `clientId`: The Application client ID, found on the Auth0 Application page - `clientSecret`: The Application client secret, found on the Auth0 Application page - `domain`: The Application domain, found on the Auth0 Application page + +It additionally relies on the following configuration to function: + - `session.secret`: The session secret is a key used for signing and/or encrypting cookies set by the application to maintain session state. In this case, 'your session secret' should be replaced with a long, complex, and unique string that only your application knows. -Because Auth0 requires a session you need to give the session a secret key. +Auth0 requires a session, so you need to give the session a secret key. ## Optional Configuration From 86b9c3b0d34558660393efaf8a9c7ea1a804f70e Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Thu, 3 Aug 2023 18:41:57 -0400 Subject: [PATCH 195/440] chore: Add Storybook automated labeling Signed-off-by: Adam Harvey --- .github/labeler.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/labeler.yml b/.github/labeler.yml index eaba199588..dc048b1744 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -24,6 +24,8 @@ documentation: - docs/**/* microsite: - microsite/**/* +storybook: + - storybook/**/* auth: - plugins/auth-backend/**/* - packages/core-app-api/src/apis/implementations/auth/**/* From 5a591ccd5b47a797f0f1541c012b4afbde368c15 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Aug 2023 22:52:24 +0000 Subject: [PATCH 196/440] chore(deps): update dependency @types/node to v20.4.6 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 d48e6a94b2..60b54624c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17532,9 +17532,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 20.4.5 - resolution: "@types/node@npm:20.4.5" - checksum: 36a0304a8dc346a1b2d2edac4c4633eecf70875793d61a5274d0df052d7a7af7a8e34f29884eac4fbd094c4f0201477dcb39c0ecd3307ca141688806538d1138 + version: 20.4.6 + resolution: "@types/node@npm:20.4.6" + checksum: 28dfc13da87f579264840bc5b8a2cde2dcb93662464a0d58f0fa98eba1aae978e3c73e893474238c4a1226d0b1a14e3936520ff9795e1c4e06fad3282be83d18 languageName: node linkType: hard From ce65ec333a6da8e5ff3ff04d3ae11a8fefda2e3d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Aug 2023 23:37:52 +0000 Subject: [PATCH 197/440] fix(deps): update dependency handlebars to v4.7.8 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 60b54624c6..6b0a699077 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27165,11 +27165,11 @@ __metadata: linkType: hard "handlebars@npm:^4.7.3": - version: 4.7.7 - resolution: "handlebars@npm:4.7.7" + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" dependencies: minimist: ^1.2.5 - neo-async: ^2.6.0 + neo-async: ^2.6.2 source-map: ^0.6.1 uglify-js: ^3.1.4 wordwrap: ^1.0.0 @@ -27178,7 +27178,7 @@ __metadata: optional: true bin: handlebars: bin/handlebars - checksum: 1e79a43f5e18d15742977cb987923eab3e2a8f44f2d9d340982bcb69e1735ed049226e534d7c1074eaddaf37e4fb4f471a8adb71cddd5bc8cf3f894241df5cee + checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff languageName: node linkType: hard @@ -33069,7 +33069,7 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.5.0, neo-async@npm:^2.6.0, neo-async@npm:^2.6.2": +"neo-async@npm:^2.5.0, neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 From b79869e9520ee1fbf968b2de4b5b523fb2a161eb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Aug 2023 23:38:22 +0000 Subject: [PATCH 198/440] fix(deps): update dependency inquirer to v8.2.6 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index 60b54624c6..d030c23da1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28017,7 +28017,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.5, inquirer@npm:^8.0.0, inquirer@npm:^8.2.0": +"inquirer@npm:8.2.5": version: 8.2.5 resolution: "inquirer@npm:8.2.5" dependencies: @@ -28040,6 +28040,29 @@ __metadata: languageName: node linkType: hard +"inquirer@npm:^8.0.0, inquirer@npm:^8.2.0": + version: 8.2.6 + resolution: "inquirer@npm:8.2.6" + dependencies: + ansi-escapes: ^4.2.1 + chalk: ^4.1.1 + cli-cursor: ^3.1.0 + cli-width: ^3.0.0 + external-editor: ^3.0.3 + figures: ^3.0.0 + lodash: ^4.17.21 + mute-stream: 0.0.8 + ora: ^5.4.1 + run-async: ^2.4.0 + rxjs: ^7.5.5 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + through: ^2.3.6 + wrap-ansi: ^6.0.1 + checksum: 387ffb0a513559cc7414eb42c57556a60e302f820d6960e89d376d092e257a919961cd485a1b4de693dbb5c0de8bc58320bfd6247dfd827a873aa82a4215a240 + languageName: node + linkType: hard + "internal-slot@npm:^1.0.3": version: 1.0.3 resolution: "internal-slot@npm:1.0.3" @@ -42533,7 +42556,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.2.0": +"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" dependencies: From eb50fdb93044164bec84729f949dc9c4fdb5f08a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Aug 2023 23:38:50 +0000 Subject: [PATCH 199/440] fix(deps): update dependency pg to v8.11.2 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 60b54624c6..1514964c8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34813,10 +34813,10 @@ __metadata: languageName: node linkType: hard -"pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.4.0, pg-connection-string@npm:^2.6.1": - version: 2.6.1 - resolution: "pg-connection-string@npm:2.6.1" - checksum: 882344a47e1ecf3a91383e0809bf2ac48facea97fcec0358d6e060e1cbcb8737acde419b4c86f05da4ce4a16634ee50fff1d2bb787d73b52ccbfde697243ad8a +"pg-connection-string@npm:^2.3.0, pg-connection-string@npm:^2.4.0, pg-connection-string@npm:^2.6.2": + version: 2.6.2 + resolution: "pg-connection-string@npm:2.6.2" + checksum: 22265882c3b6f2320785378d0760b051294a684989163d5a1cde4009e64e84448d7bf67d9a7b9e7f69440c3ee9e2212f9aa10dd17ad6773f6143c6020cebbcb5 languageName: node linkType: hard @@ -34879,13 +34879,13 @@ __metadata: linkType: hard "pg@npm:^8.3.0, pg@npm:^8.4.0": - version: 8.11.1 - resolution: "pg@npm:8.11.1" + version: 8.11.2 + resolution: "pg@npm:8.11.2" dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-cloudflare: ^1.1.1 - pg-connection-string: ^2.6.1 + pg-connection-string: ^2.6.2 pg-pool: ^3.6.1 pg-protocol: ^1.6.0 pg-types: ^2.1.0 @@ -34898,7 +34898,7 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: e608fe1c52725e1c0c4cbdf97e29df8f41b9fd21aed821866e3488b3a0622be1c19801d8d8eb31f0de35f040c4f69163c211358e7df8c48d15ee8f660d2bd4cc + checksum: dfea8a2269d500dee8c17291207e5a25897163480037beb7a59be35f51e33b519c297c943ea6898b285d6a74a0d661901dc9cff2e587cc4be0bbf09b833a71a5 languageName: node linkType: hard From c53491e5a5082ad1f7a23758a8dcd9e799438130 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 01:07:39 +0000 Subject: [PATCH 200/440] chore(deps): update dependency eslint to v8.46.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 74 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/yarn.lock b/yarn.lock index ad760f563d..0fcea0a990 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10766,16 +10766,16 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.5.0 - resolution: "@eslint-community/regexpp@npm:4.5.0" - checksum: 99c01335947dbd7f2129e954413067e217ccaa4e219fe0917b7d2bd96135789384b8fedbfb8eb09584d5130b27a7b876a7150ab7376f51b3a0c377d5ce026a10 +"@eslint-community/regexpp@npm:^4.6.1": + version: 4.6.2 + resolution: "@eslint-community/regexpp@npm:4.6.2" + checksum: a3c341377b46b54fa228f455771b901d1a2717f95d47dcdf40199df30abc000ba020f747f114f08560d119e979d882a94cf46cfc51744544d54b00319c0f2724 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.0": - version: 2.1.0 - resolution: "@eslint/eslintrc@npm:2.1.0" +"@eslint/eslintrc@npm:^2.1.1": + version: 2.1.1 + resolution: "@eslint/eslintrc@npm:2.1.1" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -10786,14 +10786,14 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: d5ed0adbe23f6571d8c9bb0ca6edf7618dc6aed4046aa56df7139f65ae7b578874e0d9c796df784c25bda648ceb754b6320277d828c8b004876d7443b8dc018c + checksum: bf909ea183d27238c257a82d4ffdec38ca94b906b4b8dfae02ecbe7ecc9e5a8182ef5e469c808bb8cb4fea4750f43ac4ca7c4b4a167b6cd7e3aaacd386b2bd25 languageName: node linkType: hard -"@eslint/js@npm:8.44.0": - version: 8.44.0 - resolution: "@eslint/js@npm:8.44.0" - checksum: fc539583226a28f5677356e9f00d2789c34253f076643d2e32888250e509a4e13aafe0880cb2425139051de0f3a48d25bfc5afa96b7304f203b706c17340e3cf +"@eslint/js@npm:^8.46.0": + version: 8.46.0 + resolution: "@eslint/js@npm:8.46.0" + checksum: 7aed479832302882faf5bec37e9d068f270f84c19b3fb529646a7c1b031e73a312f730569c78806492bc09cfce3d7651dfab4ce09a56cbb06bc6469449e56377 languageName: node linkType: hard @@ -19160,7 +19160,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.10.1, ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.5.5, ajv@npm:^6.7.0, ajv@npm:~6.12.6": +"ajv@npm:^6.10.1, ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.5.5, ajv@npm:^6.7.0, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -24763,13 +24763,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.0": - version: 7.2.0 - resolution: "eslint-scope@npm:7.2.0" +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: 64591a2d8b244ade9c690b59ef238a11d5c721a98bcee9e9f445454f442d03d3e04eda88e95a4daec558220a99fa384309d9faae3d459bd40e7a81b4063980ae + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e languageName: node linkType: hard @@ -24791,10 +24791,10 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": - version: 3.4.1 - resolution: "eslint-visitor-keys@npm:3.4.1" - checksum: f05121d868202736b97de7d750847a328fcfa8593b031c95ea89425333db59676ac087fa905eba438d0a3c5769632f828187e0c1a0d271832a2153c1d3661c2c +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.2": + version: 3.4.2 + resolution: "eslint-visitor-keys@npm:3.4.2" + checksum: 9e0e7e4aaea705c097ae37c97410e5f167d4d2193be2edcb1f0760762ede3df01545e4820ae314f42dcec687745f2c6dcaf6d83575c4a2a241eb0c8517d724f2 languageName: node linkType: hard @@ -24815,25 +24815,25 @@ __metadata: linkType: hard "eslint@npm:^8.33.0, eslint@npm:^8.6.0": - version: 8.44.0 - resolution: "eslint@npm:8.44.0" + version: 8.46.0 + resolution: "eslint@npm:8.46.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.4.0 - "@eslint/eslintrc": ^2.1.0 - "@eslint/js": 8.44.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.1 + "@eslint/js": ^8.46.0 "@humanwhocodes/config-array": ^0.11.10 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 + ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.0 - eslint-visitor-keys: ^3.4.1 - espree: ^9.6.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.2 + espree: ^9.6.1 esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 @@ -24843,7 +24843,6 @@ __metadata: globals: ^13.19.0 graphemer: ^1.4.0 ignore: ^5.2.0 - import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 @@ -24855,11 +24854,10 @@ __metadata: natural-compare: ^1.4.0 optionator: ^0.9.3 strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: d06309ce4aafb9d27d558c8e5e5aa5cba3bbec3ce8ceccbc7d4b7a35f2b67fd40189159155553270e2e6febeb69bd8a3b60d6241c8f5ddc2ef1702ccbd328501 + checksum: 7a7d36b1a3bbc12e08fbb5bc36fd482a7a5a1797e62e762499dd45601b9e45aaa53a129f31ce0b4444551a9639b8b681ad535f379893dd1e3ae37b31dccd82aa languageName: node linkType: hard @@ -24870,14 +24868,14 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.0.0, espree@npm:^9.6.0": - version: 9.6.0 - resolution: "espree@npm:9.6.0" +"espree@npm:^9.0.0, espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" dependencies: acorn: ^8.9.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.4.1 - checksum: 1287979510efb052a6a97c73067ea5d0a40701b29adde87bbe2d3eb1667e39ca55e8129e20e2517fed3da570150e7ef470585228459a8f3e3755f45007a1c662 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 languageName: node linkType: hard @@ -27874,7 +27872,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1": version: 3.2.1 resolution: "import-fresh@npm:3.2.1" dependencies: From 586402b75ca0ce53ccdbfc2917bb2da816bfd37b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 02:01:44 +0000 Subject: [PATCH 201/440] chore(deps): update helm/kind-action action to v1.8.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/verify_e2e-kubernetes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify_e2e-kubernetes.yml b/.github/workflows/verify_e2e-kubernetes.yml index c05339f595..49fc8f0aa1 100644 --- a/.github/workflows/verify_e2e-kubernetes.yml +++ b/.github/workflows/verify_e2e-kubernetes.yml @@ -35,7 +35,7 @@ jobs: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} - name: bootstrap kind - uses: helm/kind-action@v1.7.0 + uses: helm/kind-action@v1.8.0 - name: kubernetes test working-directory: packages/backend-common From cef344c45c0c2a0de6b955325f7758d6ade921c9 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 4 Aug 2023 09:40:23 +0530 Subject: [PATCH 202/440] Limit the use of the same shortcut name and url when adding a shortcut fixed review changes Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 4384f1c061..6085c6c182 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -15,6 +15,7 @@ */ import React, { useEffect } from 'react'; +import useObservable from 'react-use/lib/useObservable'; import { useForm, SubmitHandler, Controller } from 'react-hook-form'; import { Button, @@ -53,7 +54,10 @@ export const ShortcutForm = ({ }: Props) => { const classes = useStyles(); const shortcutApi = useApi(shortcutsApiRef); - const shortcutData = shortcutApi.get(); + const shortcutData = useObservable( + shortcutApi.shortcut$(), + shortcutApi.get(), + ); const { handleSubmit, reset, @@ -67,13 +71,13 @@ export const ShortcutForm = ({ }, }); - const titleIsUnique = async (title: string) => { + const titleIsUnique = (title: string) => { if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) return 'A shortcut with this title already exists'; return true; }; - const urlIsUnique = async (url: string) => { + const urlIsUnique = (url: string) => { if (shortcutData.some(shortcutUrl => shortcutUrl.url === url)) return 'A shortcut with this url already exists'; return true; From 16e4c6bfb123208cca0a91f17316be5d5100edc2 Mon Sep 17 00:00:00 2001 From: AmbrishRamachandiran Date: Fri, 4 Aug 2023 09:57:31 +0530 Subject: [PATCH 203/440] Limit the use of the same shortcut name and url when adding a shortcut fixed review changes Signed-off-by: AmbrishRamachandiran --- plugins/shortcuts/src/ShortcutForm.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/shortcuts/src/ShortcutForm.tsx b/plugins/shortcuts/src/ShortcutForm.tsx index 6085c6c182..e8cd8144d0 100644 --- a/plugins/shortcuts/src/ShortcutForm.tsx +++ b/plugins/shortcuts/src/ShortcutForm.tsx @@ -71,13 +71,13 @@ export const ShortcutForm = ({ }, }); - const titleIsUnique = (title: string) => { + const titleIsUnique = (title: string) => { if (shortcutData.some(shortcutTitle => shortcutTitle.title === title)) return 'A shortcut with this title already exists'; return true; }; - const urlIsUnique = (url: string) => { + const urlIsUnique = (url: string) => { if (shortcutData.some(shortcutUrl => shortcutUrl.url === url)) return 'A shortcut with this url already exists'; return true; From aa3feedce10a78dd87a7e2bc8fc1678e14502bd4 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Tue, 1 Aug 2023 08:50:11 +0300 Subject: [PATCH 204/440] feat: allow specifying breakpoint for catalog filters This feature allows app developers to specify breakpoint when catalog filters are moved under drawer instead having hard-coded 'md' breakpoint for that. Signed-off-by: Heikki Hellgren --- .changeset/sour-hats-kick.md | 5 +++++ plugins/catalog-react/api-report.md | 8 +++++++- .../CatalogFilterLayout/CatalogFilterLayout.tsx | 16 +++++++++++----- plugins/catalog/api-report.md | 17 ++++++++++++++++- 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 .changeset/sour-hats-kick.md diff --git a/.changeset/sour-hats-kick.md b/.changeset/sour-hats-kick.md new file mode 100644 index 0000000000..023cfff0f4 --- /dev/null +++ b/.changeset/sour-hats-kick.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Allow specifying screen size when catalog filters are hidden in drawer diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md index 9bf87778dd..b5ab8b6c7f 100644 --- a/plugins/catalog-react/api-report.md +++ b/plugins/catalog-react/api-report.md @@ -63,7 +63,13 @@ export const catalogApiRef: ApiRef; // @public (undocumented) export const CatalogFilterLayout: { (props: { children: React_2.ReactNode }): JSX.Element; - Filters: (props: { children: React_2.ReactNode }) => JSX.Element; + Filters: (props: { + children: React_2.ReactNode; + options?: { + drawerBreakpoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number; + drawerAnchor?: 'left' | 'right' | 'top' | 'bottom'; + }; + }) => JSX.Element; Content: (props: { children: React_2.ReactNode }) => JSX.Element; }; diff --git a/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx b/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx index 751eb35f1d..1a1404edf2 100644 --- a/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx +++ b/plugins/catalog-react/src/components/CatalogFilterLayout/CatalogFilterLayout.tsx @@ -28,14 +28,20 @@ import FilterListIcon from '@material-ui/icons/FilterList'; import { BackstageTheme } from '@backstage/theme'; /** @public */ -export const Filters = (props: { children: React.ReactNode }) => { - const isMidSizeScreen = useMediaQuery(theme => - theme.breakpoints.down('md'), +export const Filters = (props: { + children: React.ReactNode; + options?: { + drawerBreakpoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number; + drawerAnchor?: 'left' | 'right' | 'top' | 'bottom'; + }; +}) => { + const isScreenSmallerThanBreakpoint = useMediaQuery(theme => + theme.breakpoints.down(props.options?.drawerBreakpoint ?? 'md'), ); const theme = useTheme(); const [filterDrawerOpen, setFilterDrawerOpen] = useState(false); - return isMidSizeScreen ? ( + return isScreenSmallerThanBreakpoint ? ( <>